{"openapi":"3.1.0","info":{"title":"AstroWay Calculation API","version":"2.296.18","description":"Professional astrology calculation API powered by Swiss Ephemeris. Compute natal charts, synastry, progressions, directions, transits, Human Design, and 80+ other calculation types via a simple REST API.","contact":{"url":"https://app.astroway.info"}},"servers":[{"url":"https://api.astroway.info/v1","description":"Production"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-Api-Key","description":"API key for authentication. Include in X-Api-Key header."}},"schemas":{"ChartInput":{"type":"object","properties":{"date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"time":{"type":"string","pattern":"^\\d{2}:\\d{2}(:\\d{2})?$"},"timezoneOffset":{"type":"number","nullable":true,"minimum":-14,"maximum":14,"default":0,"description":"Hours from UTC at the given moment, not minutes. Fractional zones are hours too: 5.5 for India, 5.75 for Nepal, -3.5 for Newfoundland. Defaults to 0, meaning UTC. Ignored when timezone is sent."},"timezone":{"type":"string","example":"Europe/Kyiv","description":"IANA zone name such as Europe/Kyiv, or auto to look the zone up from latitude and longitude. The server takes the offset that zone kept at this local date and time, summer time included, and uses it in place of timezoneOffset. A clock time that happened twice takes the first occurrence; one skipped when clocks went forward takes the offset from before the change. Abbreviations such as EST are refused. Before 1970 the tz database is not reliable for every place, so send timezoneOffset when the local clock is known."},"latitude":{"type":"number","minimum":-90,"maximum":90},"longitude":{"type":"number","minimum":-180,"maximum":180},"houseSystem":{"type":"string","enum":["P","K","R","C","E","W","B","M","O","A","T","V","D","F","G","H","I","i","L","N","Q","S","U","X","Y"],"default":"P"},"name":{"type":"string","default":""},"city":{"type":"string","default":""},"zodiacType":{"type":"string","enum":["tropical","sidereal"]},"ayanamsaId":{"type":"number","nullable":true},"ayanamsa":{"type":"string","enum":["fagan-bradley","lahiri","de-luce","raman","krishnamurti","kp","yukteshwar","jn-bhasin","true-citra","djwhal-khul"],"description":"Sidereal school by name. Lahiri when omitted. Equivalent to ayanamsaId; send either."},"cosmogram":{"type":"boolean"}},"required":["date","time","latitude","longitude"],"additionalProperties":{"nullable":true},"description":"Birth data for a single natal chart. Required: date (YYYY-MM-DD), time (HH:mm:ss), latitude and longitude in decimal degrees. The short forms lat, lon, lng and tz are rejected with 400 INVALID_FIELD; pass the full names. timezoneOffset is hours from UTC and defaults to 0, meaning UTC; send timezone instead (an IANA name such as Europe/Kyiv, or auto) and the offset for that date is worked out, summer time included. city is a display label only: nothing here geocodes it, so it never stands in for coordinates. houseSystem is a single Swiss Ephemeris letter, P by default; a name such as \"Placidus\" is refused, and the case matters because I and i are two different Sunshine systems."},"EmptyBody":{"type":"object","properties":{},"description":"This endpoint reads nothing from the request body. Send {} (or any object, which is ignored)."},"WhitelabelConfigPatch":{"type":"object","properties":{"primaryColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"secondaryColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"fontFamily":{"type":"string","minLength":1,"maxLength":64},"footerText":{"type":"string","nullable":true,"maxLength":500},"customDomain":{"type":"string","nullable":true,"maxLength":255,"pattern":"^([a-z0-9-]+\\.)+[a-z]{2,}$/i"},"companyName":{"type":"string","nullable":true,"minLength":1,"maxLength":80},"companyUrl":{"type":"string","nullable":true,"maxLength":255,"format":"uri"},"companyEmail":{"type":"string","nullable":true,"maxLength":120,"format":"email"},"companyMobile":{"type":"string","nullable":true,"maxLength":40},"companyBio":{"type":"string","nullable":true,"maxLength":500},"reportName":{"type":"string","nullable":true,"minLength":1,"maxLength":80}}},"ThemedReport":{"type":"object","properties":{"chart":{"allOf":[{"$ref":"#/components/schemas/ChartInput"},{"type":"object","properties":{"latitude":{"type":"number","minimum":-90,"maximum":90,"description":"Birth latitude. Required here: the whole document is computed from it."},"longitude":{"type":"number","minimum":-180,"maximum":180,"description":"Birth longitude. Required here: the whole document is computed from it."}},"additionalProperties":{"nullable":true}}],"description":"Birth data for a single natal chart. Required: date (YYYY-MM-DD), time (HH:mm:ss), latitude and longitude in decimal degrees. The short forms lat, lon, lng and tz are rejected with 400 INVALID_FIELD; pass the full names. timezoneOffset is hours from UTC and defaults to 0, meaning UTC; send timezone instead (an IANA name such as Europe/Kyiv, or auto) and the offset for that date is worked out, summer time included. city is a display label only: nothing here geocodes it, so it never stands in for coordinates. houseSystem is a single Swiss Ephemeris letter, P by default; a name such as \"Placidus\" is refused, and the case matters because I and i are two different Sunshine systems."},"language":{"type":"string","enum":["uk","en","de","ru","pl","es","pt","hi","fr","ko","it","ja","id","tr","nl","ro","cs","vi","ar","el","hu"]},"whitelabel":{"anyOf":[{"type":"boolean"},{"type":"object","properties":{"companyName":{"type":"string","minLength":1,"maxLength":80},"companyUrl":{"type":"string","format":"uri"},"companyEmail":{"type":"string","format":"email"},"companyMobile":{"type":"string","maxLength":40},"companyBio":{"type":"string","maxLength":500},"logoUrl":{"type":"string","format":"uri"},"frontImage":{"type":"string","format":"uri"},"textPrimaryColor":{"type":"string","pattern":"^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$"},"textSecondaryColor":{"type":"string","pattern":"^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$"},"backgroundColor":{"type":"string","pattern":"^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$"},"themeColor":{"type":"string","pattern":"^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$","description":"Accent colour, used for section heading text and inline emphasis."},"headingColor":{"type":"string","pattern":"^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$","description":"Colour of the divider rule under each section heading (not the heading text, which is themeColor)."},"footerText":{"type":"string","maxLength":200},"fontPairing":{"type":"string","enum":["serif-sans","sans-serif","serif-only","sans-only","system"]},"reportName":{"type":"string","minLength":1,"maxLength":80}},"additionalProperties":false}]}},"required":["chart"]},"DestinyMatrixLadini":{"type":"object","properties":{"date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}},"required":["date"]},"KabbalahGematria":{"type":"object","properties":{"text":{"type":"string","minLength":1,"maxLength":500}},"required":["text"]},"HoraryViaCombusta":{"type":"object","properties":{"moonLongitude":{"type":"number","nullable":true}},"required":["moonLongitude"]},"BaziDecade":{"type":"object","properties":{"startYear":{"type":"integer","minimum":1900,"maximum":2100},"language":{"type":"string"}},"required":["startYear"]},"WellnessDate":{"type":"object","properties":{"date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}},"required":["date"]},"EsotericDecodeBody":{"type":"object","properties":{"sequence":{"type":"string","minLength":1,"maxLength":8,"pattern":"^\\d+$"},"context":{"type":"string","maxLength":200}},"required":["sequence"]},"EsotericDreamDecodeBody":{"type":"object","properties":{"text":{"type":"string","minLength":3,"maxLength":2000},"recurring":{"type":"boolean","default":false}},"required":["text"]},"EsotericRecommendBody":{"type":"object","properties":{"sunSign":{"type":"string","minLength":3},"moonSign":{"type":"string","minLength":3},"ascendantSign":{"type":"string","minLength":3},"intent":{"type":"string","minLength":2,"maxLength":80},"limit":{"type":"integer","minimum":1,"maximum":20,"default":5}}},"ZiweiDateInput":{"type":"object","properties":{"date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"time":{"type":"string","pattern":"^\\d{2}:\\d{2}(:\\d{2})?$"},"timezoneOffset":{"type":"number","minimum":-14,"maximum":14,"description":"Ignored when timezone is sent."},"timezone":{"type":"string","example":"Europe/Kyiv","description":"IANA zone name such as Europe/Kyiv, or auto to look the zone up from latitude and longitude. The server takes the offset that zone kept at this local date and time, summer time included, and uses it in place of timezoneOffset. A clock time that happened twice takes the first occurrence; one skipped when clocks went forward takes the offset from before the change. Abbreviations such as EST are refused. Before 1970 the tz database is not reliable for every place, so send timezoneOffset when the local clock is known."}},"required":["date"]},"ZiweiSihuaInput":{"type":"object","properties":{"date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"time":{"type":"string","pattern":"^\\d{2}:\\d{2}(:\\d{2})?$"},"timezoneOffset":{"type":"number","minimum":-14,"maximum":14,"description":"Ignored when timezone is sent."},"timezone":{"type":"string","example":"Europe/Kyiv","description":"IANA zone name such as Europe/Kyiv, or auto to look the zone up from latitude and longitude. The server takes the offset that zone kept at this local date and time, summer time included, and uses it in place of timezoneOffset. A clock time that happened twice takes the first occurrence; one skipped when clocks went forward takes the offset from before the change. Abbreviations such as EST are refused. Before 1970 the tz database is not reliable for every place, so send timezoneOffset when the local clock is known."},"school":{"type":"string","enum":["zhongzhou","quanji","quanshu","beipai"]}},"required":["date"]},"ZiweiChartInput":{"type":"object","properties":{"date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"time":{"type":"string","pattern":"^\\d{2}:\\d{2}(:\\d{2})?$"},"timezoneOffset":{"type":"number","minimum":-14,"maximum":14,"description":"Ignored when timezone is sent."},"timezone":{"type":"string","example":"Europe/Kyiv","description":"IANA zone name such as Europe/Kyiv, or auto to look the zone up from latitude and longitude. The server takes the offset that zone kept at this local date and time, summer time included, and uses it in place of timezoneOffset. A clock time that happened twice takes the first occurrence; one skipped when clocks went forward takes the offset from before the change. Abbreviations such as EST are refused. Before 1970 the tz database is not reliable for every place, so send timezoneOffset when the local clock is known."},"longitude":{"type":"number","minimum":-180,"maximum":180},"trueSolarTime":{"type":"boolean"},"gender":{"type":"string","enum":["male","female"]},"school":{"type":"string","enum":["zhongzhou","quanji","quanshu","beipai"]},"yearDivide":{"type":"string","enum":["lunar","lichun"]},"fixLeap":{"type":"boolean"},"dayDivide":{"type":"string","enum":["forward","current"]},"tianmaSchool":{"type":"string","enum":["year","month"]},"age":{"type":"integer","minimum":1,"maximum":120},"language":{"type":"string"}},"required":["date","time","gender"]},"BaziDateInput":{"type":"object","properties":{"date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"time":{"type":"string","pattern":"^\\d{2}:\\d{2}(:\\d{2})?$"},"timezoneOffset":{"type":"number","minimum":-14,"maximum":14,"description":"Ignored when timezone is sent."},"timezone":{"type":"string","example":"Europe/Kyiv","description":"IANA zone name such as Europe/Kyiv, or auto to look the zone up from latitude and longitude. The server takes the offset that zone kept at this local date and time, summer time included, and uses it in place of timezoneOffset. A clock time that happened twice takes the first occurrence; one skipped when clocks went forward takes the offset from before the change. Abbreviations such as EST are refused. Before 1970 the tz database is not reliable for every place, so send timezoneOffset when the local clock is known."},"language":{"type":"string"}},"required":["date"]},"BaziFourPillarsInput":{"type":"object","properties":{"date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"time":{"type":"string","pattern":"^\\d{2}:\\d{2}(:\\d{2})?$"},"timezoneOffset":{"type":"number","minimum":-14,"maximum":14,"description":"Ignored when timezone is sent."},"timezone":{"type":"string","example":"Europe/Kyiv","description":"IANA zone name such as Europe/Kyiv, or auto to look the zone up from latitude and longitude. The server takes the offset that zone kept at this local date and time, summer time included, and uses it in place of timezoneOffset. A clock time that happened twice takes the first occurrence; one skipped when clocks went forward takes the offset from before the change. Abbreviations such as EST are refused. Before 1970 the tz database is not reliable for every place, so send timezoneOffset when the local clock is known."},"language":{"type":"string"}},"required":["date"]},"BaziBirthInput":{"type":"object","properties":{"date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"time":{"type":"string","pattern":"^\\d{2}:\\d{2}(:\\d{2})?$"},"timezoneOffset":{"type":"number","minimum":-14,"maximum":14,"description":"Ignored when timezone is sent."},"timezone":{"type":"string","example":"Europe/Kyiv","description":"IANA zone name such as Europe/Kyiv, or auto to look the zone up from latitude and longitude. The server takes the offset that zone kept at this local date and time, summer time included, and uses it in place of timezoneOffset. A clock time that happened twice takes the first occurrence; one skipped when clocks went forward takes the offset from before the change. Abbreviations such as EST are refused. Before 1970 the tz database is not reliable for every place, so send timezoneOffset when the local clock is known."},"longitude":{"type":"number","minimum":-180,"maximum":180},"trueSolarTime":{"type":"boolean"},"dayBoundary":{"type":"string","enum":["23:00","midnight"]},"language":{"type":"string"}},"required":["date"]},"BaziChartInput":{"type":"object","properties":{"date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"time":{"type":"string","pattern":"^\\d{2}:\\d{2}(:\\d{2})?$"},"timezoneOffset":{"type":"number","minimum":-14,"maximum":14,"description":"Ignored when timezone is sent."},"timezone":{"type":"string","example":"Europe/Kyiv","description":"IANA zone name such as Europe/Kyiv, or auto to look the zone up from latitude and longitude. The server takes the offset that zone kept at this local date and time, summer time included, and uses it in place of timezoneOffset. A clock time that happened twice takes the first occurrence; one skipped when clocks went forward takes the offset from before the change. Abbreviations such as EST are refused. Before 1970 the tz database is not reliable for every place, so send timezoneOffset when the local clock is known."},"longitude":{"type":"number","minimum":-180,"maximum":180},"trueSolarTime":{"type":"boolean"},"dayBoundary":{"type":"string","enum":["23:00","midnight"]},"language":{"type":"string"},"stageSchool":{"type":"string","enum":["classical","unified"]},"includeFullTable":{"type":"boolean"},"includeLuck":{"type":"boolean"},"gender":{"type":"string","enum":["male","female"]}},"required":["date"]},"ChineseTrueSolarTimeInput":{"type":"object","properties":{"date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"time":{"type":"string","pattern":"^\\d{2}:\\d{2}(:\\d{2})?$"},"timezoneOffset":{"type":"number","minimum":-14,"maximum":14,"description":"Ignored when timezone is sent."},"timezone":{"type":"string","example":"Europe/Kyiv","description":"IANA zone name such as Europe/Kyiv, or auto to look the zone up from latitude and longitude. The server takes the offset that zone kept at this local date and time, summer time included, and uses it in place of timezoneOffset. A clock time that happened twice takes the first occurrence; one skipped when clocks went forward takes the offset from before the change. Abbreviations such as EST are refused. Before 1970 the tz database is not reliable for every place, so send timezoneOffset when the local clock is known."},"longitude":{"type":"number","minimum":-180,"maximum":180},"language":{"type":"string"}},"required":["date","time","timezoneOffset","longitude"]},"BaziHourInput":{"type":"object","properties":{"date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"time":{"type":"string","pattern":"^\\d{2}:\\d{2}(:\\d{2})?$"},"timezoneOffset":{"type":"number","minimum":-14,"maximum":14,"default":8,"description":"Ignored when timezone is sent."},"timezone":{"type":"string","example":"Europe/Kyiv","description":"IANA zone name such as Europe/Kyiv, or auto to look the zone up from latitude and longitude. The server takes the offset that zone kept at this local date and time, summer time included, and uses it in place of timezoneOffset. A clock time that happened twice takes the first occurrence; one skipped when clocks went forward takes the offset from before the change. Abbreviations such as EST are refused. Before 1970 the tz database is not reliable for every place, so send timezoneOffset when the local clock is known."},"language":{"type":"string"}},"required":["date","time"]},"BaziLuckPillarsInput":{"type":"object","properties":{"date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"time":{"type":"string","pattern":"^\\d{2}:\\d{2}(:\\d{2})?$"},"timezoneOffset":{"type":"number","minimum":-14,"maximum":14,"description":"Ignored when timezone is sent."},"timezone":{"type":"string","example":"Europe/Kyiv","description":"IANA zone name such as Europe/Kyiv, or auto to look the zone up from latitude and longitude. The server takes the offset that zone kept at this local date and time, summer time included, and uses it in place of timezoneOffset. A clock time that happened twice takes the first occurrence; one skipped when clocks went forward takes the offset from before the change. Abbreviations such as EST are refused. Before 1970 the tz database is not reliable for every place, so send timezoneOffset when the local clock is known."},"longitude":{"type":"number","minimum":-180,"maximum":180},"trueSolarTime":{"type":"boolean"},"dayBoundary":{"type":"string","enum":["23:00","midnight"]},"language":{"type":"string"},"gender":{"type":"string","enum":["male","female"]},"count":{"type":"integer","minimum":1,"maximum":10,"default":8}},"required":["date","gender"]},"BaziMonthlyInput":{"type":"object","properties":{"natalDate":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"natalTime":{"type":"string","pattern":"^\\d{2}:\\d{2}(:\\d{2})?$"},"natalTzOffset":{"type":"number","minimum":-14,"maximum":14,"description":"Ignored when timezone is sent."},"timezone":{"type":"string","example":"Europe/Kyiv","description":"IANA zone name such as Europe/Kyiv, or auto to look the zone up from latitude and longitude. The server takes the offset that zone kept at this local date and time, summer time included, and uses it in place of timezoneOffset. A clock time that happened twice takes the first occurrence; one skipped when clocks went forward takes the offset from before the change. Abbreviations such as EST are refused. Before 1970 the tz database is not reliable for every place, so send timezoneOffset when the local clock is known."},"longitude":{"type":"number","minimum":-180,"maximum":180},"trueSolarTime":{"type":"boolean"},"dayBoundary":{"type":"string","enum":["23:00","midnight"]},"targetYear":{"type":"integer","minimum":1900,"maximum":2100},"targetMonth":{"type":"integer","minimum":1,"maximum":12},"language":{"type":"string"}},"required":["natalDate","targetYear","targetMonth"]},"BaziTenGodsInput":{"type":"object","properties":{"date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"time":{"type":"string","pattern":"^\\d{2}:\\d{2}(:\\d{2})?$"},"timezoneOffset":{"type":"number","minimum":-14,"maximum":14,"description":"Ignored when timezone is sent."},"timezone":{"type":"string","example":"Europe/Kyiv","description":"IANA zone name such as Europe/Kyiv, or auto to look the zone up from latitude and longitude. The server takes the offset that zone kept at this local date and time, summer time included, and uses it in place of timezoneOffset. A clock time that happened twice takes the first occurrence; one skipped when clocks went forward takes the offset from before the change. Abbreviations such as EST are refused. Before 1970 the tz database is not reliable for every place, so send timezoneOffset when the local clock is known."},"longitude":{"type":"number","minimum":-180,"maximum":180},"trueSolarTime":{"type":"boolean"},"dayBoundary":{"type":"string","enum":["23:00","midnight"]},"language":{"type":"string"}},"required":["date"]},"BaziYearlyInput":{"type":"object","properties":{"natalDate":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"natalTime":{"type":"string","pattern":"^\\d{2}:\\d{2}(:\\d{2})?$"},"natalTzOffset":{"type":"number","minimum":-14,"maximum":14,"description":"Ignored when timezone is sent."},"timezone":{"type":"string","example":"Europe/Kyiv","description":"IANA zone name such as Europe/Kyiv, or auto to look the zone up from latitude and longitude. The server takes the offset that zone kept at this local date and time, summer time included, and uses it in place of timezoneOffset. A clock time that happened twice takes the first occurrence; one skipped when clocks went forward takes the offset from before the change. Abbreviations such as EST are refused. Before 1970 the tz database is not reliable for every place, so send timezoneOffset when the local clock is known."},"longitude":{"type":"number","minimum":-180,"maximum":180},"trueSolarTime":{"type":"boolean"},"dayBoundary":{"type":"string","enum":["23:00","midnight"]},"targetYear":{"type":"integer","minimum":1900,"maximum":2100},"gender":{"type":"string","enum":["male","female"]},"includeMonths":{"type":"boolean"},"language":{"type":"string"}},"required":["natalDate","targetYear"]},"WellnessCycleInput":{"type":"object","properties":{"birthDate":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"targetDate":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}},"required":["birthDate"]},"WellnessSignFromChartInput":{"type":"object","properties":{"date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"time":{"type":"string","pattern":"^\\d{2}:\\d{2}(:\\d{2})?$"},"timezoneOffset":{"type":"number","nullable":true,"minimum":-14,"maximum":14,"default":0,"description":"Hours from UTC at the given moment, not minutes. Fractional zones are hours too: 5.5 for India, 5.75 for Nepal, -3.5 for Newfoundland. Defaults to 0, meaning UTC. Ignored when timezone is sent."},"timezone":{"type":"string","example":"Europe/Kyiv","description":"IANA zone name such as Europe/Kyiv, or auto to look the zone up from latitude and longitude. The server takes the offset that zone kept at this local date and time, summer time included, and uses it in place of timezoneOffset. A clock time that happened twice takes the first occurrence; one skipped when clocks went forward takes the offset from before the change. Abbreviations such as EST are refused. Before 1970 the tz database is not reliable for every place, so send timezoneOffset when the local clock is known."},"latitude":{"type":"number","minimum":-90,"maximum":90},"longitude":{"type":"number","minimum":-180,"maximum":180},"houseSystem":{"type":"string","enum":["P","K","R","C","E","W","B","M","O","A","T","V","D","F","G","H","I","i","L","N","Q","S","U","X","Y"],"default":"P"},"name":{"type":"string","default":""},"city":{"type":"string","default":""},"zodiacType":{"type":"string","enum":["tropical","sidereal"]},"ayanamsaId":{"type":"number","nullable":true},"ayanamsa":{"type":"string","enum":["fagan-bradley","lahiri","de-luce","raman","krishnamurti","kp","yukteshwar","jn-bhasin","true-citra","djwhal-khul"],"description":"Sidereal school by name. Lahiri when omitted. Equivalent to ayanamsaId; send either."},"cosmogram":{"type":"boolean"}},"required":["date","time","latitude","longitude"],"additionalProperties":{"nullable":true},"description":"Birth data for a single natal chart. Required: date (YYYY-MM-DD), time (HH:mm:ss), latitude and longitude in decimal degrees. The short forms lat, lon, lng and tz are rejected with 400 INVALID_FIELD; pass the full names. timezoneOffset is hours from UTC and defaults to 0, meaning UTC; send timezone instead (an IANA name such as Europe/Kyiv, or auto) and the offset for that date is worked out, summer time included. city is a display label only: nothing here geocodes it, so it never stands in for coordinates. houseSystem is a single Swiss Ephemeris letter, P by default; a name such as \"Placidus\" is refused, and the case matters because I and i are two different Sunshine systems."},"FinancialDate":{"type":"object","properties":{"date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}},"required":["date"]},"MayanDateOnlyInput":{"type":"object","properties":{"date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}},"required":["date"]},"MayanPairInput":{"type":"object","properties":{"person1":{"type":"object","properties":{"date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}},"required":["date"]},"person2":{"type":"object","properties":{"date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}},"required":["date"]}},"required":["person1","person2"]},"FinancialFinancialInput":{"type":"object","properties":{"date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"time":{"type":"string","pattern":"^\\d{2}:\\d{2}(:\\d{2})?$"},"timezoneOffset":{"type":"number","nullable":true,"minimum":-14,"maximum":14,"default":0,"description":"Hours from UTC at the given moment, not minutes. Fractional zones are hours too: 5.5 for India, 5.75 for Nepal, -3.5 for Newfoundland. Defaults to 0, meaning UTC. Ignored when timezone is sent."},"timezone":{"type":"string","example":"Europe/Kyiv","description":"IANA zone name such as Europe/Kyiv, or auto to look the zone up from latitude and longitude. The server takes the offset that zone kept at this local date and time, summer time included, and uses it in place of timezoneOffset. A clock time that happened twice takes the first occurrence; one skipped when clocks went forward takes the offset from before the change. Abbreviations such as EST are refused. Before 1970 the tz database is not reliable for every place, so send timezoneOffset when the local clock is known."},"latitude":{"type":"number","minimum":-90,"maximum":90},"longitude":{"type":"number","minimum":-180,"maximum":180},"houseSystem":{"type":"string","enum":["P","K","R","C","E","W","B","M","O","A","T","V","D","F","G","H","I","i","L","N","Q","S","U","X","Y"],"default":"P"},"name":{"type":"string","default":""},"city":{"type":"string","default":""},"zodiacType":{"type":"string","enum":["tropical","sidereal"]},"ayanamsaId":{"type":"number","nullable":true},"ayanamsa":{"type":"string","enum":["fagan-bradley","lahiri","de-luce","raman","krishnamurti","kp","yukteshwar","jn-bhasin","true-citra","djwhal-khul"],"description":"Sidereal school by name. Lahiri when omitted. Equivalent to ayanamsaId; send either."},"cosmogram":{"type":"boolean"}},"required":["date","time","latitude","longitude"],"additionalProperties":{"nullable":true},"description":"Birth data for a single natal chart. Required: date (YYYY-MM-DD), time (HH:mm:ss), latitude and longitude in decimal degrees. The short forms lat, lon, lng and tz are rejected with 400 INVALID_FIELD; pass the full names. timezoneOffset is hours from UTC and defaults to 0, meaning UTC; send timezone instead (an IANA name such as Europe/Kyiv, or auto) and the offset for that date is worked out, summer time included. city is a display label only: nothing here geocodes it, so it never stands in for coordinates. houseSystem is a single Swiss Ephemeris letter, P by default; a name such as \"Placidus\" is refused, and the case matters because I and i are two different Sunshine systems."},"BusinessBusinessInput":{"type":"object","properties":{"date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"time":{"type":"string","pattern":"^\\d{2}:\\d{2}(:\\d{2})?$"},"timezoneOffset":{"type":"number","nullable":true,"minimum":-14,"maximum":14,"default":0,"description":"Hours from UTC at the given moment, not minutes. Fractional zones are hours too: 5.5 for India, 5.75 for Nepal, -3.5 for Newfoundland. Defaults to 0, meaning UTC. Ignored when timezone is sent."},"timezone":{"type":"string","example":"Europe/Kyiv","description":"IANA zone name such as Europe/Kyiv, or auto to look the zone up from latitude and longitude. The server takes the offset that zone kept at this local date and time, summer time included, and uses it in place of timezoneOffset. A clock time that happened twice takes the first occurrence; one skipped when clocks went forward takes the offset from before the change. Abbreviations such as EST are refused. Before 1970 the tz database is not reliable for every place, so send timezoneOffset when the local clock is known."},"latitude":{"type":"number","minimum":-90,"maximum":90},"longitude":{"type":"number","minimum":-180,"maximum":180},"houseSystem":{"type":"string","enum":["P","K","R","C","E","W","B","M","O","A","T","V","D","F","G","H","I","i","L","N","Q","S","U","X","Y"],"default":"P"},"name":{"type":"string","default":""},"city":{"type":"string","default":""},"zodiacType":{"type":"string","enum":["tropical","sidereal"]},"ayanamsaId":{"type":"number","nullable":true},"ayanamsa":{"type":"string","enum":["fagan-bradley","lahiri","de-luce","raman","krishnamurti","kp","yukteshwar","jn-bhasin","true-citra","djwhal-khul"],"description":"Sidereal school by name. Lahiri when omitted. Equivalent to ayanamsaId; send either."},"cosmogram":{"type":"boolean"}},"required":["date","time","latitude","longitude"],"additionalProperties":{"nullable":true},"description":"Birth data for a single natal chart. Required: date (YYYY-MM-DD), time (HH:mm:ss), latitude and longitude in decimal degrees. The short forms lat, lon, lng and tz are rejected with 400 INVALID_FIELD; pass the full names. timezoneOffset is hours from UTC and defaults to 0, meaning UTC; send timezone instead (an IANA name such as Europe/Kyiv, or auto) and the offset for that date is worked out, summer time included. city is a display label only: nothing here geocodes it, so it never stands in for coordinates. houseSystem is a single Swiss Ephemeris letter, P by default; a name such as \"Placidus\" is refused, and the case matters because I and i are two different Sunshine systems."},"PetNameInput":{"allOf":[{"$ref":"#/components/schemas/ChartInput"},{"type":"object","properties":{"gender":{"type":"string","enum":["masculine","feminine"]}},"additionalProperties":{"nullable":true}}],"description":"Birth data for a single natal chart. Required: date (YYYY-MM-DD), time (HH:mm:ss), latitude and longitude in decimal degrees. The short forms lat, lon, lng and tz are rejected with 400 INVALID_FIELD; pass the full names. timezoneOffset is hours from UTC and defaults to 0, meaning UTC; send timezone instead (an IANA name such as Europe/Kyiv, or auto) and the offset for that date is worked out, summer time included. city is a display label only: nothing here geocodes it, so it never stands in for coordinates. houseSystem is a single Swiss Ephemeris letter, P by default; a name such as \"Placidus\" is refused, and the case matters because I and i are two different Sunshine systems."},"PetPairInput":{"type":"object","properties":{"owner":{"$ref":"#/components/schemas/ChartInput"},"pet":{"$ref":"#/components/schemas/ChartInput"}},"required":["owner","pet"]},"PetPetInput":{"type":"object","properties":{"date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"time":{"type":"string","pattern":"^\\d{2}:\\d{2}(:\\d{2})?$"},"timezoneOffset":{"type":"number","nullable":true,"minimum":-14,"maximum":14,"default":0,"description":"Hours from UTC at the given moment, not minutes. Fractional zones are hours too: 5.5 for India, 5.75 for Nepal, -3.5 for Newfoundland. Defaults to 0, meaning UTC. Ignored when timezone is sent."},"timezone":{"type":"string","example":"Europe/Kyiv","description":"IANA zone name such as Europe/Kyiv, or auto to look the zone up from latitude and longitude. The server takes the offset that zone kept at this local date and time, summer time included, and uses it in place of timezoneOffset. A clock time that happened twice takes the first occurrence; one skipped when clocks went forward takes the offset from before the change. Abbreviations such as EST are refused. Before 1970 the tz database is not reliable for every place, so send timezoneOffset when the local clock is known."},"latitude":{"type":"number","minimum":-90,"maximum":90},"longitude":{"type":"number","minimum":-180,"maximum":180},"houseSystem":{"type":"string","enum":["P","K","R","C","E","W","B","M","O","A","T","V","D","F","G","H","I","i","L","N","Q","S","U","X","Y"],"default":"P"},"name":{"type":"string","default":""},"city":{"type":"string","default":""},"zodiacType":{"type":"string","enum":["tropical","sidereal"]},"ayanamsaId":{"type":"number","nullable":true},"ayanamsa":{"type":"string","enum":["fagan-bradley","lahiri","de-luce","raman","krishnamurti","kp","yukteshwar","jn-bhasin","true-citra","djwhal-khul"],"description":"Sidereal school by name. Lahiri when omitted. Equivalent to ayanamsaId; send either."},"cosmogram":{"type":"boolean"}},"required":["date","time","latitude","longitude"],"additionalProperties":{"nullable":true},"description":"Birth data for a single natal chart. Required: date (YYYY-MM-DD), time (HH:mm:ss), latitude and longitude in decimal degrees. The short forms lat, lon, lng and tz are rejected with 400 INVALID_FIELD; pass the full names. timezoneOffset is hours from UTC and defaults to 0, meaning UTC; send timezone instead (an IANA name such as Europe/Kyiv, or auto) and the offset for that date is worked out, summer time included. city is a display label only: nothing here geocodes it, so it never stands in for coordinates. houseSystem is a single Swiss Ephemeris letter, P by default; a name such as \"Placidus\" is refused, and the case matters because I and i are two different Sunshine systems."},"VastuMandalaInput":{"type":"object","properties":{"school":{"type":"string","enum":["brihat-samhita","mayamata"]}}},"VastuEntranceInput":{"type":"object","properties":{"side":{"type":"string","enum":["E","S","W","N"]},"position":{"type":"number","minimum":0,"maximum":1},"pada":{"type":"string","pattern":"^[NESW][1-8]$"},"method":{"type":"string","enum":["eight-per-side","mandala-cells"]}}},"VastuRoomsInput":{"type":"object","properties":{"rooms":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","minLength":1,"maxLength":40},"direction":{"anyOf":[{"type":"string","enum":["N","NE","E","SE","S","SW","W","NW"]},{"type":"string","enum":["C"]}]},"bearing":{"type":"number","minimum":0,"maximum":360},"label":{"type":"string","maxLength":60}},"required":["type"]},"minItems":1,"maxItems":40}},"required":["rooms"]},"VastuDirectionsInput":{"type":"object","properties":{}},"ChineseAnnualStarsInput":{"type":"object","properties":{"year":{"type":"integer","minimum":1800,"maximum":2200},"date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"time":{"type":"string","pattern":"^\\d{2}:\\d{2}(:\\d{2})?$"},"timezoneOffset":{"type":"number","nullable":true,"minimum":-14,"maximum":14,"default":0,"description":"Hours from UTC at the given moment, not minutes. Fractional zones are hours too: 5.5 for India, 5.75 for Nepal, -3.5 for Newfoundland. Defaults to 0, meaning UTC. Ignored when timezone is sent."},"timezone":{"type":"string","example":"Europe/Kyiv","description":"IANA zone name such as Europe/Kyiv, or auto to look the zone up from latitude and longitude. The server takes the offset that zone kept at this local date and time, summer time included, and uses it in place of timezoneOffset. A clock time that happened twice takes the first occurrence; one skipped when clocks went forward takes the offset from before the change. Abbreviations such as EST are refused. Before 1970 the tz database is not reliable for every place, so send timezoneOffset when the local clock is known."},"includeMonthly":{"type":"boolean"},"language":{"type":"string"}}},"ChineseDateInput":{"type":"object","properties":{"date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"time":{"type":"string","pattern":"^\\d{2}:\\d{2}(:\\d{2})?$"},"timezoneOffset":{"type":"number","nullable":true,"minimum":-14,"maximum":14,"default":0,"description":"Hours from UTC at the given moment, not minutes. Fractional zones are hours too: 5.5 for India, 5.75 for Nepal, -3.5 for Newfoundland. Defaults to 0, meaning UTC. Ignored when timezone is sent."},"timezone":{"type":"string","example":"Europe/Kyiv","description":"IANA zone name such as Europe/Kyiv, or auto to look the zone up from latitude and longitude. The server takes the offset that zone kept at this local date and time, summer time included, and uses it in place of timezoneOffset. A clock time that happened twice takes the first occurrence; one skipped when clocks went forward takes the offset from before the change. Abbreviations such as EST are refused. Before 1970 the tz database is not reliable for every place, so send timezoneOffset when the local clock is known."},"solarYear":{"type":"integer","minimum":1800,"maximum":2200},"language":{"type":"string"}},"required":["date"]},"ChineseDateTimeInput":{"type":"object","properties":{"date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"time":{"type":"string","pattern":"^\\d{2}:\\d{2}(:\\d{2})?$"},"timezoneOffset":{"type":"number","nullable":true,"minimum":-14,"maximum":14,"default":0,"description":"Hours from UTC at the given moment, not minutes. Fractional zones are hours too: 5.5 for India, 5.75 for Nepal, -3.5 for Newfoundland. Defaults to 0, meaning UTC. Ignored when timezone is sent."},"timezone":{"type":"string","example":"Europe/Kyiv","description":"IANA zone name such as Europe/Kyiv, or auto to look the zone up from latitude and longitude. The server takes the offset that zone kept at this local date and time, summer time included, and uses it in place of timezoneOffset. A clock time that happened twice takes the first occurrence; one skipped when clocks went forward takes the offset from before the change. Abbreviations such as EST are refused. Before 1970 the tz database is not reliable for every place, so send timezoneOffset when the local clock is known."},"solarYear":{"type":"integer","minimum":1800,"maximum":2200},"language":{"type":"string"}},"required":["date"]},"ChineseFlyingStarInput":{"type":"object","properties":{"facing":{"type":"number","minimum":0,"maximum":360},"facingMountain":{"type":"string","minLength":1,"maxLength":8},"period":{"type":"integer","minimum":1,"maximum":9},"occupiedDate":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"occupiedTime":{"type":"string","pattern":"^\\d{2}:\\d{2}(:\\d{2})?$"},"timezoneOffset":{"type":"number","nullable":true,"minimum":-14,"maximum":14,"default":0,"description":"Hours from UTC at the given moment, not minutes. Fractional zones are hours too: 5.5 for India, 5.75 for Nepal, -3.5 for Newfoundland. Defaults to 0, meaning UTC."},"year":{"type":"integer","minimum":1800,"maximum":2200},"language":{"type":"string"}}},"ChineseKuaInput":{"type":"object","properties":{"date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"time":{"type":"string","pattern":"^\\d{2}:\\d{2}(:\\d{2})?$"},"timezoneOffset":{"type":"number","nullable":true,"minimum":-14,"maximum":14,"default":0,"description":"Hours from UTC at the given moment, not minutes. Fractional zones are hours too: 5.5 for India, 5.75 for Nepal, -3.5 for Newfoundland. Defaults to 0, meaning UTC. Ignored when timezone is sent."},"timezone":{"type":"string","example":"Europe/Kyiv","description":"IANA zone name such as Europe/Kyiv, or auto to look the zone up from latitude and longitude. The server takes the offset that zone kept at this local date and time, summer time included, and uses it in place of timezoneOffset. A clock time that happened twice takes the first occurrence; one skipped when clocks went forward takes the offset from before the change. Abbreviations such as EST are refused. Before 1970 the tz database is not reliable for every place, so send timezoneOffset when the local clock is known."},"gender":{"type":"string","enum":["male","female"]},"solarYear":{"type":"integer","minimum":1800,"maximum":2200},"language":{"type":"string"}},"required":["date","gender"]},"ChineseLunarDateInput":{"type":"object","properties":{"date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"time":{"type":"string","pattern":"^\\d{2}:\\d{2}(:\\d{2})?$"},"timezoneOffset":{"type":"number","nullable":true,"minimum":-14,"maximum":14,"default":0,"description":"Hours from UTC at the given moment, not minutes. Fractional zones are hours too: 5.5 for India, 5.75 for Nepal, -3.5 for Newfoundland. Defaults to 0, meaning UTC. Ignored when timezone is sent."},"timezone":{"type":"string","example":"Europe/Kyiv","description":"IANA zone name such as Europe/Kyiv, or auto to look the zone up from latitude and longitude. The server takes the offset that zone kept at this local date and time, summer time included, and uses it in place of timezoneOffset. A clock time that happened twice takes the first occurrence; one skipped when clocks went forward takes the offset from before the change. Abbreviations such as EST are refused. Before 1970 the tz database is not reliable for every place, so send timezoneOffset when the local clock is known."},"language":{"type":"string"}},"required":["date"]},"ChinesePairInput":{"type":"object","properties":{"person1":{"type":"object","properties":{"date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"time":{"type":"string","pattern":"^\\d{2}:\\d{2}(:\\d{2})?$"},"timezoneOffset":{"type":"number","nullable":true,"minimum":-14,"maximum":14,"default":0,"description":"Hours from UTC at the given moment, not minutes. Fractional zones are hours too: 5.5 for India, 5.75 for Nepal, -3.5 for Newfoundland. Defaults to 0, meaning UTC. Ignored when timezone is sent."},"timezone":{"type":"string","example":"Europe/Kyiv","description":"IANA zone name such as Europe/Kyiv, or auto to look the zone up from latitude and longitude. The server takes the offset that zone kept at this local date and time, summer time included, and uses it in place of timezoneOffset. A clock time that happened twice takes the first occurrence; one skipped when clocks went forward takes the offset from before the change. Abbreviations such as EST are refused. Before 1970 the tz database is not reliable for every place, so send timezoneOffset when the local clock is known."},"solarYear":{"type":"integer","minimum":1800,"maximum":2200},"language":{"type":"string"}},"required":["date"]},"person2":{"type":"object","properties":{"date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"time":{"type":"string","pattern":"^\\d{2}:\\d{2}(:\\d{2})?$"},"timezoneOffset":{"type":"number","nullable":true,"minimum":-14,"maximum":14,"default":0,"description":"Hours from UTC at the given moment, not minutes. Fractional zones are hours too: 5.5 for India, 5.75 for Nepal, -3.5 for Newfoundland. Defaults to 0, meaning UTC. Ignored when timezone is sent."},"timezone":{"type":"string","example":"Europe/Kyiv","description":"IANA zone name such as Europe/Kyiv, or auto to look the zone up from latitude and longitude. The server takes the offset that zone kept at this local date and time, summer time included, and uses it in place of timezoneOffset. A clock time that happened twice takes the first occurrence; one skipped when clocks went forward takes the offset from before the change. Abbreviations such as EST are refused. Before 1970 the tz database is not reliable for every place, so send timezoneOffset when the local clock is known."},"solarYear":{"type":"integer","minimum":1800,"maximum":2200},"language":{"type":"string"}},"required":["date"]},"language":{"type":"string"}},"required":["person1","person2"]},"ChineseSolarTermsInput":{"type":"object","properties":{"year":{"type":"integer","minimum":2,"maximum":2899},"language":{"type":"string"}},"required":["year"]},"ChineseTongShuInput":{"type":"object","properties":{"date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"time":{"type":"string","pattern":"^\\d{2}:\\d{2}(:\\d{2})?$"},"timezoneOffset":{"type":"number","nullable":true,"minimum":-14,"maximum":14,"default":0,"description":"Hours from UTC at the given moment, not minutes. Fractional zones are hours too: 5.5 for India, 5.75 for Nepal, -3.5 for Newfoundland. Defaults to 0, meaning UTC. Ignored when timezone is sent."},"timezone":{"type":"string","example":"Europe/Kyiv","description":"IANA zone name such as Europe/Kyiv, or auto to look the zone up from latitude and longitude. The server takes the offset that zone kept at this local date and time, summer time included, and uses it in place of timezoneOffset. A clock time that happened twice takes the first occurrence; one skipped when clocks went forward takes the offset from before the change. Abbreviations such as EST are refused. Before 1970 the tz database is not reliable for every place, so send timezoneOffset when the local clock is known."},"language":{"type":"string"}},"required":["date"]},"ChineseTongShuSelectInput":{"type":"object","properties":{"from":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"to":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"activity":{"type":"string","enum":["marriage","opening","moving","travel","contract","construction","demolition","medical","funeral","education"]},"avoidClashWith":{"type":"string","minLength":2,"maxLength":12},"includeNeutral":{"type":"boolean"},"language":{"type":"string"}},"required":["from","to","activity"]},"Harmonic":{"allOf":[{"$ref":"#/components/schemas/ChartInput"},{"type":"object","properties":{"harmonic":{"type":"integer","minimum":2,"maximum":180}},"required":["harmonic"],"additionalProperties":{"nullable":true}}],"description":"Birth data for a single natal chart. Required: date (YYYY-MM-DD), time (HH:mm:ss), latitude and longitude in decimal degrees. The short forms lat, lon, lng and tz are rejected with 400 INVALID_FIELD; pass the full names. timezoneOffset is hours from UTC and defaults to 0, meaning UTC; send timezone instead (an IANA name such as Europe/Kyiv, or auto) and the offset for that date is worked out, summer time included. city is a display label only: nothing here geocodes it, so it never stands in for coordinates. houseSystem is a single Swiss Ephemeris letter, P by default; a name such as \"Placidus\" is refused, and the case matters because I and i are two different Sunshine systems."},"MoonVoc":{"type":"object","properties":{"date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"time":{"type":"string","pattern":"^\\d{2}:\\d{2}(:\\d{2})?$"},"timezoneOffset":{"type":"number","nullable":true,"minimum":-14,"maximum":14,"default":0,"description":"Hours from UTC at the given moment, not minutes. Fractional zones are hours too: 5.5 for India, 5.75 for Nepal, -3.5 for Newfoundland. Defaults to 0, meaning UTC. Ignored when timezone is sent."},"timezone":{"type":"string","example":"Europe/Kyiv","description":"IANA zone name such as Europe/Kyiv, or auto to look the zone up from latitude and longitude. The server takes the offset that zone kept at this local date and time, summer time included, and uses it in place of timezoneOffset. A clock time that happened twice takes the first occurrence; one skipped when clocks went forward takes the offset from before the change. Abbreviations such as EST are refused. Before 1970 the tz database is not reliable for every place, so send timezoneOffset when the local clock is known."},"rangeDays":{"type":"number","minimum":1e-9,"maximum":366}},"required":["date","time"]},"NumerologyNameDate":{"type":"object","properties":{"name":{"type":"string","minLength":2,"maxLength":120},"date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}},"required":["name","date"]},"NumerologyPersonalYear":{"type":"object","properties":{"name":{"type":"string","minLength":2,"maxLength":120},"date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"year":{"type":"integer","minimum":1900,"maximum":2200,"description":"Calendar year to read. Defaults to the current year (UTC)."}},"required":["name","date"]},"TarotDaily":{"type":"object","properties":{"art":{"type":"string","maxLength":40,"description":"Card art set, e.g. rws-1909, rws-restored, rws-vector. GET /v1/tarot/decks lists the sets per deck."},"date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}}},"TarotDate":{"type":"object","properties":{"art":{"type":"string","maxLength":40,"description":"Card art set, e.g. rws-1909, rws-restored, rws-vector. GET /v1/tarot/decks lists the sets per deck."},"date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}},"required":["date"]},"TarotDraw":{"type":"object","properties":{"art":{"type":"string","maxLength":40,"description":"Card art set, e.g. rws-1909, rws-restored, rws-vector. GET /v1/tarot/decks lists the sets per deck."},"seed":{"type":"integer"},"question":{"type":"string","maxLength":500},"allowReversed":{"type":"boolean","default":true}}},"TarotInterpret":{"type":"object","properties":{"art":{"type":"string","maxLength":40,"description":"Card art set, e.g. rws-1909, rws-restored, rws-vector. GET /v1/tarot/decks lists the sets per deck."},"cards":{"type":"array","items":{"type":"string"},"minItems":1,"maxItems":15},"question":{"type":"string","maxLength":500}},"required":["cards"]},"TarotYear":{"type":"object","properties":{"art":{"type":"string","maxLength":40,"description":"Card art set, e.g. rws-1909, rws-restored, rws-vector. GET /v1/tarot/decks lists the sets per deck."},"date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"year":{"type":"integer","minimum":1900,"maximum":2200}},"required":["date","year"]},"ChartInputUnknownTime":{"type":"object","properties":{"date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"time":{"type":"string","pattern":"^\\d{2}:\\d{2}(:\\d{2})?$"},"timezoneOffset":{"type":"number","nullable":true,"minimum":-14,"maximum":14,"default":0,"description":"Hours from UTC at the given moment, not minutes. Fractional zones are hours too: 5.5 for India, 5.75 for Nepal, -3.5 for Newfoundland. Defaults to 0, meaning UTC. Ignored when timezone is sent."},"timezone":{"type":"string","example":"Europe/Kyiv","description":"IANA zone name such as Europe/Kyiv, or auto to look the zone up from latitude and longitude. The server takes the offset that zone kept at this local date and time, summer time included, and uses it in place of timezoneOffset. A clock time that happened twice takes the first occurrence; one skipped when clocks went forward takes the offset from before the change. Abbreviations such as EST are refused. Before 1970 the tz database is not reliable for every place, so send timezoneOffset when the local clock is known."},"latitude":{"type":"number","minimum":-90,"maximum":90},"longitude":{"type":"number","minimum":-180,"maximum":180},"houseSystem":{"type":"string","enum":["P","K","R","C","E","W","B","M","O","A","T","V","D","F","G","H","I","i","L","N","Q","S","U","X","Y"],"default":"P"},"name":{"type":"string","default":""},"city":{"type":"string","default":""},"zodiacType":{"type":"string","enum":["tropical","sidereal"]},"ayanamsaId":{"type":"number","nullable":true},"ayanamsa":{"type":"string","enum":["fagan-bradley","lahiri","de-luce","raman","krishnamurti","kp","yukteshwar","jn-bhasin","true-citra","djwhal-khul"],"description":"Sidereal school by name. Lahiri when omitted. Equivalent to ayanamsaId; send either."},"cosmogram":{"type":"boolean"},"timeUnknown":{"type":"boolean"}},"required":["date","latitude","longitude"],"additionalProperties":{"nullable":true},"description":"Birth data where the clock time may be unknown. Either pass time (HH:mm:ss), or set timeUnknown: true and omit it. In the second case the response carries planets and aspects but no houses, angles or sect."},"PanchangInput":{"type":"object","properties":{"date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"time":{"type":"string","pattern":"^\\d{2}:\\d{2}(:\\d{2})?$"},"timezoneOffset":{"type":"number","nullable":true,"minimum":-14,"maximum":14,"default":0,"description":"Hours from UTC at the given moment, not minutes. Fractional zones are hours too: 5.5 for India, 5.75 for Nepal, -3.5 for Newfoundland. Defaults to 0, meaning UTC. Ignored when timezone is sent."},"timezone":{"type":"string","example":"Europe/Kyiv","description":"IANA zone name such as Europe/Kyiv, or auto to look the zone up from latitude and longitude. The server takes the offset that zone kept at this local date and time, summer time included, and uses it in place of timezoneOffset. A clock time that happened twice takes the first occurrence; one skipped when clocks went forward takes the offset from before the change. Abbreviations such as EST are refused. Before 1970 the tz database is not reliable for every place, so send timezoneOffset when the local clock is known."},"latitude":{"type":"number","minimum":-90,"maximum":90},"longitude":{"type":"number","minimum":-180,"maximum":180},"houseSystem":{"type":"string","enum":["P","K","R","C","E","W","B","M","O","A","T","V","D","F","G","H","I","i","L","N","Q","S","U","X","Y"],"default":"P"},"name":{"type":"string","default":""},"city":{"type":"string","default":""},"zodiacType":{"type":"string","enum":["tropical","sidereal"]},"ayanamsaId":{"type":"number","nullable":true},"ayanamsa":{"type":"string","enum":["fagan-bradley","lahiri","de-luce","raman","krishnamurti","kp","yukteshwar","jn-bhasin","true-citra","djwhal-khul"],"description":"Sidereal school by name. Lahiri when omitted. Equivalent to ayanamsaId; send either."},"cosmogram":{"type":"boolean"},"at":{"type":"string","enum":["moment","sunrise"],"description":"moment (default): tithi, nakshatra, yoga and karana at date + time. sunrise: at local sunrise of that date, as a printed panchang gives them; time may be omitted."}},"required":["date","latitude","longitude"],"additionalProperties":{"nullable":true},"description":"ChartInput plus `at`. With at \"sunrise\" the angas are read at local sunrise and time is optional; otherwise time is required."},"TwoChartUnknownTime":{"type":"object","properties":{"chart1":{"$ref":"#/components/schemas/ChartInputUnknownTime"},"chart2":{"$ref":"#/components/schemas/ChartInputUnknownTime"}},"required":["chart1","chart2"],"description":"Pair of natal charts where either birth time may be unknown. A chart with timeUnknown: true contributes planets and cross-aspects but no houses, angles or overlays."},"ArabicParts":{"allOf":[{"$ref":"#/components/schemas/ChartInput"},{"type":"object","properties":{"parts":{"type":"array","items":{"type":"object","properties":{"code":{"type":"number","nullable":true},"name":{"type":"string"},"formula":{"type":"string"},"flag":{"type":"string"}},"required":["code","name","formula"]},"minItems":1,"maxItems":64}},"additionalProperties":{"nullable":true}}],"description":"Natal chart plus optional custom lot definitions; the built-in set is used when omitted."},"HdTransits":{"allOf":[{"$ref":"#/components/schemas/ChartInput"},{"type":"object","properties":{"natalDate":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"natalTime":{"type":"string","pattern":"^\\d{2}:\\d{2}(:\\d{2})?$"},"natalTimezoneOffset":{"type":"number","nullable":true}},"additionalProperties":{"nullable":true}}],"description":"Transit moment plus an optional natal date, time and offset to overlay the activations on."},"Almuten":{"allOf":[{"$ref":"#/components/schemas/ChartInput"},{"type":"object","properties":{"termsData":{"type":"array","items":{"type":"object","nullable":true,"properties":{"sign":{"type":"string"},"terms":{"type":"array","items":{"type":"object","properties":{"endDegree":{"type":"number"},"planet":{"type":"string"}},"required":["endDegree","planet"]},"maxItems":12}},"required":["sign","terms"]},"maxItems":12},"decansData":{"type":"array","items":{"type":"object","properties":{"sign":{"type":"string"},"decans":{"type":"array","items":{"type":"string"}}},"required":["sign","decans"]},"maxItems":12}},"additionalProperties":{"nullable":true}}],"description":"Natal chart plus optional custom terms and decans tables."},"EssentialDignities":{"allOf":[{"$ref":"#/components/schemas/ChartInput"},{"type":"object","properties":{"termsData":{"type":"array","items":{"type":"object","nullable":true,"properties":{"sign":{"type":"string"},"terms":{"type":"array","items":{"type":"object","properties":{"endDegree":{"type":"number"},"planet":{"type":"string"}},"required":["endDegree","planet"]},"maxItems":12}},"required":["sign","terms"]},"maxItems":12},"decansData":{"type":"array","items":{"type":"object","properties":{"sign":{"type":"string"},"decans":{"type":"array","items":{"type":"string"}}},"required":["sign","decans"]},"maxItems":12}},"additionalProperties":{"nullable":true}}],"description":"Natal chart plus optional custom terms and decans tables."},"Hyleg":{"allOf":[{"$ref":"#/components/schemas/ChartInput"},{"type":"object","properties":{"termsData":{"type":"array","items":{"type":"object","nullable":true,"properties":{"sign":{"type":"string"},"terms":{"type":"array","items":{"type":"object","properties":{"endDegree":{"type":"number"},"planet":{"type":"string"}},"required":["endDegree","planet"]},"maxItems":12}},"required":["sign","terms"]},"maxItems":12},"decansData":{"type":"array","items":{"type":"object","properties":{"sign":{"type":"string"},"decans":{"type":"array","items":{"type":"string"}}},"required":["sign","decans"]},"maxItems":12}},"additionalProperties":{"nullable":true}}],"description":"Natal chart plus the hyleg method and optional custom dignity tables."},"Receptions":{"allOf":[{"$ref":"#/components/schemas/ChartInput"},{"type":"object","properties":{"termsData":{"type":"array","items":{"type":"object","nullable":true,"properties":{"sign":{"type":"string"},"terms":{"type":"array","items":{"type":"object","properties":{"endDegree":{"type":"number"},"planet":{"type":"string"}},"required":["endDegree","planet"]},"maxItems":12}},"required":["sign","terms"]},"maxItems":12},"decansData":{"type":"array","items":{"type":"object","properties":{"sign":{"type":"string"},"decans":{"type":"array","items":{"type":"string"}}},"required":["sign","decans"]},"maxItems":12}},"additionalProperties":{"nullable":true}}],"description":"Natal chart plus optional custom terms and decans tables."},"DispositionChains":{"allOf":[{"$ref":"#/components/schemas/ChartInput"},{"type":"object","properties":{"mode":{"type":"string","enum":["rulership","detriment"]},"rulerMode":{"type":"string","enum":["classical","modern"]}},"additionalProperties":{"nullable":true}}],"description":"Natal chart plus the dispositor mode (rulership or detriment) and the ruler set (classical or modern)."},"Firdaria":{"allOf":[{"$ref":"#/components/schemas/ChartInput"},{"type":"object","properties":{"maxYears":{"type":"integer","minimum":0,"exclusiveMinimum":true,"maximum":200}},"additionalProperties":{"nullable":true}}],"description":"Natal chart plus the number of years of firdaria periods to return."},"SymbolicDirections":{"allOf":[{"$ref":"#/components/schemas/NatalTarget"},{"type":"object","properties":{"key":{"type":"string","enum":["one_degree","naibod","solar_arc"]}},"additionalProperties":{"nullable":true}}],"description":"Natal chart plus a target date and the directional key: one degree per year, the Naibod rate, or the arc of the progressed Sun."},"NatalTarget":{"allOf":[{"$ref":"#/components/schemas/ChartInput"},{"type":"object","properties":{"targetDate":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"targetTime":{"type":"string","pattern":"^\\d{2}:\\d{2}(:\\d{2})?$"},"targetTzOffset":{"type":"number","nullable":true},"converse":{"type":"boolean"}},"required":["targetDate"],"additionalProperties":{"nullable":true}}],"description":"Natal chart plus a target date for time-based calculations: progressions, directions, profections, returns."},"PrimaryDirections":{"allOf":[{"$ref":"#/components/schemas/ChartInput"},{"type":"object","properties":{"key":{"type":"number","minimum":0,"exclusiveMinimum":true,"maximum":2},"maxAge":{"type":"integer","minimum":0,"exclusiveMinimum":true,"maximum":120},"aspectAngles":{"type":"array","items":{"type":"number","nullable":true,"minimum":0,"maximum":180},"maxItems":64}},"additionalProperties":{"nullable":true}}],"description":"Natal chart plus the directional rate in degrees per year (Naibod 0.9856353 by default), the age to search to, and the aspect angles to test."},"ParallelAspects":{"allOf":[{"$ref":"#/components/schemas/ChartInput"},{"type":"object","properties":{"orb":{"type":"number","minimum":0,"exclusiveMinimum":true,"maximum":30}},"additionalProperties":{"nullable":true}}],"description":"Natal chart plus the declination orb in degrees."},"MidpointTrees":{"allOf":[{"$ref":"#/components/schemas/ChartInput"},{"type":"object","properties":{"orb":{"type":"number","minimum":0,"exclusiveMinimum":true,"maximum":30}},"additionalProperties":{"nullable":true}}],"description":"Natal chart plus the orb in degrees used for midpoint trees and symmetries."},"JaiminiDashaSummary":{"allOf":[{"$ref":"#/components/schemas/ChartInput"},{"type":"object","properties":{"targetDate":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"targetTime":{"type":"string","pattern":"^\\d{2}:\\d{2}(:\\d{2})?$"},"targetTzOffset":{"type":"number","nullable":true}},"additionalProperties":{"nullable":true}}],"description":"Natal chart plus the target date for the Jaimini dasha summary."},"SadeSati":{"allOf":[{"$ref":"#/components/schemas/ChartInput"},{"type":"object","properties":{"targetDate":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"targetTime":{"type":"string","pattern":"^\\d{2}:\\d{2}(:\\d{2})?$"},"targetTzOffset":{"type":"number","nullable":true}},"additionalProperties":{"nullable":true}}],"description":"Natal chart plus the target date for the Sade Sati phase."},"Gemstone":{"allOf":[{"$ref":"#/components/schemas/ChartInput"},{"type":"object","properties":{"latitude":{"type":"number","minimum":-90,"maximum":90,"description":"Birth latitude. Required: the lagna is what both schools prescribe from."},"longitude":{"type":"number","minimum":-180,"maximum":180,"description":"Birth longitude. Required: the lagna is what both schools prescribe from."},"school":{"type":"string","enum":["lagna-lord","functional-benefic"],"description":"Prescription school. Both reach the same three gems (the trikona lords), and differ on what they withhold and on the ordering. The response always names the one used. Default: lagna-lord."}},"additionalProperties":{"nullable":true}}],"description":"Birth data for a gemstone recommendation. Required: date (YYYY-MM-DD), time (HH:mm:ss), latitude and longitude. Coordinates do NOT default to 0 here as they do on other chart endpoints: the whole answer is derived from the lagna, so an omitted pair is a 400 rather than a confident set of gems for 0N 0E."},"Varshaphal":{"allOf":[{"$ref":"#/components/schemas/ChartInput"},{"type":"object","properties":{"latitude":{"type":"number","minimum":-90,"maximum":90,"description":"Birth latitude. Required: the muntha starts at the natal lagna."},"longitude":{"type":"number","minimum":-180,"maximum":180,"description":"Birth longitude. Required: the muntha starts at the natal lagna."},"year":{"type":"integer","minimum":1800,"maximum":2400,"description":"Calendar year of the solar return. The year is entered on the birthday of that year, not on 1 January."},"entryLatitude":{"type":"number","minimum":-90,"maximum":90,"description":"Where the year is entered, if not the birthplace. Classically the residence on the birthday. Moves the annual ascendant and every house with it; the planets and the muntha do not move. Must be sent together with entryLongitude."},"entryLongitude":{"type":"number","minimum":-180,"maximum":180,"description":"Longitude of the year entry. Must be sent together with entryLatitude."}},"required":["year"],"additionalProperties":{"nullable":true}}],"description":"Birth data plus a year, for the Tajika annual chart. Required: date (YYYY-MM-DD), time (HH:mm:ss), latitude, longitude and year. Coordinates do NOT default to 0 here as they do on other chart endpoints. The chart is cast on the SIDEREAL solar return, which for an adult is many hours away from the tropical one and therefore a different ascendant."},"StarParans":{"allOf":[{"$ref":"#/components/schemas/ChartInput"},{"type":"object","properties":{"stars":{"type":"array","items":{"type":"string"},"minItems":1,"maxItems":80,"description":"Star names from the Swiss Ephemeris catalogue. Default: the 36-star astrological set."},"planets":{"type":"array","items":{"type":"integer","nullable":true},"minItems":1,"maxItems":20,"description":"Swiss Ephemeris planet ids. Default: 0-9, Sun through Pluto."},"latitudeLimit":{"type":"number","minimum":5,"maximum":85,"description":"Search range either side of the equator, degrees. Default 60, which is the range Brady tabulates."},"horizon":{"type":"string","enum":["geometric","apparent"],"description":"Which horizon counts as rising. `geometric` (default) is altitude 0, the semi-diurnal arc as written in Meeus. `apparent` puts it at -34 arcmin, where refraction lifts a body into view first. Worth about two degrees of paran latitude at mid-latitudes, and refraction also breaks the equator mirror that the geometric horizon has, so it is a choice rather than a detail."}},"additionalProperties":{"nullable":true}}],"description":"Birth data for star-planet parans. Coordinates are not used: a paran is a latitude, and which latitudes exist depends on the moment, not on where the native was born."},"AcgBestPlaces":{"allOf":[{"$ref":"#/components/schemas/ChartInput"},{"type":"object","properties":{"category":{"type":"string","description":"One of the 19 ACG life categories. The list is at GET /v1/acg/categories."},"countries":{"type":"array","items":{"type":"string","minLength":2,"maxLength":2},"maxItems":50,"description":"ISO 3166-1 alpha-2 codes to restrict the search to. Omit to search the whole bundled list."},"minPopulation":{"type":"integer","minimum":15000,"description":"Floor on city population. The bundled set starts at 15000, so a lower value changes nothing."},"orbKm":{"type":"number","minimum":100,"maximum":3000,"description":"How far a line reaches, kilometres. Default 1126, which is the 700 miles Jim Lewis used."},"limit":{"type":"integer","minimum":1,"maximum":100,"description":"How many cities to return. Default 25."},"minSeparationKm":{"type":"number","nullable":true,"minimum":0,"maximum":5000,"description":"Keep returned cities at least this far apart, kilometres. Default 300. An ACG line is a curve, so without thinning the top of the ranking is the densest stretch of one line rather than a set of places. Set 0 to disable and see every city in score order."},"sort":{"type":"string","enum":["net","supportive"],"description":"`net` (default) ranks on supportive minus challenging. `supportive` ignores the challenging side when ordering, though it is still reported."}},"required":["category"],"additionalProperties":{"nullable":true}}],"description":"Birth data plus a life category. Birth coordinates are optional and unused for the ranking: astrocartography lines are a property of the birth moment, not of the birth place."},"TwoChart":{"type":"object","properties":{"chart1":{"$ref":"#/components/schemas/ChartInput"},"chart2":{"$ref":"#/components/schemas/ChartInput"}},"required":["chart1","chart2"],"description":"Pair of natal charts for relationship calculations: synastry, composite, davison."},"MultiChart":{"type":"object","properties":{"inputs":{"type":"array","items":{"$ref":"#/components/schemas/ChartInput"},"minItems":2,"maxItems":10}},"required":["inputs"],"description":"Group of 2-10 natal charts for collective calculations: group synastry, penta-chart, etc."},"NatalWrapper":{"type":"object","properties":{"natal":{"$ref":"#/components/schemas/ChartInput"}},"required":["natal"],"description":"Wrapper { natal: ChartInput } used by endpoints that take a base natal plus extra parameters in flat fields."},"AcgByCategory":{"allOf":[{"$ref":"#/components/schemas/ChartInput"},{"type":"object","properties":{"category":{"type":"string","enum":["adventure","career","communication","creativity","health","home","learning","love","money","power","relationship","retreat","spirituality","stability","success","transformation","travel","vitality","wealth"]},"point":{"type":"object","properties":{"lat":{"type":"number","minimum":-90,"maximum":90},"lng":{"type":"number","minimum":-180,"maximum":180}},"required":["lat","lng"]},"radiusDeg":{"type":"number","minimum":0.5,"maximum":20,"default":4},"polarity":{"type":"string","enum":["supportive","challenging","all"],"default":"all"},"includeText":{"type":"boolean","default":true},"includeCoordinates":{"type":"boolean","default":true},"language":{"type":"string","enum":["uk","en","de","pl","es","pt","fr","it","nl","cs","ro","hu","el","tr","ar","hi","ja","ko","vi","id","ru"]}},"required":["category"],"additionalProperties":{"nullable":true}}],"description":"Birth data for a single natal chart. Required: date (YYYY-MM-DD), time (HH:mm:ss), latitude and longitude in decimal degrees. The short forms lat, lon, lng and tz are rejected with 400 INVALID_FIELD; pass the full names. timezoneOffset is hours from UTC and defaults to 0, meaning UTC; send timezone instead (an IANA name such as Europe/Kyiv, or auto) and the offset for that date is worked out, summer time included. city is a display label only: nothing here geocodes it, so it never stands in for coordinates. houseSystem is a single Swiss Ephemeris letter, P by default; a name such as \"Placidus\" is refused, and the case matters because I and i are two different Sunshine systems."},"AcgLineReport":{"allOf":[{"$ref":"#/components/schemas/ChartInput"},{"type":"object","properties":{"planet":{"type":"string","minLength":2},"angle":{"type":"string","enum":["MC","IC","ASC","DSC"]},"includeCoordinates":{"type":"boolean","default":true},"language":{"type":"string","enum":["uk","en","de","pl","es","pt","fr","it","nl","cs","ro","hu","el","tr","ar","hi","ja","ko","vi","id","ru"]}},"required":["planet","angle"],"additionalProperties":{"nullable":true}}],"description":"Birth data for a single natal chart. Required: date (YYYY-MM-DD), time (HH:mm:ss), latitude and longitude in decimal degrees. The short forms lat, lon, lng and tz are rejected with 400 INVALID_FIELD; pass the full names. timezoneOffset is hours from UTC and defaults to 0, meaning UTC; send timezone instead (an IANA name such as Europe/Kyiv, or auto) and the offset for that date is worked out, summer time included. city is a display label only: nothing here geocodes it, so it never stands in for coordinates. houseSystem is a single Swiss Ephemeris letter, P by default; a name such as \"Placidus\" is refused, and the case matters because I and i are two different Sunshine systems."},"AcgZones":{"allOf":[{"$ref":"#/components/schemas/ChartInput"},{"type":"object","properties":{"point":{"type":"object","properties":{"lat":{"type":"number","minimum":-90,"maximum":90},"lng":{"type":"number","minimum":-180,"maximum":180}},"required":["lat","lng"]},"radiusDeg":{"type":"number","minimum":0.5,"maximum":20,"default":4}},"required":["point"],"additionalProperties":{"nullable":true}}],"description":"Birth data for a single natal chart. Required: date (YYYY-MM-DD), time (HH:mm:ss), latitude and longitude in decimal degrees. The short forms lat, lon, lng and tz are rejected with 400 INVALID_FIELD; pass the full names. timezoneOffset is hours from UTC and defaults to 0, meaning UTC; send timezone instead (an IANA name such as Europe/Kyiv, or auto) and the offset for that date is worked out, summer time included. city is a display label only: nothing here geocodes it, so it never stands in for coordinates. houseSystem is a single Swiss Ephemeris letter, P by default; a name such as \"Placidus\" is refused, and the case matters because I and i are two different Sunshine systems."},"AlgolNearest":{"type":"object","properties":{"date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"longitude":{"type":"number","nullable":true}},"required":["date"]},"AlgolRange":{"type":"object","properties":{"startDate":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"endDate":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"longitude":{"type":"number","nullable":true}},"required":["startDate","endDate"]},"AspectBar":{"type":"object","properties":{"startDate":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"endDate":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"stepDays":{"type":"number","minimum":0.041666666666666664,"maximum":365},"planet1Ids":{"type":"array","items":{"type":"integer","nullable":true,"minimum":0},"maxItems":32},"planet2Ids":{"type":"array","items":{"type":"integer","nullable":true,"minimum":0},"maxItems":32},"aspectAngles":{"type":"array","items":{"type":"number","nullable":true,"minimum":0,"maximum":360},"maxItems":64},"maxOrb":{"type":"number","minimum":1e-9,"maximum":30},"visiblePlanetIds":{"type":"array","items":{"type":"integer","nullable":true,"minimum":0},"maxItems":32}},"required":["startDate","endDate"]},"AspectTimeline":{"type":"object","properties":{"startDate":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"endDate":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"stepDays":{"type":"number","minimum":0.041666666666666664,"maximum":365},"planet1Ids":{"type":"array","items":{"type":"integer","nullable":true,"minimum":0},"maxItems":32},"planet2Ids":{"type":"array","items":{"type":"integer","nullable":true,"minimum":0},"maxItems":32},"aspectAngles":{"type":"array","items":{"type":"number","nullable":true,"minimum":0,"maximum":360},"maxItems":64},"maxOrb":{"type":"number","minimum":1e-9,"maximum":30}},"required":["startDate","endDate"]},"BiWheel":{"type":"object","properties":{"natal":{"$ref":"#/components/schemas/ChartInput"},"outer":{"$ref":"#/components/schemas/ChartInput"},"options":{"type":"object","properties":{"size":{"type":"integer","minimum":200,"maximum":2000},"theme":{"type":"string","enum":["light","dark","console","css"],"description":"css paints every colour as var(--aw-<role>, <light colour>), so the page that inlines the SVG can recolour it with CSS custom properties (--aw-chart-bg, --aw-fg, --aw-muted, --aw-ring, --aw-houses-fill, --aw-benefic, --aw-malefic, --aw-aspect-harmonious, --aw-aspect-tense, --aw-aspect-neutral, --aw-aspect-minor, --aw-aspect-quintile, --aw-moon-shadow, --aw-moon-light, --aw-cycle-physical, --aw-cycle-emotional, --aw-cycle-intellectual). With none set it looks exactly like light. Inside an <img> the variables cannot be set, so it stays light. The Western wheels and the aspect grid then also carry stable aw-* classes, and each planet is a <g> with data-planet and data-label, each aspect line has data-a and data-b; see the @astroway/render changelog for the list."},"showAspects":{"type":"boolean"},"showRetrograde":{"type":"boolean"},"title":{"type":"string","maxLength":120},"format":{"type":"string","enum":["svg","json"],"default":"json"},"bodies":{"type":"array","items":{"type":"string","enum":["Sun","Moon","Mercury","Venus","Mars","Jupiter","Saturn","Uranus","Neptune","Pluto","North Node","South Node","Chiron","Lilith"]},"minItems":1,"maxItems":14},"labels":{"type":"object","properties":{"asc":{"type":"string","minLength":1,"maxLength":40},"dsc":{"type":"string","minLength":1,"maxLength":40},"mc":{"type":"string","minLength":1,"maxLength":40},"ic":{"type":"string","minLength":1,"maxLength":40},"title":{"type":"string","minLength":1,"maxLength":200},"desc":{"type":"string","minLength":1,"maxLength":2000},"bodies":{"type":"object","properties":{"Sun":{"type":"string","minLength":1,"maxLength":40},"Moon":{"type":"string","minLength":1,"maxLength":40},"Mercury":{"type":"string","minLength":1,"maxLength":40},"Venus":{"type":"string","minLength":1,"maxLength":40},"Mars":{"type":"string","minLength":1,"maxLength":40},"Jupiter":{"type":"string","minLength":1,"maxLength":40},"Saturn":{"type":"string","minLength":1,"maxLength":40},"Uranus":{"type":"string","minLength":1,"maxLength":40},"Neptune":{"type":"string","minLength":1,"maxLength":40},"Pluto":{"type":"string","minLength":1,"maxLength":40},"North Node":{"type":"string","minLength":1,"maxLength":40},"South Node":{"type":"string","minLength":1,"maxLength":40},"Chiron":{"type":"string","minLength":1,"maxLength":40},"Lilith":{"type":"string","minLength":1,"maxLength":40}}},"signs":{"type":"array","items":{"type":"string","minLength":1,"maxLength":40}},"retrograde":{"type":"string","minLength":1,"maxLength":40}},"additionalProperties":false,"description":"Your own words in place of the English the image would otherwise carry: the ASC/DSC/MC/IC axis labels, the SVG <title> and <desc> read by screen readers, and the planet and sign names plus the word for retrograde in each planet's data-label (theme css). bodies is keyed by the English name, signs lists twelve names from Aries. Nothing is translated for you; absent keys keep the English."},"outerLabel":{"type":"string","maxLength":40,"default":"TR"},"crossAspects":{"type":"boolean","description":"Draws the aspects between the two charts as dashed chords (the same set POST /synastry returns as crossAspects), skipping pairs with a body that is not drawn. In theme css each chord has class aw-cross-aspect, data-a (inner planet) and data-b (outer planet, b- prefix)."}}}},"required":["natal","outer"]},"BiorhythmRender":{"type":"object","properties":{"birthDate":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"rangeStart":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"rangeEnd":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"options":{"type":"object","properties":{"size":{"type":"integer","minimum":200,"maximum":2000},"theme":{"type":"string","enum":["light","dark","console","css"],"description":"css paints every colour as var(--aw-<role>, <light colour>), so the page that inlines the SVG can recolour it with CSS custom properties (--aw-chart-bg, --aw-fg, --aw-muted, --aw-ring, --aw-houses-fill, --aw-benefic, --aw-malefic, --aw-aspect-harmonious, --aw-aspect-tense, --aw-aspect-neutral, --aw-aspect-minor, --aw-aspect-quintile, --aw-moon-shadow, --aw-moon-light, --aw-cycle-physical, --aw-cycle-emotional, --aw-cycle-intellectual). With none set it looks exactly like light. Inside an <img> the variables cannot be set, so it stays light. The Western wheels and the aspect grid then also carry stable aw-* classes, and each planet is a <g> with data-planet and data-label, each aspect line has data-a and data-b; see the @astroway/render changelog for the list."},"showAspects":{"type":"boolean"},"showRetrograde":{"type":"boolean"},"title":{"type":"string","maxLength":120},"format":{"type":"string","enum":["svg","json"],"default":"json"},"width":{"type":"integer","minimum":400,"maximum":3000},"height":{"type":"integer","minimum":200,"maximum":1200}}}},"required":["birthDate","rangeStart","rangeEnd"]},"Biorhythm":{"type":"object","properties":{"birthDate":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"rangeStart":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"rangeEnd":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}},"required":["birthDate"]},"Breakup":{"allOf":[{"$ref":"#/components/schemas/TwoChart"},{"type":"object","properties":{"startDate":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"endDate":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}},"required":["startDate","endDate"]}],"description":"Pair of natal charts for relationship calculations: synastry, composite, davison."},"CcgAnalysis":{"allOf":[{"$ref":"#/components/schemas/NatalWrapper"},{"type":"object","properties":{"targetDate":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"targetTime":{"type":"string","pattern":"^\\d{2}:\\d{2}(:\\d{2})?$"},"targetTzOffset":{"type":"number","nullable":true},"point":{"type":"object","properties":{"lat":{"type":"number","minimum":-90,"maximum":90},"lng":{"type":"number","minimum":-180,"maximum":180}},"required":["lat","lng"]},"latitude":{"type":"number","nullable":true},"fastPlanetsOnly":{"type":"boolean"},"orb":{"type":"number","nullable":true}},"required":["targetDate"]}],"description":"Wrapper { natal: ChartInput } used by endpoints that take a base natal plus extra parameters in flat fields."},"ChangePassword":{"type":"object","properties":{"old_password":{"type":"string","minLength":1},"new_password":{"type":"string","minLength":8,"maxLength":100}},"required":["old_password","new_password"]},"Changing":{"type":"object","properties":{"seed":{"anyOf":[{"type":"number"},{"type":"string"}]}}},"ChartWithTnp":{"type":"object","properties":{"date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"time":{"type":"string","pattern":"^\\d{2}:\\d{2}(:\\d{2})?$"},"timezoneOffset":{"type":"number","nullable":true,"minimum":-14,"maximum":14,"default":0,"description":"Hours from UTC at the given moment, not minutes. Fractional zones are hours too: 5.5 for India, 5.75 for Nepal, -3.5 for Newfoundland. Defaults to 0, meaning UTC. Ignored when timezone is sent."},"timezone":{"type":"string","example":"Europe/Kyiv","description":"IANA zone name such as Europe/Kyiv, or auto to look the zone up from latitude and longitude. The server takes the offset that zone kept at this local date and time, summer time included, and uses it in place of timezoneOffset. A clock time that happened twice takes the first occurrence; one skipped when clocks went forward takes the offset from before the change. Abbreviations such as EST are refused. Before 1970 the tz database is not reliable for every place, so send timezoneOffset when the local clock is known."},"latitude":{"type":"number","minimum":-90,"maximum":90},"longitude":{"type":"number","minimum":-180,"maximum":180},"houseSystem":{"type":"string","enum":["P","K","R","C","E","W","B","M","O","A","T","V","D","F","G","H","I","i","L","N","Q","S","U","X","Y"],"default":"P"},"name":{"type":"string","default":""},"city":{"type":"string","default":""},"zodiacType":{"type":"string","enum":["tropical","sidereal"]},"ayanamsaId":{"type":"number","nullable":true},"ayanamsa":{"type":"string","enum":["fagan-bradley","lahiri","de-luce","raman","krishnamurti","kp","yukteshwar","jn-bhasin","true-citra","djwhal-khul"],"description":"Sidereal school by name. Lahiri when omitted. Equivalent to ayanamsaId; send either."},"cosmogram":{"type":"boolean"},"withTnp":{"type":"boolean"}},"required":["date","time","latitude","longitude"]},"Chat":{"type":"object","properties":{"chart":{"$ref":"#/components/schemas/ChartInput"},"message":{"type":"string","minLength":2,"maxLength":2000},"history":{"type":"array","items":{"type":"object","properties":{"role":{"type":"string","enum":["user","assistant"]},"content":{"type":"string","maxLength":2000}},"required":["role","content"]},"maxItems":10},"persona":{"type":"string","enum":["astrologer","plain","coach","teacher"],"default":"astrologer"},"language":{"type":"string","enum":["uk","en","de","ru","pl","es","pt","hi","fr","ko","it","ja","id","tr","nl","ro","cs","vi","ar","el","hu"],"default":"uk"}},"required":["message"]},"Coalescent":{"type":"object","properties":{"input1":{"$ref":"#/components/schemas/ChartInput"},"input2":{"$ref":"#/components/schemas/ChartInput"}},"required":["input1","input2"]},"ComparisonCoach":{"type":"object","properties":{"chart1":{"$ref":"#/components/schemas/ChartInput"},"chart2":{"$ref":"#/components/schemas/ChartInput"},"question":{"type":"string","minLength":5,"maxLength":2000},"language":{"type":"string","enum":["uk","en","de","ru","pl","es","pt","hi","fr","ko","it","ja","id","tr","nl","ro","cs","vi","ar","el","hu"],"default":"uk"}},"required":["chart1","chart2","question"]},"Compatibility":{"type":"object","properties":{"sign1":{"type":"string","enum":["aries","taurus","gemini","cancer","leo","virgo","libra","scorpio","sagittarius","capricorn","aquarius","pisces"]},"sign2":{"type":"string","enum":["aries","taurus","gemini","cancer","leo","virgo","libra","scorpio","sagittarius","capricorn","aquarius","pisces"]},"language":{"type":"string","enum":["uk","en","de","pl","es","pt","fr","it","nl","cs","ro","hu","el","tr","ar","hi","ja","ko","vi","id","ru"]},"disclaimer_inline":{"type":"boolean","default":false}},"required":["sign1","sign2"]},"CompositeProgressions":{"allOf":[{"$ref":"#/components/schemas/TwoChart"},{"type":"object","properties":{"targetDate":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"targetTime":{"type":"string","pattern":"^\\d{2}:\\d{2}(:\\d{2})?$"},"targetTzOffset":{"type":"number","nullable":true}},"required":["targetDate"]}],"description":"Pair of natal charts for relationship calculations: synastry, composite, davison."},"CompositeRender":{"allOf":[{"$ref":"#/components/schemas/TwoChart"},{"type":"object","properties":{"options":{"type":"object","properties":{"size":{"type":"integer","minimum":200,"maximum":2000},"theme":{"type":"string","enum":["light","dark","console","css"],"description":"css paints every colour as var(--aw-<role>, <light colour>), so the page that inlines the SVG can recolour it with CSS custom properties (--aw-chart-bg, --aw-fg, --aw-muted, --aw-ring, --aw-houses-fill, --aw-benefic, --aw-malefic, --aw-aspect-harmonious, --aw-aspect-tense, --aw-aspect-neutral, --aw-aspect-minor, --aw-aspect-quintile, --aw-moon-shadow, --aw-moon-light, --aw-cycle-physical, --aw-cycle-emotional, --aw-cycle-intellectual). With none set it looks exactly like light. Inside an <img> the variables cannot be set, so it stays light. The Western wheels and the aspect grid then also carry stable aw-* classes, and each planet is a <g> with data-planet and data-label, each aspect line has data-a and data-b; see the @astroway/render changelog for the list."},"showAspects":{"type":"boolean"},"showRetrograde":{"type":"boolean"},"title":{"type":"string","maxLength":120},"format":{"type":"string","enum":["svg","json"],"default":"json"},"bodies":{"type":"array","items":{"type":"string","enum":["Sun","Moon","Mercury","Venus","Mars","Jupiter","Saturn","Uranus","Neptune","Pluto","North Node","South Node","Chiron","Lilith"]},"minItems":1,"maxItems":14},"labels":{"type":"object","properties":{"asc":{"type":"string","minLength":1,"maxLength":40},"dsc":{"type":"string","minLength":1,"maxLength":40},"mc":{"type":"string","minLength":1,"maxLength":40},"ic":{"type":"string","minLength":1,"maxLength":40},"title":{"type":"string","minLength":1,"maxLength":200},"desc":{"type":"string","minLength":1,"maxLength":2000},"bodies":{"type":"object","properties":{"Sun":{"type":"string","minLength":1,"maxLength":40},"Moon":{"type":"string","minLength":1,"maxLength":40},"Mercury":{"type":"string","minLength":1,"maxLength":40},"Venus":{"type":"string","minLength":1,"maxLength":40},"Mars":{"type":"string","minLength":1,"maxLength":40},"Jupiter":{"type":"string","minLength":1,"maxLength":40},"Saturn":{"type":"string","minLength":1,"maxLength":40},"Uranus":{"type":"string","minLength":1,"maxLength":40},"Neptune":{"type":"string","minLength":1,"maxLength":40},"Pluto":{"type":"string","minLength":1,"maxLength":40},"North Node":{"type":"string","minLength":1,"maxLength":40},"South Node":{"type":"string","minLength":1,"maxLength":40},"Chiron":{"type":"string","minLength":1,"maxLength":40},"Lilith":{"type":"string","minLength":1,"maxLength":40}}},"signs":{"type":"array","items":{"type":"string","minLength":1,"maxLength":40}},"retrograde":{"type":"string","minLength":1,"maxLength":40}},"additionalProperties":false,"description":"Your own words in place of the English the image would otherwise carry: the ASC/DSC/MC/IC axis labels, the SVG <title> and <desc> read by screen readers, and the planet and sign names plus the word for retrograde in each planet's data-label (theme css). bodies is keyed by the English name, signs lists twelve names from Aries. Nothing is translated for you; absent keys keep the English."}}}}}],"description":"Pair of natal charts for relationship calculations: synastry, composite, davison."},"CreateKey":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100},"mode":{"type":"string","enum":["live","test"]},"origin_restriction":{"type":"object","properties":{"type":{"type":"string","enum":["server-only","public"],"default":"server-only"},"allowed_origins":{"type":"array","items":{"type":"string","minLength":1,"maxLength":255},"maxItems":20}},"description":"server-only (default): a backend key that refuses any request carrying Origin or Referer. public: a publishable pk_ key for page source; needs allowed_origins, credits_cap_cycle and allowed_endpoints, and refuses a request with no verifiable origin."},"allowed_endpoints":{"type":"array","items":{"type":"string","minLength":1,"maxLength":80},"maxItems":30,"description":"Paths under /v1 this key may call, exact (chart) or a namespace (embed/*). Omitted means no limit; required for a publishable key."},"credits_cap_cycle":{"type":"integer","minimum":0,"maximum":1000000000,"description":"Credits this key may spend per billing cycle; 0 parks it. Omitted means no per-key cap; required for a publishable key."}},"required":["name"]},"SiteKeyIssue":{"type":"object","properties":{"site_url":{"type":"string","format":"uri","description":"The site home URL, https only. A subdirectory multisite uses the network home."},"proof_id":{"type":"string","format":"uuid","description":"UUID v4 the plugin generated for this attempt."},"proof":{"type":"string","minLength":43,"maxLength":43,"description":"32 random bytes, base64url. The site must serve the same value at its verify route."},"verify_url":{"type":"string","format":"uri","description":"The verify REST route when /wp-json/ is not available, e.g. https://example.com/?rest_route=/astroway/v1/verify. Same host as site_url."},"plugin_version":{"type":"string","maxLength":20}},"required":["site_url","proof_id","proof"]},"SiteConnectExchange":{"type":"object","properties":{"code":{"type":"string","minLength":43,"maxLength":43,"description":"The one-time code the dashboard appended to the return URL."},"site_url":{"type":"string","format":"uri","description":"The site home URL, the same one the site key was issued for."}},"required":["code","site_url"]},"UpdateKey":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100},"origin_restriction":{"type":"object","properties":{"type":{"type":"string","enum":["server-only","public"],"default":"public"},"allowed_origins":{"type":"array","items":{"type":"string","minLength":1,"maxLength":255},"maxItems":20}}},"credits_cap_cycle":{"anyOf":[{"type":"integer","minimum":0,"maximum":1000000000},{"nullable":true}]},"allowed_endpoints":{"anyOf":[{"type":"array","items":{"type":"string","minLength":1,"maxLength":80},"maxItems":30},{"nullable":true}]}}},"CyclicIndex":{"type":"object","properties":{"startYear":{"type":"number","nullable":true},"endYear":{"type":"number","nullable":true},"pairs":{"nullable":true}},"required":["startYear","endYear"]},"Daily":{"type":"object","properties":{"date":{"type":"string"}}},"DashaInput":{"allOf":[{"$ref":"#/components/schemas/ChartInput"},{"type":"object","properties":{"targetDate":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"targetTime":{"type":"string","pattern":"^\\d{2}:\\d{2}(:\\d{2})?$"},"targetTzOffset":{"type":"number","nullable":true}},"additionalProperties":{"nullable":true}}],"description":"Birth data for a single natal chart. Required: date (YYYY-MM-DD), time (HH:mm:ss), latitude and longitude in decimal degrees. The short forms lat, lon, lng and tz are rejected with 400 INVALID_FIELD; pass the full names. timezoneOffset is hours from UTC and defaults to 0, meaning UTC; send timezone instead (an IANA name such as Europe/Kyiv, or auto) and the offset for that date is worked out, summer time included. city is a display label only: nothing here geocodes it, so it never stands in for coordinates. houseSystem is a single Swiss Ephemeris letter, P by default; a name such as \"Placidus\" is refused, and the case matters because I and i are two different Sunshine systems."},"KundliInput":{"allOf":[{"$ref":"#/components/schemas/ChartInput"},{"type":"object","properties":{"targetDate":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"targetTime":{"type":"string","pattern":"^\\d{2}:\\d{2}(:\\d{2})?$"},"targetTzOffset":{"type":"number","nullable":true}},"additionalProperties":{"nullable":true}}],"description":"Birth data for a single natal chart. Required: date (YYYY-MM-DD), time (HH:mm:ss), latitude and longitude in decimal degrees. The short forms lat, lon, lng and tz are rejected with 400 INVALID_FIELD; pass the full names. timezoneOffset is hours from UTC and defaults to 0, meaning UTC; send timezone instead (an IANA name such as Europe/Kyiv, or auto) and the offset for that date is worked out, summer time included. city is a display label only: nothing here geocodes it, so it never stands in for coordinates. houseSystem is a single Swiss Ephemeris letter, P by default; a name such as \"Placidus\" is refused, and the case matters because I and i are two different Sunshine systems."},"Debate":{"type":"object","properties":{"topic":{"type":"string","minLength":4,"maxLength":800},"agentA":{"type":"string"},"agentB":{"type":"string"},"rounds":{"type":"integer","minimum":1,"maximum":4,"default":2},"chart":{"$ref":"#/components/schemas/ChartInput"},"language":{"type":"string","enum":["uk","en","ru","es","pl","de","fr","it","pt"],"default":"en"}},"required":["topic","agentA","agentB"]},"Decennials":{"allOf":[{"$ref":"#/components/schemas/ChartInput"},{"type":"object","properties":{"lifespanYears":{"type":"integer","minimum":20,"maximum":120,"default":90}},"additionalProperties":{"nullable":true}}],"description":"Birth data for a single natal chart. Required: date (YYYY-MM-DD), time (HH:mm:ss), latitude and longitude in decimal degrees. The short forms lat, lon, lng and tz are rejected with 400 INVALID_FIELD; pass the full names. timezoneOffset is hours from UTC and defaults to 0, meaning UTC; send timezone instead (an IANA name such as Europe/Kyiv, or auto) and the offset for that date is worked out, summer time included. city is a display label only: nothing here geocodes it, so it never stands in for coordinates. houseSystem is a single Swiss Ephemeris letter, P by default; a name such as \"Placidus\" is refused, and the case matters because I and i are two different Sunshine systems."},"Djamaspa":{"type":"object","properties":{"date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}},"required":["date"]},"EclipseAnalysis":{"allOf":[{"$ref":"#/components/schemas/NatalWrapper"},{"type":"object","properties":{"year":{"type":"number","nullable":true},"point":{"type":"object","properties":{"lat":{"type":"number","minimum":-90,"maximum":90},"lng":{"type":"number","minimum":-180,"maximum":180}},"required":["lat","lng"]},"yearsRange":{"type":"number","minimum":1e-9,"maximum":20}},"required":["year","point"]}],"description":"Wrapper { natal: ChartInput } used by endpoints that take a base natal plus extra parameters in flat fields."},"EclipsePath":{"type":"object","properties":{"path":{"type":"array","items":{"type":"object","properties":{"latitude":{"type":"number","minimum":-90,"maximum":90},"longitude":{"type":"number","minimum":-180,"maximum":180},"time":{"type":"string","maxLength":40}},"required":["latitude","longitude"]},"minItems":2,"maxItems":500},"centerlinePoints":{"type":"array","items":{"type":"object","properties":{"latitude":{"type":"number","minimum":-90,"maximum":90},"longitude":{"type":"number","minimum":-180,"maximum":180},"time":{"type":"string","maxLength":40}},"required":["latitude","longitude"]},"maxItems":500},"bandWidthDeg":{"type":"number","minimum":0.1,"maximum":20},"title":{"type":"string","maxLength":120},"options":{"type":"object","properties":{"size":{"type":"integer","minimum":200,"maximum":2000},"theme":{"type":"string","enum":["light","dark","console","css"],"description":"css paints every colour as var(--aw-<role>, <light colour>), so the page that inlines the SVG can recolour it with CSS custom properties (--aw-chart-bg, --aw-fg, --aw-muted, --aw-ring, --aw-houses-fill, --aw-benefic, --aw-malefic, --aw-aspect-harmonious, --aw-aspect-tense, --aw-aspect-neutral, --aw-aspect-minor, --aw-aspect-quintile, --aw-moon-shadow, --aw-moon-light, --aw-cycle-physical, --aw-cycle-emotional, --aw-cycle-intellectual). With none set it looks exactly like light. Inside an <img> the variables cannot be set, so it stays light. The Western wheels and the aspect grid then also carry stable aw-* classes, and each planet is a <g> with data-planet and data-label, each aspect line has data-a and data-b; see the @astroway/render changelog for the list."},"showAspects":{"type":"boolean"},"showRetrograde":{"type":"boolean"},"title":{"type":"string","maxLength":120},"format":{"type":"string","enum":["svg","json"],"default":"json"},"width":{"type":"integer","minimum":400,"maximum":3000},"height":{"type":"integer","minimum":200,"maximum":1500},"showGraticule":{"type":"boolean"},"pathColor":{"type":"string","maxLength":20}}}},"required":["path"]},"EclipseTotality":{"type":"object","properties":{"latitude":{"type":"number","nullable":true},"longitude":{"type":"number","nullable":true}}},"Eclipses":{"type":"object","properties":{"year":{"type":"number","nullable":true},"yearsRange":{"type":"number","minimum":1e-9,"maximum":20}},"required":["year"]},"ElectionalRange":{"type":"object","properties":{"chart1":{"$ref":"#/components/schemas/ChartInput"},"chart2":{"$ref":"#/components/schemas/ChartInput"},"startDate":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"endDate":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"latitude":{"type":"number","minimum":-90,"maximum":90},"longitude":{"type":"number","minimum":-180,"maximum":180}},"required":["chart1","chart2","startDate","endDate"]},"Ephemeris":{"type":"object","properties":{"startDate":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"endDate":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"stepDays":{"type":"number","nullable":true},"planetIds":{"type":"array","items":{"type":"integer","nullable":true,"minimum":0},"maxItems":32}},"required":["startDate","endDate"]},"Evict":{"type":"object","properties":{"api_key":{"type":"string","minLength":8,"maxLength":100},"wp_user_id":{"type":"integer","minimum":0,"exclusiveMinimum":true}}},"ExplainAspect":{"type":"object","properties":{"chart":{"$ref":"#/components/schemas/ChartInput"},"planet1":{"type":"string","minLength":2,"maxLength":40},"planet2":{"type":"string","minLength":2,"maxLength":40},"aspectType":{"type":"string","enum":["Conjunction","Sextile","Square","Trine","Opposition","Quincunx","Semi-square","Sesquiquadrate"]},"language":{"type":"string","enum":["uk","en","de","ru","pl","es","pt","hi","fr","ko","it","ja","id","tr","nl","ro","cs","vi","ar","el","hu"],"default":"uk"}},"required":["planet1","planet2","aspectType"]},"ExplainTransit":{"type":"object","properties":{"chart":{"$ref":"#/components/schemas/ChartInput"},"transitDate":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"transitPlanet":{"type":"string","minLength":2,"maxLength":40},"natalPlanet":{"type":"string","minLength":2,"maxLength":40},"aspectType":{"type":"string","enum":["Conjunction","Sextile","Square","Trine","Opposition"]},"language":{"type":"string","enum":["uk","en","de","ru","pl","es","pt","hi","fr","ko","it","ja","id","tr","nl","ro","cs","vi","ar","el","hu"],"default":"uk"}},"required":["chart","transitDate","transitPlanet","natalPlanet","aspectType"]},"FamilyPattern":{"type":"object","properties":{"parent1":{"$ref":"#/components/schemas/ChartInput"},"parent2":{"$ref":"#/components/schemas/ChartInput"},"child":{"$ref":"#/components/schemas/ChartInput"}},"required":["parent1","child"]},"Family":{"type":"object","properties":{"members":{"type":"array","items":{"allOf":[{"$ref":"#/components/schemas/ChartInput"},{"type":"object","properties":{"role":{"type":"string","enum":["parent","child","grandparent","sibling","spouse"]}},"additionalProperties":{"nullable":true}}],"description":"Birth data for a single natal chart. Required: date (YYYY-MM-DD), time (HH:mm:ss), latitude and longitude in decimal degrees. The short forms lat, lon, lng and tz are rejected with 400 INVALID_FIELD; pass the full names. timezoneOffset is hours from UTC and defaults to 0, meaning UTC; send timezone instead (an IANA name such as Europe/Kyiv, or auto) and the offset for that date is worked out, summer time included. city is a display label only: nothing here geocodes it, so it never stands in for coordinates. houseSystem is a single Swiss Ephemeris letter, P by default; a name such as \"Placidus\" is refused, and the case matters because I and i are two different Sunshine systems."},"minItems":2,"maxItems":8}},"required":["members"]},"FirstDate":{"type":"object","properties":{"chart1":{"$ref":"#/components/schemas/ChartInput"},"chart2":{"$ref":"#/components/schemas/ChartInput"},"date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"latitude":{"type":"number","minimum":-90,"maximum":90},"longitude":{"type":"number","minimum":-180,"maximum":180}},"required":["chart1","chart2","date"]},"ForecastCalendar":{"allOf":[{"$ref":"#/components/schemas/NatalWrapper"},{"type":"object","properties":{"year":{"type":"number","nullable":true}},"required":["year"]}],"description":"Wrapper { natal: ChartInput } used by endpoints that take a base natal plus extra parameters in flat fields."},"Genogram":{"type":"object","properties":{"grandparent":{"$ref":"#/components/schemas/ChartInput"},"parent":{"$ref":"#/components/schemas/ChartInput"},"child":{"$ref":"#/components/schemas/ChartInput"}},"required":["grandparent","parent","child"]},"Geodetic":{"type":"object","properties":{"latitude":{"type":"number","minimum":-90,"maximum":90},"longitude":{"type":"number","minimum":-180,"maximum":180},"method":{"type":"string","enum":["sepharial","johndro"],"default":"sepharial"},"year":{"type":"integer","minimum":-3000,"maximum":3000},"obliquity":{"type":"number","minimum":0,"maximum":90}},"required":["latitude","longitude"]},"HoraryInput":{"type":"object","properties":{"horaryNumber":{"type":"integer","minimum":1,"maximum":249},"date":{"type":"string"},"time":{"type":"string"},"timezoneOffset":{"type":"number","nullable":true,"minimum":-14,"maximum":14,"default":0,"description":"Hours from UTC at the given moment, not minutes. Fractional zones are hours too: 5.5 for India, 5.75 for Nepal, -3.5 for Newfoundland. Defaults to 0, meaning UTC. Ignored when timezone is sent."},"timezone":{"type":"string","example":"Europe/Kyiv","description":"IANA zone name such as Europe/Kyiv, or auto to look the zone up from latitude and longitude. The server takes the offset that zone kept at this local date and time, summer time included, and uses it in place of timezoneOffset. A clock time that happened twice takes the first occurrence; one skipped when clocks went forward takes the offset from before the change. Abbreviations such as EST are refused. Before 1970 the tz database is not reliable for every place, so send timezoneOffset when the local clock is known."},"latitude":{"type":"number","minimum":-90,"maximum":90},"longitude":{"type":"number","minimum":-180,"maximum":180},"ascendantAt":{"type":"string","enum":["middle","start"],"default":"middle","description":"Where in the number's segment the ascendant is placed: its centre (default) or its first degree. Sources differ; sign, star and sub are the same either way."},"ayanamsaId":{"type":"number","nullable":true},"ayanamsa":{"type":"string","enum":["fagan-bradley","lahiri","de-luce","raman","krishnamurti","kp","yukteshwar","jn-bhasin","true-citra","djwhal-khul"],"description":"Sidereal school by name. Lahiri when omitted. Equivalent to ayanamsaId; send either."}},"required":["horaryNumber","date","time","latitude","longitude"]},"InfluenceZone":{"type":"object","properties":{"latitude":{"type":"number","nullable":true},"longitude":{"type":"number","nullable":true},"azimuth":{"type":"number","nullable":true},"halfAngle":{"type":"number","nullable":true},"maxDistDeg":{"type":"number","nullable":true}},"required":["latitude","longitude","azimuth"]},"Ingress":{"type":"object","properties":{"days":{"type":"number","nullable":true}}},"Ingresses":{"type":"object","properties":{"planetId":{"type":"number","nullable":true},"startDate":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"endDate":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}},"required":["planetId","startDate","endDate"]},"InterpretElement":{"allOf":[{"$ref":"#/components/schemas/ChartInput"},{"type":"object","properties":{"language":{"type":"string","enum":["uk","en","de","pl","es","pt","fr","it","nl","cs","ro","hu","el","tr","ar","hi","ja","ko","vi","id","ru"]},"disclaimer_inline":{"type":"boolean","default":false}},"additionalProperties":{"nullable":true}}],"description":"Birth data for a single natal chart. Required: date (YYYY-MM-DD), time (HH:mm:ss), latitude and longitude in decimal degrees. The short forms lat, lon, lng and tz are rejected with 400 INVALID_FIELD; pass the full names. timezoneOffset is hours from UTC and defaults to 0, meaning UTC; send timezone instead (an IANA name such as Europe/Kyiv, or auto) and the offset for that date is worked out, summer time included. city is a display label only: nothing here geocodes it, so it never stands in for coordinates. houseSystem is a single Swiss Ephemeris letter, P by default; a name such as \"Placidus\" is refused, and the case matters because I and i are two different Sunshine systems."},"InterpretNatal":{"allOf":[{"$ref":"#/components/schemas/ChartInput"},{"type":"object","properties":{"language":{"type":"string","enum":["uk","en","de","pl","es","pt","fr","it","nl","cs","ro","hu","el","tr","ar","hi","ja","ko","vi","id","ru"]},"disclaimer_inline":{"type":"boolean","default":false}},"additionalProperties":{"nullable":true}}],"description":"Birth data for a single natal chart. Required: date (YYYY-MM-DD), time (HH:mm:ss), latitude and longitude in decimal degrees. The short forms lat, lon, lng and tz are rejected with 400 INVALID_FIELD; pass the full names. timezoneOffset is hours from UTC and defaults to 0, meaning UTC; send timezone instead (an IANA name such as Europe/Kyiv, or auto) and the offset for that date is worked out, summer time included. city is a display label only: nothing here geocodes it, so it never stands in for coordinates. houseSystem is a single Swiss Ephemeris letter, P by default; a name such as \"Placidus\" is refused, and the case matters because I and i are two different Sunshine systems."},"InterpretPlacement":{"allOf":[{"$ref":"#/components/schemas/ChartInput"},{"type":"object","properties":{"planet":{"type":"string","minLength":1},"language":{"type":"string","enum":["uk","en","de","pl","es","pt","fr","it","nl","cs","ro","hu","el","tr","ar","hi","ja","ko","vi","id","ru"]},"disclaimer_inline":{"type":"boolean","default":false}},"required":["planet"],"additionalProperties":{"nullable":true}}],"description":"Birth data for a single natal chart. Required: date (YYYY-MM-DD), time (HH:mm:ss), latitude and longitude in decimal degrees. The short forms lat, lon, lng and tz are rejected with 400 INVALID_FIELD; pass the full names. timezoneOffset is hours from UTC and defaults to 0, meaning UTC; send timezone instead (an IANA name such as Europe/Kyiv, or auto) and the offset for that date is worked out, summer time included. city is a display label only: nothing here geocodes it, so it never stands in for coordinates. houseSystem is a single Swiss Ephemeris letter, P by default; a name such as \"Placidus\" is refused, and the case matters because I and i are two different Sunshine systems."},"InterpretSynastry":{"allOf":[{"$ref":"#/components/schemas/TwoChart"},{"type":"object","properties":{"language":{"type":"string","enum":["uk","en","de","pl","es","pt","fr","it","nl","cs","ro","hu","el","tr","ar","hi","ja","ko","vi","id","ru"]},"disclaimer_inline":{"type":"boolean","default":false}}}],"description":"Pair of natal charts for relationship calculations: synastry, composite, davison."},"InterpretTarot":{"type":"object","properties":{"deck":{"type":"string","enum":["rider-waite","marseille","lenormand"],"default":"rider-waite"},"spread":{"type":"string","maxLength":60},"cards":{"type":"array","items":{"anyOf":[{"type":"string","minLength":1,"maxLength":80},{"type":"object","properties":{"slug":{"type":"string","minLength":1,"maxLength":80},"reversed":{"type":"boolean"}},"required":["slug"]},{"type":"object","properties":{"card":{"type":"object","properties":{"slug":{"type":"string","minLength":1,"maxLength":80}},"required":["slug"],"additionalProperties":{"nullable":true}},"reversed":{"type":"boolean"}},"required":["card"],"additionalProperties":{"nullable":true}}]},"minItems":1,"maxItems":36},"question":{"type":"string","maxLength":500},"language":{"type":"string","enum":["uk","en","de","pl","es","pt","fr","it","nl","cs","ro","hu","el","tr","ar","hi","ja","ko","vi","id","ru"]},"art":{"type":"string","maxLength":40,"description":"Card art set for the images in the answer. GET /v1/tarot/decks lists them."}},"required":["cards"]},"InterpretTransits":{"allOf":[{"$ref":"#/components/schemas/ChartInput"},{"type":"object","properties":{"transitDate":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"transitTime":{"type":"string","pattern":"^\\d{2}:\\d{2}(:\\d{2})?$"},"transitTzOffset":{"type":"number","nullable":true},"language":{"type":"string","enum":["uk","en","de","pl","es","pt","fr","it","nl","cs","ro","hu","el","tr","ar","hi","ja","ko","vi","id","ru"]},"disclaimer_inline":{"type":"boolean","default":false}},"required":["transitDate"],"additionalProperties":{"nullable":true}}],"description":"Birth data for a single natal chart. Required: date (YYYY-MM-DD), time (HH:mm:ss), latitude and longitude in decimal degrees. The short forms lat, lon, lng and tz are rejected with 400 INVALID_FIELD; pass the full names. timezoneOffset is hours from UTC and defaults to 0, meaning UTC; send timezone instead (an IANA name such as Europe/Kyiv, or auto) and the offset for that date is worked out, summer time included. city is a display label only: nothing here geocodes it, so it never stands in for coordinates. houseSystem is a single Swiss Ephemeris letter, P by default; a name such as \"Placidus\" is refused, and the case matters because I and i are two different Sunshine systems."},"Login":{"type":"object","properties":{"email":{"type":"string","format":"email"},"password":{"type":"string","minLength":1}},"required":["email","password"]},"Logo":{"type":"object","properties":{"data_url":{"type":"string","pattern":"^data:image\\/(png|jpeg|svg\\+xml|webp);base64,[A-Za-z0-9+/=]+$"}},"required":["data_url"],"additionalProperties":false},"LordOfPrediction":{"allOf":[{"$ref":"#/components/schemas/ChartInput"},{"type":"object","properties":{"targetAge":{"type":"integer","nullable":true,"minimum":0,"maximum":120}},"required":["targetAge"],"additionalProperties":{"nullable":true}}],"description":"Birth data for a single natal chart. Required: date (YYYY-MM-DD), time (HH:mm:ss), latitude and longitude in decimal degrees. The short forms lat, lon, lng and tz are rejected with 400 INVALID_FIELD; pass the full names. timezoneOffset is hours from UTC and defaults to 0, meaning UTC; send timezone instead (an IANA name such as Europe/Kyiv, or auto) and the offset for that date is worked out, summer time included. city is a display label only: nothing here geocodes it, so it never stands in for coordinates. houseSystem is a single Swiss Ephemeris letter, P by default; a name such as \"Placidus\" is refused, and the case matters because I and i are two different Sunshine systems."},"LunarCalendar":{"type":"object","properties":{"year":{"type":"number","nullable":true},"month":{"type":"number","nullable":true},"timezoneOffset":{"type":"number","minimum":-14,"maximum":14,"description":"Hours east of UTC. The calendar days become local days: date, isVoC (at local noon), phase and ingress per local day, and the month range itself. Omitted with no timezone: days run in UT."},"timezone":{"type":"string","maxLength":64,"description":"IANA zone, e.g. Europe/Kyiv. Wins over timezoneOffset and follows a DST change inside the month, day by day."}},"required":["year","month"]},"LunarReturn":{"allOf":[{"$ref":"#/components/schemas/ChartInput"},{"type":"object","properties":{"afterDate":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"afterTime":{"type":"string","pattern":"^\\d{2}:\\d{2}(:\\d{2})?$"},"afterTzOffset":{"type":"number","nullable":true},"locationLat":{"type":"number","nullable":true},"locationLng":{"type":"number","nullable":true}},"required":["afterDate"],"additionalProperties":{"nullable":true}}],"description":"Birth data for a single natal chart. Required: date (YYYY-MM-DD), time (HH:mm:ss), latitude and longitude in decimal degrees. The short forms lat, lon, lng and tz are rejected with 400 INVALID_FIELD; pass the full names. timezoneOffset is hours from UTC and defaults to 0, meaning UTC; send timezone instead (an IANA name such as Europe/Kyiv, or auto) and the offset for that date is worked out, summer time included. city is a display label only: nothing here geocodes it, so it never stands in for coordinates. houseSystem is a single Swiss Ephemeris letter, P by default; a name such as \"Placidus\" is refused, and the case matters because I and i are two different Sunshine systems."},"Monthly":{"type":"object","properties":{"chart":{"$ref":"#/components/schemas/ChartInput"},"year":{"type":"integer","minimum":1900,"maximum":2100},"month":{"type":"integer","minimum":1,"maximum":12},"language":{"type":"string","enum":["uk","en","de","ru","pl","es","pt","hi","fr","ko","it","ja","id","tr","nl","ro","cs","vi","ar","el","hu"],"default":"uk"},"tone":{"type":"string","enum":["warm","professional","concise"],"default":"warm"},"length":{"type":"string","enum":["short","medium","long"],"default":"medium"}},"required":["chart","year","month"]},"MoonAspects":{"type":"object","properties":{"year":{"type":"integer","minimum":1,"maximum":9999},"month":{"type":"integer","minimum":1,"maximum":12}},"required":["year","month"]},"MoonPhase":{"allOf":[{"$ref":"#/components/schemas/ChartInput"},{"type":"object","properties":{"options":{"type":"object","properties":{"size":{"type":"integer","minimum":200,"maximum":2000},"theme":{"type":"string","enum":["light","dark","console","css"],"description":"css paints every colour as var(--aw-<role>, <light colour>), so the page that inlines the SVG can recolour it with CSS custom properties (--aw-chart-bg, --aw-fg, --aw-muted, --aw-ring, --aw-houses-fill, --aw-benefic, --aw-malefic, --aw-aspect-harmonious, --aw-aspect-tense, --aw-aspect-neutral, --aw-aspect-minor, --aw-aspect-quintile, --aw-moon-shadow, --aw-moon-light, --aw-cycle-physical, --aw-cycle-emotional, --aw-cycle-intellectual). With none set it looks exactly like light. Inside an <img> the variables cannot be set, so it stays light. The Western wheels and the aspect grid then also carry stable aw-* classes, and each planet is a <g> with data-planet and data-label, each aspect line has data-a and data-b; see the @astroway/render changelog for the list."},"showAspects":{"type":"boolean"},"showRetrograde":{"type":"boolean"},"title":{"type":"string","maxLength":120},"format":{"type":"string","enum":["svg","json"],"default":"json"},"showLabel":{"type":"boolean"}}}},"additionalProperties":{"nullable":true}}],"description":"Birth data for a single natal chart. Required: date (YYYY-MM-DD), time (HH:mm:ss), latitude and longitude in decimal degrees. The short forms lat, lon, lng and tz are rejected with 400 INVALID_FIELD; pass the full names. timezoneOffset is hours from UTC and defaults to 0, meaning UTC; send timezone instead (an IANA name such as Europe/Kyiv, or auto) and the offset for that date is worked out, summer time included. city is a display label only: nothing here geocodes it, so it never stands in for coordinates. houseSystem is a single Swiss Ephemeris letter, P by default; a name such as \"Placidus\" is refused, and the case matters because I and i are two different Sunshine systems."},"MuhuratWindow":{"type":"object","properties":{"search_window_start":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"search_window_end":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"latitude":{"type":"number","nullable":true,"default":0},"longitude":{"type":"number","nullable":true,"default":0},"timezoneOffset":{"type":"number","nullable":true,"minimum":-14,"maximum":14,"default":0,"description":"Hours from UTC at the given moment, not minutes. Fractional zones are hours too: 5.5 for India, 5.75 for Nepal, -3.5 for Newfoundland. Defaults to 0, meaning UTC."},"ayanamsaId":{"type":"number","nullable":true},"ayanamsa":{"type":"string","enum":["fagan-bradley","lahiri","de-luce","raman","krishnamurti","kp","yukteshwar","jn-bhasin","true-citra","djwhal-khul"],"description":"Sidereal school by name. Lahiri when omitted. Equivalent to ayanamsaId; send either."},"topN":{"type":"integer","minimum":1,"maximum":60,"default":10}},"required":["search_window_start"],"additionalProperties":{"nullable":true}},"MultiAgent":{"type":"object","properties":{"question":{"type":"string","minLength":4,"maxLength":2000},"agents":{"type":"array","items":{"type":"string"},"minItems":2,"maxItems":4},"chart":{"$ref":"#/components/schemas/ChartInput"},"language":{"type":"string","enum":["uk","en","ru","es","pl","de","fr","it","pt"],"default":"en"}},"required":["question","agents"]},"MultiForecast":{"allOf":[{"$ref":"#/components/schemas/ChartInput"},{"type":"object","properties":{"targetDate":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}},"required":["targetDate"],"additionalProperties":{"nullable":true}}],"description":"Birth data for a single natal chart. Required: date (YYYY-MM-DD), time (HH:mm:ss), latitude and longitude in decimal degrees. The short forms lat, lon, lng and tz are rejected with 400 INVALID_FIELD; pass the full names. timezoneOffset is hours from UTC and defaults to 0, meaning UTC; send timezone instead (an IANA name such as Europe/Kyiv, or auto) and the offset for that date is worked out, summer time included. city is a display label only: nothing here geocodes it, so it never stands in for coordinates. houseSystem is a single Swiss Ephemeris letter, P by default; a name such as \"Placidus\" is refused, and the case matters because I and i are two different Sunshine systems."},"BrandingObject":{"type":"object","properties":{"companyName":{"type":"string","minLength":1,"maxLength":80},"companyUrl":{"type":"string","format":"uri"},"companyEmail":{"type":"string","format":"email"},"companyMobile":{"type":"string","maxLength":40},"companyBio":{"type":"string","maxLength":500},"logoUrl":{"type":"string","format":"uri"},"frontImage":{"type":"string","format":"uri"},"textPrimaryColor":{"type":"string","pattern":"^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$"},"textSecondaryColor":{"type":"string","pattern":"^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$"},"backgroundColor":{"type":"string","pattern":"^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$"},"themeColor":{"type":"string","pattern":"^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$","description":"Accent colour, used for section heading text and inline emphasis."},"headingColor":{"type":"string","pattern":"^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$","description":"Colour of the divider rule under each section heading (not the heading text, which is themeColor)."},"footerText":{"type":"string","maxLength":200},"fontPairing":{"type":"string","enum":["serif-sans","sans-serif","serif-only","sans-only","system"]},"reportName":{"type":"string","minLength":1,"maxLength":80}},"additionalProperties":false},"GenerateReport":{"type":"object","properties":{"report_type":{"type":"string","enum":["natal","transit-yearly","synastry","business","career","love","money","child","lal-kitab","human-design","tarot","vedic-kundli"]},"chart":{"allOf":[{"$ref":"#/components/schemas/ChartInput"},{"type":"object","properties":{"latitude":{"type":"number","minimum":-90,"maximum":90,"description":"Birth latitude. Required here: the whole document is computed from it."},"longitude":{"type":"number","minimum":-180,"maximum":180,"description":"Birth longitude. Required here: the whole document is computed from it."}},"additionalProperties":{"nullable":true}}],"description":"Birth data for a single natal chart. Required: date (YYYY-MM-DD), time (HH:mm:ss), latitude and longitude in decimal degrees. The short forms lat, lon, lng and tz are rejected with 400 INVALID_FIELD; pass the full names. timezoneOffset is hours from UTC and defaults to 0, meaning UTC; send timezone instead (an IANA name such as Europe/Kyiv, or auto) and the offset for that date is worked out, summer time included. city is a display label only: nothing here geocodes it, so it never stands in for coordinates. houseSystem is a single Swiss Ephemeris letter, P by default; a name such as \"Placidus\" is refused, and the case matters because I and i are two different Sunshine systems."},"chart1":{"allOf":[{"$ref":"#/components/schemas/ChartInput"},{"type":"object","properties":{"latitude":{"type":"number","minimum":-90,"maximum":90,"description":"Birth latitude. Required here: the whole document is computed from it."},"longitude":{"type":"number","minimum":-180,"maximum":180,"description":"Birth longitude. Required here: the whole document is computed from it."}},"additionalProperties":{"nullable":true}}],"description":"Birth data for a single natal chart. Required: date (YYYY-MM-DD), time (HH:mm:ss), latitude and longitude in decimal degrees. The short forms lat, lon, lng and tz are rejected with 400 INVALID_FIELD; pass the full names. timezoneOffset is hours from UTC and defaults to 0, meaning UTC; send timezone instead (an IANA name such as Europe/Kyiv, or auto) and the offset for that date is worked out, summer time included. city is a display label only: nothing here geocodes it, so it never stands in for coordinates. houseSystem is a single Swiss Ephemeris letter, P by default; a name such as \"Placidus\" is refused, and the case matters because I and i are two different Sunshine systems."},"chart2":{"allOf":[{"$ref":"#/components/schemas/ChartInput"},{"type":"object","properties":{"latitude":{"type":"number","minimum":-90,"maximum":90,"description":"Birth latitude. Required here: the whole document is computed from it."},"longitude":{"type":"number","minimum":-180,"maximum":180,"description":"Birth longitude. Required here: the whole document is computed from it."}},"additionalProperties":{"nullable":true}}],"description":"Birth data for a single natal chart. Required: date (YYYY-MM-DD), time (HH:mm:ss), latitude and longitude in decimal degrees. The short forms lat, lon, lng and tz are rejected with 400 INVALID_FIELD; pass the full names. timezoneOffset is hours from UTC and defaults to 0, meaning UTC; send timezone instead (an IANA name such as Europe/Kyiv, or auto) and the offset for that date is worked out, summer time included. city is a display label only: nothing here geocodes it, so it never stands in for coordinates. houseSystem is a single Swiss Ephemeris letter, P by default; a name such as \"Placidus\" is refused, and the case matters because I and i are two different Sunshine systems."},"year":{"type":"integer","minimum":1900,"maximum":2100},"spread":{"type":"string","maxLength":64},"seed":{"type":"integer","nullable":true},"name":{"type":"string","maxLength":100},"allowReversed":{"type":"boolean"},"language":{"type":"string","enum":["uk","en","de","ru","pl","es","pt","hi","fr","ko","it","ja","id","tr","nl","ro","cs","vi","ar","el","hu"]},"whitelabel":{"anyOf":[{"type":"boolean"},{"type":"object","properties":{"companyName":{"type":"string","minLength":1,"maxLength":80},"companyUrl":{"type":"string","format":"uri"},"companyEmail":{"type":"string","format":"email"},"companyMobile":{"type":"string","maxLength":40},"companyBio":{"type":"string","maxLength":500},"logoUrl":{"type":"string","format":"uri"},"frontImage":{"type":"string","format":"uri"},"textPrimaryColor":{"type":"string","pattern":"^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$"},"textSecondaryColor":{"type":"string","pattern":"^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$"},"backgroundColor":{"type":"string","pattern":"^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$"},"themeColor":{"type":"string","pattern":"^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$","description":"Accent colour, used for section heading text and inline emphasis."},"headingColor":{"type":"string","pattern":"^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$","description":"Colour of the divider rule under each section heading (not the heading text, which is themeColor)."},"footerText":{"type":"string","maxLength":200},"fontPairing":{"type":"string","enum":["serif-sans","sans-serif","serif-only","sans-only","system"]},"reportName":{"type":"string","minLength":1,"maxLength":80}},"additionalProperties":false}]},"depth":{"type":"string","enum":["standard","extended"],"description":"`extended` (10000 credits) adds the chart wheel and a chapter for each of Sun to Pluto, Chiron and the Ascendant in its sign, from edited texts with no AI at request time. Available in the 20 languages of `/v1/natal-texts`."}},"required":["report_type"]},"NatalReport":{"type":"object","properties":{"chart":{"allOf":[{"$ref":"#/components/schemas/ChartInput"},{"type":"object","properties":{"latitude":{"type":"number","minimum":-90,"maximum":90,"description":"Birth latitude. Required here: the whole document is computed from it."},"longitude":{"type":"number","minimum":-180,"maximum":180,"description":"Birth longitude. Required here: the whole document is computed from it."}},"additionalProperties":{"nullable":true}}],"description":"Birth data for a single natal chart. Required: date (YYYY-MM-DD), time (HH:mm:ss), latitude and longitude in decimal degrees. The short forms lat, lon, lng and tz are rejected with 400 INVALID_FIELD; pass the full names. timezoneOffset is hours from UTC and defaults to 0, meaning UTC; send timezone instead (an IANA name such as Europe/Kyiv, or auto) and the offset for that date is worked out, summer time included. city is a display label only: nothing here geocodes it, so it never stands in for coordinates. houseSystem is a single Swiss Ephemeris letter, P by default; a name such as \"Placidus\" is refused, and the case matters because I and i are two different Sunshine systems."},"language":{"type":"string","enum":["uk","en","de","ru","pl","es","pt","hi","fr","ko","it","ja","id","tr","nl","ro","cs","vi","ar","el","hu"]},"whitelabel":{"anyOf":[{"type":"boolean"},{"type":"object","properties":{"companyName":{"type":"string","minLength":1,"maxLength":80},"companyUrl":{"type":"string","format":"uri"},"companyEmail":{"type":"string","format":"email"},"companyMobile":{"type":"string","maxLength":40},"companyBio":{"type":"string","maxLength":500},"logoUrl":{"type":"string","format":"uri"},"frontImage":{"type":"string","format":"uri"},"textPrimaryColor":{"type":"string","pattern":"^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$"},"textSecondaryColor":{"type":"string","pattern":"^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$"},"backgroundColor":{"type":"string","pattern":"^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$"},"themeColor":{"type":"string","pattern":"^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$","description":"Accent colour, used for section heading text and inline emphasis."},"headingColor":{"type":"string","pattern":"^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$","description":"Colour of the divider rule under each section heading (not the heading text, which is themeColor)."},"footerText":{"type":"string","maxLength":200},"fontPairing":{"type":"string","enum":["serif-sans","sans-serif","serif-only","sans-only","system"]},"reportName":{"type":"string","minLength":1,"maxLength":80}},"additionalProperties":false}]},"enrich":{"type":"boolean"},"tone":{"type":"string","enum":["warm","professional","concise"]},"length":{"type":"string","enum":["short","medium","long"]},"depth":{"type":"string","enum":["standard","extended"],"description":"`extended` (10000 credits) adds the chart wheel and a chapter for each of Sun to Pluto, Chiron and the Ascendant in its sign, from edited texts with no AI at request time. Available in the 20 languages of `/v1/natal-texts`."}},"required":["chart"]},"RelocationReport":{"type":"object","properties":{"chart":{"allOf":[{"$ref":"#/components/schemas/ChartInput"},{"type":"object","properties":{"latitude":{"type":"number","minimum":-90,"maximum":90,"description":"Birth latitude. Required here: the whole document is computed from it."},"longitude":{"type":"number","minimum":-180,"maximum":180,"description":"Birth longitude. Required here: the whole document is computed from it."}},"additionalProperties":{"nullable":true}}],"description":"Birth data for a single natal chart. Required: date (YYYY-MM-DD), time (HH:mm:ss), latitude and longitude in decimal degrees. The short forms lat, lon, lng and tz are rejected with 400 INVALID_FIELD; pass the full names. timezoneOffset is hours from UTC and defaults to 0, meaning UTC; send timezone instead (an IANA name such as Europe/Kyiv, or auto) and the offset for that date is worked out, summer time included. city is a display label only: nothing here geocodes it, so it never stands in for coordinates. houseSystem is a single Swiss Ephemeris letter, P by default; a name such as \"Placidus\" is refused, and the case matters because I and i are two different Sunshine systems."},"locations":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":120},"latitude":{"type":"number","minimum":-90,"maximum":90},"longitude":{"type":"number","minimum":-180,"maximum":180}},"required":["latitude","longitude"]},"minItems":1,"maxItems":5},"categories":{"type":"array","items":{"type":"string"},"maxItems":19},"orbKm":{"type":"number","minimum":100,"maximum":3000},"language":{"type":"string","enum":["uk","en","de","ru","pl","es","pt","hi","fr","ko","it","ja","id","tr","nl","ro","cs","vi","ar","el","hu"]},"whitelabel":{"anyOf":[{"type":"boolean"},{"type":"object","properties":{"companyName":{"type":"string","minLength":1,"maxLength":80},"companyUrl":{"type":"string","format":"uri"},"companyEmail":{"type":"string","format":"email"},"companyMobile":{"type":"string","maxLength":40},"companyBio":{"type":"string","maxLength":500},"logoUrl":{"type":"string","format":"uri"},"frontImage":{"type":"string","format":"uri"},"textPrimaryColor":{"type":"string","pattern":"^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$"},"textSecondaryColor":{"type":"string","pattern":"^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$"},"backgroundColor":{"type":"string","pattern":"^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$"},"themeColor":{"type":"string","pattern":"^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$","description":"Accent colour, used for section heading text and inline emphasis."},"headingColor":{"type":"string","pattern":"^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$","description":"Colour of the divider rule under each section heading (not the heading text, which is themeColor)."},"footerText":{"type":"string","maxLength":200},"fontPairing":{"type":"string","enum":["serif-sans","sans-serif","serif-only","sans-only","system"]},"reportName":{"type":"string","minLength":1,"maxLength":80}},"additionalProperties":false}]}},"required":["chart","locations"]},"GemstoneReport":{"type":"object","properties":{"chart":{"allOf":[{"$ref":"#/components/schemas/ChartInput"},{"type":"object","properties":{"latitude":{"type":"number","minimum":-90,"maximum":90,"description":"Birth latitude. Required here: the whole document is computed from it."},"longitude":{"type":"number","minimum":-180,"maximum":180,"description":"Birth longitude. Required here: the whole document is computed from it."}},"additionalProperties":{"nullable":true}}],"description":"Birth data for a single natal chart. Required: date (YYYY-MM-DD), time (HH:mm:ss), latitude and longitude in decimal degrees. The short forms lat, lon, lng and tz are rejected with 400 INVALID_FIELD; pass the full names. timezoneOffset is hours from UTC and defaults to 0, meaning UTC; send timezone instead (an IANA name such as Europe/Kyiv, or auto) and the offset for that date is worked out, summer time included. city is a display label only: nothing here geocodes it, so it never stands in for coordinates. houseSystem is a single Swiss Ephemeris letter, P by default; a name such as \"Placidus\" is refused, and the case matters because I and i are two different Sunshine systems."},"school":{"type":"string","enum":["lagna-lord","functional-benefic"]},"wearingFrom":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"language":{"type":"string","enum":["uk","en","de","ru","pl","es","pt","hi","fr","ko","it","ja","id","tr","nl","ro","cs","vi","ar","el","hu"]},"whitelabel":{"anyOf":[{"type":"boolean"},{"type":"object","properties":{"companyName":{"type":"string","minLength":1,"maxLength":80},"companyUrl":{"type":"string","format":"uri"},"companyEmail":{"type":"string","format":"email"},"companyMobile":{"type":"string","maxLength":40},"companyBio":{"type":"string","maxLength":500},"logoUrl":{"type":"string","format":"uri"},"frontImage":{"type":"string","format":"uri"},"textPrimaryColor":{"type":"string","pattern":"^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$"},"textSecondaryColor":{"type":"string","pattern":"^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$"},"backgroundColor":{"type":"string","pattern":"^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$"},"themeColor":{"type":"string","pattern":"^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$","description":"Accent colour, used for section heading text and inline emphasis."},"headingColor":{"type":"string","pattern":"^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$","description":"Colour of the divider rule under each section heading (not the heading text, which is themeColor)."},"footerText":{"type":"string","maxLength":200},"fontPairing":{"type":"string","enum":["serif-sans","sans-serif","serif-only","sans-only","system"]},"reportName":{"type":"string","minLength":1,"maxLength":80}},"additionalProperties":false}]}},"required":["chart"]},"Natal":{"type":"object","properties":{"chart":{"$ref":"#/components/schemas/ChartInput"},"language":{"type":"string","enum":["uk","en","de","ru","pl","es","pt","hi","fr","ko","it","ja","id","tr","nl","ro","cs","vi","ar","el","hu"],"default":"uk"},"tone":{"type":"string","enum":["warm","professional","concise"],"default":"warm"},"length":{"type":"string","enum":["short","medium","long"],"default":"medium"}},"required":["chart"]},"NatalTargetTnp":{"type":"object","properties":{"date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"time":{"type":"string","pattern":"^\\d{2}:\\d{2}(:\\d{2})?$"},"timezoneOffset":{"type":"number","nullable":true,"minimum":-14,"maximum":14,"default":0,"description":"Hours from UTC at the given moment, not minutes. Fractional zones are hours too: 5.5 for India, 5.75 for Nepal, -3.5 for Newfoundland. Defaults to 0, meaning UTC. Ignored when timezone is sent."},"timezone":{"type":"string","example":"Europe/Kyiv","description":"IANA zone name such as Europe/Kyiv, or auto to look the zone up from latitude and longitude. The server takes the offset that zone kept at this local date and time, summer time included, and uses it in place of timezoneOffset. A clock time that happened twice takes the first occurrence; one skipped when clocks went forward takes the offset from before the change. Abbreviations such as EST are refused. Before 1970 the tz database is not reliable for every place, so send timezoneOffset when the local clock is known."},"latitude":{"type":"number","minimum":-90,"maximum":90},"longitude":{"type":"number","minimum":-180,"maximum":180},"houseSystem":{"type":"string","enum":["P","K","R","C","E","W","B","M","O","A","T","V","D","F","G","H","I","i","L","N","Q","S","U","X","Y"],"default":"P"},"name":{"type":"string","default":""},"city":{"type":"string","default":""},"zodiacType":{"type":"string","enum":["tropical","sidereal"]},"ayanamsaId":{"type":"number","nullable":true},"ayanamsa":{"type":"string","enum":["fagan-bradley","lahiri","de-luce","raman","krishnamurti","kp","yukteshwar","jn-bhasin","true-citra","djwhal-khul"],"description":"Sidereal school by name. Lahiri when omitted. Equivalent to ayanamsaId; send either."},"cosmogram":{"type":"boolean"},"targetDate":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"targetTime":{"type":"string","pattern":"^\\d{2}:\\d{2}(:\\d{2})?$"},"targetTzOffset":{"type":"number","nullable":true},"converse":{"type":"boolean"},"withTnp":{"type":"boolean"}},"required":["date","time","latitude","longitude","targetDate"]},"Nine":{"type":"object","properties":{"seed":{"anyOf":[{"type":"number"},{"type":"string"}]},"question":{"type":"string","maxLength":400},"allowReversed":{"type":"boolean","default":true}}},"ParentChild":{"type":"object","properties":{"parent":{"$ref":"#/components/schemas/ChartInput"},"child":{"$ref":"#/components/schemas/ChartInput"}},"required":["parent","child"]},"Penta":{"type":"object","properties":{"inputs":{"type":"array","items":{"$ref":"#/components/schemas/ChartInput"},"minItems":3,"maxItems":5}},"required":["inputs"]},"Perfections":{"allOf":[{"$ref":"#/components/schemas/ChartInput"},{"type":"object","properties":{"targetAge":{"type":"integer","nullable":true,"minimum":0,"maximum":120}},"required":["targetAge"],"additionalProperties":{"nullable":true}}],"description":"Birth data for a single natal chart. Required: date (YYYY-MM-DD), time (HH:mm:ss), latitude and longitude in decimal degrees. The short forms lat, lon, lng and tz are rejected with 400 INVALID_FIELD; pass the full names. timezoneOffset is hours from UTC and defaults to 0, meaning UTC; send timezone instead (an IANA name such as Europe/Kyiv, or auto) and the offset for that date is worked out, summer time included. city is a display label only: nothing here geocodes it, so it never stands in for coordinates. houseSystem is a single Swiss Ephemeris letter, P by default; a name such as \"Placidus\" is refused, and the case matters because I and i are two different Sunshine systems."},"PhaseReturn":{"allOf":[{"$ref":"#/components/schemas/ChartInput"},{"type":"object","properties":{"startYear":{"type":"number","nullable":true},"endYear":{"type":"number","nullable":true}},"required":["startYear","endYear"],"additionalProperties":{"nullable":true}}],"description":"Birth data for a single natal chart. Required: date (YYYY-MM-DD), time (HH:mm:ss), latitude and longitude in decimal degrees. The short forms lat, lon, lng and tz are rejected with 400 INVALID_FIELD; pass the full names. timezoneOffset is hours from UTC and defaults to 0, meaning UTC; send timezone instead (an IANA name such as Europe/Kyiv, or auto) and the offset for that date is worked out, summer time included. city is a display label only: nothing here geocodes it, so it never stands in for coordinates. houseSystem is a single Swiss Ephemeris letter, P by default; a name such as \"Placidus\" is refused, and the case matters because I and i are two different Sunshine systems."},"PlanetHouseEffect":{"type":"object","properties":{"planet":{"type":"integer"},"house":{"type":"integer","minimum":1,"maximum":12}},"required":["planet","house"]},"PlanetaryCycles":{"type":"object","properties":{"planet1Id":{"type":"number","nullable":true},"planet2Id":{"type":"number","nullable":true},"startDate":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"endDate":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}},"required":["planet1Id","planet2Id","startDate","endDate"]},"PlanetaryHour":{"type":"object","properties":{"latitude":{"type":"number","nullable":true},"longitude":{"type":"number","nullable":true},"timezoneOffset":{"type":"number","nullable":true,"minimum":-14,"maximum":14,"default":0,"description":"Hours from UTC at the given moment, not minutes. Fractional zones are hours too: 5.5 for India, 5.75 for Nepal, -3.5 for Newfoundland. Defaults to 0, meaning UTC."}},"required":["latitude","longitude"]},"PlanetaryHours":{"type":"object","properties":{"date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"latitude":{"type":"number","nullable":true},"longitude":{"type":"number","nullable":true},"timezoneOffset":{"type":"number","nullable":true,"minimum":-14,"maximum":14,"default":0,"description":"Hours from UTC at the given moment, not minutes. Fractional zones are hours too: 5.5 for India, 5.75 for Nepal, -3.5 for Newfoundland. Defaults to 0, meaning UTC. Ignored when timezone is sent."},"timezone":{"type":"string","example":"Europe/Kyiv","description":"IANA zone name such as Europe/Kyiv, or auto to look the zone up from latitude and longitude. The server takes the offset that zone kept at this local date and time, summer time included, and uses it in place of timezoneOffset. A clock time that happened twice takes the first occurrence; one skipped when clocks went forward takes the offset from before the change. Abbreviations such as EST are refused. Before 1970 the tz database is not reliable for every place, so send timezoneOffset when the local clock is known."},"atLocalHour":{"type":"number","minimum":0,"maximum":24,"description":"Local time of day in decimal hours, e.g. 15.2 for 15:12. When sent, the hour containing it carries isCurrent: true and every other hour carries false. When omitted, no hour carries the field at all: it is not false, it is unasked.","example":15.2}},"required":["date","latitude","longitude"]},"HoraryPlanetaryHours":{"type":"object","properties":{"dayOfWeek":{"type":"number","nullable":true},"sunriseHour":{"type":"number","nullable":true},"sunsetHour":{"type":"number","nullable":true},"currentHour":{"type":"number","nullable":true}},"required":["dayOfWeek","sunriseHour","sunsetHour"]},"McpMultiChart":{"type":"object","properties":{"charts":{"type":"array","items":{"$ref":"#/components/schemas/ChartInput"},"minItems":1,"maxItems":6},"intent":{"type":"string","enum":["compatibility","family","group","forecast"]}},"required":["charts"]},"TeamCompatibility":{"type":"object","properties":{"founder":{"$ref":"#/components/schemas/ChartInput"},"partner":{"$ref":"#/components/schemas/ChartInput"}},"required":["founder","partner"]},"PlanetaryReturn":{"allOf":[{"$ref":"#/components/schemas/ChartInput"},{"type":"object","properties":{"planetId":{"type":"number","nullable":true},"year":{"type":"number","nullable":true},"locationLat":{"type":"number","nullable":true},"locationLng":{"type":"number","nullable":true}},"required":["planetId","year"],"additionalProperties":{"nullable":true}}],"description":"Birth data for a single natal chart. Required: date (YYYY-MM-DD), time (HH:mm:ss), latitude and longitude in decimal degrees. The short forms lat, lon, lng and tz are rejected with 400 INVALID_FIELD; pass the full names. timezoneOffset is hours from UTC and defaults to 0, meaning UTC; send timezone instead (an IANA name such as Europe/Kyiv, or auto) and the offset for that date is worked out, summer time included. city is a display label only: nothing here geocodes it, so it never stands in for coordinates. houseSystem is a single Swiss Ephemeris letter, P by default; a name such as \"Placidus\" is refused, and the case matters because I and i are two different Sunshine systems."},"Positions":{"type":"object","properties":{}},"Preview":{"type":"object","properties":{"chart":{"nullable":true},"language":{"type":"string","enum":["uk","en","de","ru","pl","es","pt","hi","fr","ko","it","ja","id","tr","nl","ro","cs","vi","ar","el","hu"]}}},"Profections":{"allOf":[{"$ref":"#/components/schemas/ChartInput"},{"type":"object","properties":{"targetAge":{"type":"integer","nullable":true,"minimum":0,"maximum":120}},"required":["targetAge"],"additionalProperties":{"nullable":true}}],"description":"Birth data for a single natal chart. Required: date (YYYY-MM-DD), time (HH:mm:ss), latitude and longitude in decimal degrees. The short forms lat, lon, lng and tz are rejected with 400 INVALID_FIELD; pass the full names. timezoneOffset is hours from UTC and defaults to 0, meaning UTC; send timezone instead (an IANA name such as Europe/Kyiv, or auto) and the offset for that date is worked out, summer time included. city is a display label only: nothing here geocodes it, so it never stands in for coordinates. houseSystem is a single Swiss Ephemeris letter, P by default; a name such as \"Placidus\" is refused, and the case matters because I and i are two different Sunshine systems."},"QuarterLord":{"allOf":[{"$ref":"#/components/schemas/ChartInput"},{"type":"object","properties":{"targetDate":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}},"required":["targetDate"],"additionalProperties":{"nullable":true}}],"description":"Birth data for a single natal chart. Required: date (YYYY-MM-DD), time (HH:mm:ss), latitude and longitude in decimal degrees. The short forms lat, lon, lng and tz are rejected with 400 INVALID_FIELD; pass the full names. timezoneOffset is hours from UTC and defaults to 0, meaning UTC; send timezone instead (an IANA name such as Europe/Kyiv, or auto) and the offset for that date is worked out, summer time included. city is a display label only: nothing here geocodes it, so it never stands in for coordinates. houseSystem is a single Swiss Ephemeris letter, P by default; a name such as \"Placidus\" is refused, and the case matters because I and i are two different Sunshine systems."},"Question":{"type":"object","properties":{"question":{"type":"string","minLength":2,"maxLength":500}},"required":["question"]},"Rag":{"type":"object","properties":{"query":{"type":"string","minLength":2,"maxLength":400},"chart":{"$ref":"#/components/schemas/ChartInput"},"topK":{"type":"integer","minimum":1,"maximum":20,"default":5}},"required":["query","chart"]},"Rectification":{"type":"object","properties":{"baseInput":{"$ref":"#/components/schemas/ChartInput"},"events":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"type":{"type":"string","enum":["marriage","divorce","child","death_close","career","move","illness","education","accident","other"],"default":"other"},"description":{"type":"string"},"weight":{"type":"number","minimum":0,"exclusiveMinimum":true,"maximum":3,"default":1}},"required":["date"]},"minItems":1,"maxItems":20},"searchRangeMinutes":{"type":"number","minimum":1e-9,"maximum":1440},"stepMinutes":{"type":"number","minimum":0.5,"maximum":240},"methods":{"type":"object","properties":{"symbolic":{"type":"boolean"},"primary":{"type":"boolean"},"progression":{"type":"boolean"}}},"orb":{"type":"number","minimum":1e-9,"maximum":15}},"required":["baseInput","events"]},"Register":{"type":"object","properties":{"url":{"type":"string","maxLength":2048,"format":"uri"}},"required":["url"]},"Relocation":{"allOf":[{"$ref":"#/components/schemas/NatalWrapper"},{"type":"object","properties":{"target":{"type":"object","properties":{"latitude":{"type":"number","nullable":true},"longitude":{"type":"number","nullable":true},"city":{"type":"string"}},"required":["latitude","longitude"]}},"required":["target"]}],"description":"Wrapper { natal: ChartInput } used by endpoints that take a base natal plus extra parameters in flat fields."},"Remedies":{"allOf":[{"$ref":"#/components/schemas/ChartInput"},{"type":"object","properties":{"planet":{"type":"integer"}},"additionalProperties":{"nullable":true}}],"description":"Birth data for a single natal chart. Required: date (YYYY-MM-DD), time (HH:mm:ss), latitude and longitude in decimal degrees. The short forms lat, lon, lng and tz are rejected with 400 INVALID_FIELD; pass the full names. timezoneOffset is hours from UTC and defaults to 0, meaning UTC; send timezone instead (an IANA name such as Europe/Kyiv, or auto) and the offset for that date is worked out, summer time included. city is a display label only: nothing here geocodes it, so it never stands in for coordinates. houseSystem is a single Swiss Ephemeris letter, P by default; a name such as \"Placidus\" is refused, and the case matters because I and i are two different Sunshine systems."},"ResetConfirm":{"type":"object","properties":{"token":{"type":"string","minLength":64,"maxLength":64},"email":{"type":"string","format":"email"},"password":{"type":"string","minLength":8,"maxLength":100}},"required":["token","email","password"]},"ResetRequest":{"type":"object","properties":{"email":{"type":"string","format":"email"}},"required":["email"]},"Retrograde":{"type":"object","properties":{"startDate":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"endDate":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"planetIds":{"type":"array","items":{"type":"integer","nullable":true,"minimum":0},"maxItems":32}},"required":["startDate","endDate"]},"Sabian":{"type":"object","properties":{"longitudes":{"type":"array","items":{"type":"number","nullable":true},"minItems":1,"maxItems":360}},"required":["longitudes"]},"ShoolaInput":{"allOf":[{"$ref":"#/components/schemas/ChartInput"},{"type":"object","properties":{"targetDate":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"targetTime":{"type":"string","pattern":"^\\d{2}:\\d{2}(:\\d{2})?$"},"targetTzOffset":{"type":"number","nullable":true},"houseIndex":{"type":"integer","minimum":1,"maximum":12},"antardasaSeedOption":{"anyOf":[{"type":"number","enum":[1]},{"type":"number","enum":[2]},{"type":"number","enum":[3]}]}},"additionalProperties":{"nullable":true}}],"description":"Birth data for a single natal chart. Required: date (YYYY-MM-DD), time (HH:mm:ss), latitude and longitude in decimal degrees. The short forms lat, lon, lng and tz are rejected with 400 INVALID_FIELD; pass the full names. timezoneOffset is hours from UTC and defaults to 0, meaning UTC; send timezone instead (an IANA name such as Europe/Kyiv, or auto) and the offset for that date is worked out, summer time included. city is a display label only: nothing here geocodes it, so it never stands in for coordinates. houseSystem is a single Swiss Ephemeris letter, P by default; a name such as \"Placidus\" is refused, and the case matters because I and i are two different Sunshine systems."},"Siblings":{"type":"object","properties":{"sibling1":{"$ref":"#/components/schemas/ChartInput"},"sibling2":{"$ref":"#/components/schemas/ChartInput"},"parent":{"$ref":"#/components/schemas/ChartInput"}},"required":["sibling1","sibling2"]},"SignHoroscope":{"type":"object","properties":{"sign":{"type":"string","enum":["aries","taurus","gemini","cancer","leo","virgo","libra","scorpio","sagittarius","capricorn","aquarius","pisces"]},"date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"language":{"type":"string","enum":["uk","en","de","pl","es","pt","fr","it","nl","cs","ro","hu","el","tr","ar","hi","ja","ko","vi","id","ru"]},"disclaimer_inline":{"type":"boolean","default":false},"style":{"type":"string","enum":["astro","plain"],"description":"`astro` (default) names the planets, houses and aspects behind each point. `plain` uses everyday words with no astrological terms, and is written once in English and translated, so every language says the same thing. Daily, weekly and monthly."},"length":{"type":"string","enum":["short","medium"],"description":"With `style: \"plain\"`: `short` (about 70-110 words a day) or `medium` (default, about 150-230)."},"topics":{"type":"array","items":{"type":"string","enum":["overview","love","career","health","finance","advice"]},"minItems":1,"maxItems":6,"description":"Only these sections, in this order, in `sections` and in `horoscope`. Default all six."}},"required":["sign"]},"Single":{"type":"object","properties":{"seed":{"anyOf":[{"type":"number"},{"type":"string"}]},"date":{"type":"string"},"allowReversed":{"type":"boolean","default":true}}},"SolarAcg":{"allOf":[{"$ref":"#/components/schemas/ChartInput"},{"type":"object","properties":{"year":{"type":"number","nullable":true}},"required":["year"],"additionalProperties":{"nullable":true}}],"description":"Birth data for a single natal chart. Required: date (YYYY-MM-DD), time (HH:mm:ss), latitude and longitude in decimal degrees. The short forms lat, lon, lng and tz are rejected with 400 INVALID_FIELD; pass the full names. timezoneOffset is hours from UTC and defaults to 0, meaning UTC; send timezone instead (an IANA name such as Europe/Kyiv, or auto) and the offset for that date is worked out, summer time included. city is a display label only: nothing here geocodes it, so it never stands in for coordinates. houseSystem is a single Swiss Ephemeris letter, P by default; a name such as \"Placidus\" is refused, and the case matters because I and i are two different Sunshine systems."},"SolarReturn":{"allOf":[{"$ref":"#/components/schemas/ChartInput"},{"type":"object","properties":{"year":{"type":"number","nullable":true},"locationLat":{"type":"number","nullable":true},"locationLng":{"type":"number","nullable":true}},"required":["year"],"additionalProperties":{"nullable":true}}],"description":"Birth data for a single natal chart. Required: date (YYYY-MM-DD), time (HH:mm:ss), latitude and longitude in decimal degrees. The short forms lat, lon, lng and tz are rejected with 400 INVALID_FIELD; pass the full names. timezoneOffset is hours from UTC and defaults to 0, meaning UTC; send timezone instead (an IANA name such as Europe/Kyiv, or auto) and the offset for that date is worked out, summer time included. city is a display label only: nothing here geocodes it, so it never stands in for coordinates. houseSystem is a single Swiss Ephemeris letter, P by default; a name such as \"Placidus\" is refused, and the case matters because I and i are two different Sunshine systems."},"StarMap":{"type":"object","properties":{"points":{"type":"array","items":{"type":"object","properties":{"raHours":{"type":"number","minimum":0,"maximum":24},"raDeg":{"type":"number","minimum":0,"maximum":360},"decDeg":{"type":"number","minimum":-90,"maximum":90},"magnitude":{"type":"number"},"name":{"type":"string","maxLength":40},"glyph":{"type":"string","maxLength":8}},"required":["decDeg"]},"minItems":1,"maxItems":2000},"observerLatDeg":{"type":"number","minimum":-90,"maximum":90},"zenithDecDeg":{"type":"number","minimum":-90,"maximum":90},"capAltitudeDeg":{"type":"number","minimum":-90,"maximum":90},"title":{"type":"string","maxLength":120},"options":{"type":"object","properties":{"size":{"type":"integer","minimum":200,"maximum":2000},"theme":{"type":"string","enum":["light","dark","console","css"],"description":"css paints every colour as var(--aw-<role>, <light colour>), so the page that inlines the SVG can recolour it with CSS custom properties (--aw-chart-bg, --aw-fg, --aw-muted, --aw-ring, --aw-houses-fill, --aw-benefic, --aw-malefic, --aw-aspect-harmonious, --aw-aspect-tense, --aw-aspect-neutral, --aw-aspect-minor, --aw-aspect-quintile, --aw-moon-shadow, --aw-moon-light, --aw-cycle-physical, --aw-cycle-emotional, --aw-cycle-intellectual). With none set it looks exactly like light. Inside an <img> the variables cannot be set, so it stays light. The Western wheels and the aspect grid then also carry stable aw-* classes, and each planet is a <g> with data-planet and data-label, each aspect line has data-a and data-b; see the @astroway/render changelog for the list."},"showAspects":{"type":"boolean"},"showRetrograde":{"type":"boolean"},"title":{"type":"string","maxLength":120},"format":{"type":"string","enum":["svg","json"],"default":"json"}}}},"required":["points"]},"Streaming":{"type":"object","properties":{"message":{"type":"string","minLength":2,"maxLength":2000},"chart":{"$ref":"#/components/schemas/ChartInput"},"language":{"type":"string","enum":["uk","en","de","ru","pl","es","pt","hi","fr","ko","it","ja","id","tr","nl","ro","cs","vi","ar","el","hu"],"default":"uk"}},"required":["message"]},"SubSubLord":{"type":"object","properties":{"longitude":{"type":"number","minimum":0,"maximum":360}},"required":["longitude"]},"Subscribe":{"type":"object","properties":{"event":{"type":"string","enum":["report-ready","transit-alert","eclipse-alert","transit-trigger","retrograde-start","retrograde-end","return-due","dasha-change","mahadasha-end","void-of-course-start","planetary-hour-tick","sign-ingress"]},"url":{"type":"string","maxLength":2048,"format":"uri"}},"required":["event","url"]},"Sun":{"type":"object","properties":{"latitude":{"type":"number","nullable":true},"longitude":{"type":"number","nullable":true},"timezoneOffset":{"type":"number","nullable":true,"minimum":-14,"maximum":14,"default":0,"description":"Hours from UTC at the given moment, not minutes. Fractional zones are hours too: 5.5 for India, 5.75 for Nepal, -3.5 for Newfoundland. Defaults to 0, meaning UTC."}},"required":["latitude","longitude"]},"SunTimes":{"type":"object","properties":{"date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"latitude":{"type":"number","nullable":true},"longitude":{"type":"number","nullable":true},"timezoneOffset":{"type":"number","nullable":true,"minimum":-14,"maximum":14,"default":0,"description":"Hours from UTC at the given moment, not minutes. Fractional zones are hours too: 5.5 for India, 5.75 for Nepal, -3.5 for Newfoundland. Defaults to 0, meaning UTC. Ignored when timezone is sent."},"timezone":{"type":"string","example":"Europe/Kyiv","description":"IANA zone name such as Europe/Kyiv, or auto to look the zone up from latitude and longitude. The server takes the offset that zone kept at this local date and time, summer time included, and uses it in place of timezoneOffset. A clock time that happened twice takes the first occurrence; one skipped when clocks went forward takes the offset from before the change. Abbreviations such as EST are refused. Before 1970 the tz database is not reliable for every place, so send timezoneOffset when the local clock is known."}},"required":["date","latitude","longitude"]},"SynastryReport":{"type":"object","properties":{"chart1":{"allOf":[{"$ref":"#/components/schemas/ChartInput"},{"type":"object","properties":{"latitude":{"type":"number","minimum":-90,"maximum":90,"description":"Birth latitude. Required here: the whole document is computed from it."},"longitude":{"type":"number","minimum":-180,"maximum":180,"description":"Birth longitude. Required here: the whole document is computed from it."}},"additionalProperties":{"nullable":true}}],"description":"Birth data for a single natal chart. Required: date (YYYY-MM-DD), time (HH:mm:ss), latitude and longitude in decimal degrees. The short forms lat, lon, lng and tz are rejected with 400 INVALID_FIELD; pass the full names. timezoneOffset is hours from UTC and defaults to 0, meaning UTC; send timezone instead (an IANA name such as Europe/Kyiv, or auto) and the offset for that date is worked out, summer time included. city is a display label only: nothing here geocodes it, so it never stands in for coordinates. houseSystem is a single Swiss Ephemeris letter, P by default; a name such as \"Placidus\" is refused, and the case matters because I and i are two different Sunshine systems."},"chart2":{"allOf":[{"$ref":"#/components/schemas/ChartInput"},{"type":"object","properties":{"latitude":{"type":"number","minimum":-90,"maximum":90,"description":"Birth latitude. Required here: the whole document is computed from it."},"longitude":{"type":"number","minimum":-180,"maximum":180,"description":"Birth longitude. Required here: the whole document is computed from it."}},"additionalProperties":{"nullable":true}}],"description":"Birth data for a single natal chart. Required: date (YYYY-MM-DD), time (HH:mm:ss), latitude and longitude in decimal degrees. The short forms lat, lon, lng and tz are rejected with 400 INVALID_FIELD; pass the full names. timezoneOffset is hours from UTC and defaults to 0, meaning UTC; send timezone instead (an IANA name such as Europe/Kyiv, or auto) and the offset for that date is worked out, summer time included. city is a display label only: nothing here geocodes it, so it never stands in for coordinates. houseSystem is a single Swiss Ephemeris letter, P by default; a name such as \"Placidus\" is refused, and the case matters because I and i are two different Sunshine systems."},"language":{"type":"string","enum":["uk","en","de","ru","pl","es","pt","hi","fr","ko","it","ja","id","tr","nl","ro","cs","vi","ar","el","hu"]},"whitelabel":{"anyOf":[{"type":"boolean"},{"type":"object","properties":{"companyName":{"type":"string","minLength":1,"maxLength":80},"companyUrl":{"type":"string","format":"uri"},"companyEmail":{"type":"string","format":"email"},"companyMobile":{"type":"string","maxLength":40},"companyBio":{"type":"string","maxLength":500},"logoUrl":{"type":"string","format":"uri"},"frontImage":{"type":"string","format":"uri"},"textPrimaryColor":{"type":"string","pattern":"^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$"},"textSecondaryColor":{"type":"string","pattern":"^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$"},"backgroundColor":{"type":"string","pattern":"^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$"},"themeColor":{"type":"string","pattern":"^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$","description":"Accent colour, used for section heading text and inline emphasis."},"headingColor":{"type":"string","pattern":"^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$","description":"Colour of the divider rule under each section heading (not the heading text, which is themeColor)."},"footerText":{"type":"string","maxLength":200},"fontPairing":{"type":"string","enum":["serif-sans","sans-serif","serif-only","sans-only","system"]},"reportName":{"type":"string","minLength":1,"maxLength":80}},"additionalProperties":false}]}},"required":["chart1","chart2"]},"Synastry":{"type":"object","properties":{"chart1":{"$ref":"#/components/schemas/ChartInput"},"chart2":{"$ref":"#/components/schemas/ChartInput"},"language":{"type":"string","enum":["uk","en","de","ru","pl","es","pt","hi","fr","ko","it","ja","id","tr","nl","ro","cs","vi","ar","el","hu"],"default":"uk"},"tone":{"type":"string","enum":["warm","professional","concise"],"default":"warm"},"length":{"type":"string","enum":["short","medium","long"],"default":"medium"}},"required":["chart1","chart2"]},"TarotReport":{"type":"object","properties":{"spread":{"type":"string","maxLength":64},"seed":{"type":"integer","nullable":true},"name":{"type":"string","maxLength":100},"allowReversed":{"type":"boolean"},"language":{"type":"string","enum":["uk","en","de","ru","pl","es","pt","hi","fr","ko","it","ja","id","tr","nl","ro","cs","vi","ar","el","hu"]},"whitelabel":{"anyOf":[{"type":"boolean"},{"type":"object","properties":{"companyName":{"type":"string","minLength":1,"maxLength":80},"companyUrl":{"type":"string","format":"uri"},"companyEmail":{"type":"string","format":"email"},"companyMobile":{"type":"string","maxLength":40},"companyBio":{"type":"string","maxLength":500},"logoUrl":{"type":"string","format":"uri"},"frontImage":{"type":"string","format":"uri"},"textPrimaryColor":{"type":"string","pattern":"^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$"},"textSecondaryColor":{"type":"string","pattern":"^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$"},"backgroundColor":{"type":"string","pattern":"^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$"},"themeColor":{"type":"string","pattern":"^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$","description":"Accent colour, used for section heading text and inline emphasis."},"headingColor":{"type":"string","pattern":"^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$","description":"Colour of the divider rule under each section heading (not the heading text, which is themeColor)."},"footerText":{"type":"string","maxLength":200},"fontPairing":{"type":"string","enum":["serif-sans","sans-serif","serif-only","sans-only","system"]},"reportName":{"type":"string","minLength":1,"maxLength":80}},"additionalProperties":false}]}}},"MuhurtaReport":{"type":"object","properties":{"activity":{"type":"string","enum":["marriage","vehicle-purchase","business-start","travel","naming-ceremony","surgery","education-start","investment","property-purchase","journey-long","name-change","general-auspicious"]},"search_window_start":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"search_window_end":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"latitude":{"type":"number","minimum":-90,"maximum":90},"longitude":{"type":"number","minimum":-180,"maximum":180},"timezoneOffset":{"type":"number","nullable":true,"minimum":-14,"maximum":14,"default":0,"description":"Hours from UTC at the given moment, not minutes. Fractional zones are hours too: 5.5 for India, 5.75 for Nepal, -3.5 for Newfoundland. Defaults to 0, meaning UTC."},"ayanamsaId":{"type":"number","nullable":true},"ayanamsa":{"type":"string","enum":["fagan-bradley","lahiri","de-luce","raman","krishnamurti","kp","yukteshwar","jn-bhasin","true-citra","djwhal-khul"],"description":"Sidereal school by name. Lahiri when omitted. Equivalent to ayanamsaId; send either."},"topN":{"type":"integer","minimum":1,"maximum":30,"default":10},"language":{"type":"string","enum":["uk","en","de","ru","pl","es","pt","hi","fr","ko","it","ja","id","tr","nl","ro","cs","vi","ar","el","hu"]},"whitelabel":{"anyOf":[{"type":"boolean"},{"type":"object","properties":{"companyName":{"type":"string","minLength":1,"maxLength":80},"companyUrl":{"type":"string","format":"uri"},"companyEmail":{"type":"string","format":"email"},"companyMobile":{"type":"string","maxLength":40},"companyBio":{"type":"string","maxLength":500},"logoUrl":{"type":"string","format":"uri"},"frontImage":{"type":"string","format":"uri"},"textPrimaryColor":{"type":"string","pattern":"^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$"},"textSecondaryColor":{"type":"string","pattern":"^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$"},"backgroundColor":{"type":"string","pattern":"^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$"},"themeColor":{"type":"string","pattern":"^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$","description":"Accent colour, used for section heading text and inline emphasis."},"headingColor":{"type":"string","pattern":"^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$","description":"Colour of the divider rule under each section heading (not the heading text, which is themeColor)."},"footerText":{"type":"string","maxLength":200},"fontPairing":{"type":"string","enum":["serif-sans","sans-serif","serif-only","sans-only","system"]},"reportName":{"type":"string","minLength":1,"maxLength":80}},"additionalProperties":false}]}},"required":["activity","search_window_start","latitude","longitude"]},"StellaforgePoster":{"type":"object","properties":{"chart":{"allOf":[{"$ref":"#/components/schemas/ChartInput"},{"type":"object","properties":{"latitude":{"type":"number","minimum":-90,"maximum":90,"description":"Birth latitude. Required here: the whole document is computed from it."},"longitude":{"type":"number","minimum":-180,"maximum":180,"description":"Birth longitude. Required here: the whole document is computed from it."}},"additionalProperties":{"nullable":true}}],"description":"Birth data for a single natal chart. Required: date (YYYY-MM-DD), time (HH:mm:ss), latitude and longitude in decimal degrees. The short forms lat, lon, lng and tz are rejected with 400 INVALID_FIELD; pass the full names. timezoneOffset is hours from UTC and defaults to 0, meaning UTC; send timezone instead (an IANA name such as Europe/Kyiv, or auto) and the offset for that date is worked out, summer time included. city is a display label only: nothing here geocodes it, so it never stands in for coordinates. houseSystem is a single Swiss Ephemeris letter, P by default; a name such as \"Placidus\" is refused, and the case matters because I and i are two different Sunshine systems."},"style":{"type":"string","enum":["editorial","celestial","classic"]},"language":{"type":"string","enum":["uk","en","de","ru","pl","es","pt","hi","fr","ko","it","ja","id","tr","nl","ro","cs","vi","ar","el","hu"]},"whitelabel":{"anyOf":[{"type":"boolean"},{"type":"object","properties":{"companyName":{"type":"string","minLength":1,"maxLength":80},"companyUrl":{"type":"string","format":"uri"},"companyEmail":{"type":"string","format":"email"},"companyMobile":{"type":"string","maxLength":40},"companyBio":{"type":"string","maxLength":500},"logoUrl":{"type":"string","format":"uri"},"frontImage":{"type":"string","format":"uri"},"textPrimaryColor":{"type":"string","pattern":"^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$"},"textSecondaryColor":{"type":"string","pattern":"^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$"},"backgroundColor":{"type":"string","pattern":"^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$"},"themeColor":{"type":"string","pattern":"^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$","description":"Accent colour, used for section heading text and inline emphasis."},"headingColor":{"type":"string","pattern":"^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$","description":"Colour of the divider rule under each section heading (not the heading text, which is themeColor)."},"footerText":{"type":"string","maxLength":200},"fontPairing":{"type":"string","enum":["serif-sans","sans-serif","serif-only","sans-only","system"]},"reportName":{"type":"string","minLength":1,"maxLength":80}},"additionalProperties":false}]}},"required":["chart"]},"ThreeChart":{"type":"object","properties":{"chart1":{"$ref":"#/components/schemas/ChartInput"},"chart2":{"$ref":"#/components/schemas/ChartInput"},"chart3":{"$ref":"#/components/schemas/ChartInput"}},"required":["chart1","chart2","chart3"]},"Three":{"type":"object","properties":{"seed":{"anyOf":[{"type":"number"},{"type":"string"}]},"question":{"type":"string","maxLength":400},"allowReversed":{"type":"boolean","default":true}}},"Throw":{"type":"object","properties":{"seed":{"anyOf":[{"type":"number"},{"type":"string"}]}}},"Timeline":{"type":"object","properties":{"rangeStart":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"rangeEnd":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"events":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string","minLength":1,"maxLength":120},"start":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"end":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"exact":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"category":{"type":"string","maxLength":40},"color":{"type":"string","maxLength":20}},"required":["label","start","end"]},"minItems":1,"maxItems":200},"options":{"type":"object","properties":{"size":{"type":"integer","minimum":200,"maximum":2000},"theme":{"type":"string","enum":["light","dark","console","css"],"description":"css paints every colour as var(--aw-<role>, <light colour>), so the page that inlines the SVG can recolour it with CSS custom properties (--aw-chart-bg, --aw-fg, --aw-muted, --aw-ring, --aw-houses-fill, --aw-benefic, --aw-malefic, --aw-aspect-harmonious, --aw-aspect-tense, --aw-aspect-neutral, --aw-aspect-minor, --aw-aspect-quintile, --aw-moon-shadow, --aw-moon-light, --aw-cycle-physical, --aw-cycle-emotional, --aw-cycle-intellectual). With none set it looks exactly like light. Inside an <img> the variables cannot be set, so it stays light. The Western wheels and the aspect grid then also carry stable aw-* classes, and each planet is a <g> with data-planet and data-label, each aspect line has data-a and data-b; see the @astroway/render changelog for the list."},"showAspects":{"type":"boolean"},"showRetrograde":{"type":"boolean"},"title":{"type":"string","maxLength":120},"format":{"type":"string","enum":["svg","json"],"default":"json"},"width":{"type":"integer","minimum":400,"maximum":3000},"rowHeight":{"type":"integer","minimum":16,"maximum":60}}}},"required":["rangeStart","rangeEnd","events"]},"ToolCall":{"type":"object","properties":{"tool":{"type":"string","minLength":2,"maxLength":80},"args":{"type":"object","additionalProperties":{"nullable":true}},"language":{"type":"string","enum":["uk","en","ru","es","pl","de","fr","it","pt"],"default":"en"}},"required":["tool"]},"TransitAlerts":{"allOf":[{"$ref":"#/components/schemas/ChartInput"},{"type":"object","properties":{"hours":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true}},"additionalProperties":{"nullable":true}}],"description":"Birth data for a single natal chart. Required: date (YYYY-MM-DD), time (HH:mm:ss), latitude and longitude in decimal degrees. The short forms lat, lon, lng and tz are rejected with 400 INVALID_FIELD; pass the full names. timezoneOffset is hours from UTC and defaults to 0, meaning UTC; send timezone instead (an IANA name such as Europe/Kyiv, or auto) and the offset for that date is worked out, summer time included. city is a display label only: nothing here geocodes it, so it never stands in for coordinates. houseSystem is a single Swiss Ephemeris letter, P by default; a name such as \"Placidus\" is refused, and the case matters because I and i are two different Sunshine systems."},"TransitCalendar":{"allOf":[{"$ref":"#/components/schemas/NatalWrapper"},{"type":"object","properties":{"startDate":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"endDate":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"maxOrb":{"type":"number","nullable":true,"description":"Accepted and echoed back, but it does not filter anything: every event is an exact hit, found by the sign change of the offset and refined by bisection, so its orb is 0. Must be in (0, 10] if sent."},"aspectAngles":{"type":"array","items":{"type":"number","nullable":true,"minimum":0,"maximum":360},"maxItems":64,"description":"Subset of 0, 60, 90, 120, 180 (the default is all five). Other angles match nothing and answer 400."},"transitPlanetIds":{"type":"array","items":{"type":"integer","nullable":true,"minimum":0},"maxItems":32,"description":"Transiting bodies, ids 0 and 2-9 (Sun, Mercury to Pluto; the Moon is excluded). Default: all nine."}},"required":["startDate","endDate"]}],"description":"Wrapper { natal: ChartInput } used by endpoints that take a base natal plus extra parameters in flat fields."},"Transit":{"type":"object","properties":{"date":{"type":"string"},"time":{"type":"string"},"timezoneOffset":{"type":"number","nullable":true,"minimum":-14,"maximum":14,"default":0,"description":"Hours from UTC at the given moment, not minutes. Fractional zones are hours too: 5.5 for India, 5.75 for Nepal, -3.5 for Newfoundland. Defaults to 0, meaning UTC. Ignored when timezone is sent."},"timezone":{"type":"string","example":"Europe/Kyiv","description":"IANA zone name such as Europe/Kyiv, or auto to look the zone up from latitude and longitude. The server takes the offset that zone kept at this local date and time, summer time included, and uses it in place of timezoneOffset. A clock time that happened twice takes the first occurrence; one skipped when clocks went forward takes the offset from before the change. Abbreviations such as EST are refused. Before 1970 the tz database is not reliable for every place, so send timezoneOffset when the local clock is known."},"ayanamsaId":{"type":"number","nullable":true},"ayanamsa":{"type":"string","enum":["fagan-bradley","lahiri","de-luce","raman","krishnamurti","kp","yukteshwar","jn-bhasin","true-citra","djwhal-khul"],"description":"Sidereal school by name. Lahiri when omitted. Equivalent to ayanamsaId; send either."}}},"TransitYearlyReport":{"type":"object","properties":{"chart":{"allOf":[{"$ref":"#/components/schemas/ChartInput"},{"type":"object","properties":{"latitude":{"type":"number","minimum":-90,"maximum":90,"description":"Birth latitude. Required here: the whole document is computed from it."},"longitude":{"type":"number","minimum":-180,"maximum":180,"description":"Birth longitude. Required here: the whole document is computed from it."}},"additionalProperties":{"nullable":true}}],"description":"Birth data for a single natal chart. Required: date (YYYY-MM-DD), time (HH:mm:ss), latitude and longitude in decimal degrees. The short forms lat, lon, lng and tz are rejected with 400 INVALID_FIELD; pass the full names. timezoneOffset is hours from UTC and defaults to 0, meaning UTC; send timezone instead (an IANA name such as Europe/Kyiv, or auto) and the offset for that date is worked out, summer time included. city is a display label only: nothing here geocodes it, so it never stands in for coordinates. houseSystem is a single Swiss Ephemeris letter, P by default; a name such as \"Placidus\" is refused, and the case matters because I and i are two different Sunshine systems."},"year":{"type":"integer","minimum":1900,"maximum":2100},"language":{"type":"string","enum":["uk","en","de","ru","pl","es","pt","hi","fr","ko","it","ja","id","tr","nl","ro","cs","vi","ar","el","hu"]},"whitelabel":{"anyOf":[{"type":"boolean"},{"type":"object","properties":{"companyName":{"type":"string","minLength":1,"maxLength":80},"companyUrl":{"type":"string","format":"uri"},"companyEmail":{"type":"string","format":"email"},"companyMobile":{"type":"string","maxLength":40},"companyBio":{"type":"string","maxLength":500},"logoUrl":{"type":"string","format":"uri"},"frontImage":{"type":"string","format":"uri"},"textPrimaryColor":{"type":"string","pattern":"^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$"},"textSecondaryColor":{"type":"string","pattern":"^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$"},"backgroundColor":{"type":"string","pattern":"^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$"},"themeColor":{"type":"string","pattern":"^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$","description":"Accent colour, used for section heading text and inline emphasis."},"headingColor":{"type":"string","pattern":"^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$","description":"Colour of the divider rule under each section heading (not the heading text, which is themeColor)."},"footerText":{"type":"string","maxLength":200},"fontPairing":{"type":"string","enum":["serif-sans","sans-serif","serif-only","sans-only","system"]},"reportName":{"type":"string","minLength":1,"maxLength":80}},"additionalProperties":false}]}},"required":["chart"]},"Transits":{"allOf":[{"$ref":"#/components/schemas/ChartInput"},{"type":"object","properties":{"transitDate":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"transitTime":{"type":"string","pattern":"^\\d{2}:\\d{2}(:\\d{2})?$"},"transitTzOffset":{"type":"number","nullable":true}},"required":["transitDate"],"additionalProperties":{"nullable":true}}],"description":"Birth data for a single natal chart. Required: date (YYYY-MM-DD), time (HH:mm:ss), latitude and longitude in decimal degrees. The short forms lat, lon, lng and tz are rejected with 400 INVALID_FIELD; pass the full names. timezoneOffset is hours from UTC and defaults to 0, meaning UTC; send timezone instead (an IANA name such as Europe/Kyiv, or auto) and the offset for that date is worked out, summer time included. city is a display label only: nothing here geocodes it, so it never stands in for coordinates. houseSystem is a single Swiss Ephemeris letter, P by default; a name such as \"Placidus\" is refused, and the case matters because I and i are two different Sunshine systems."},"TranslateAstro":{"type":"object","properties":{"text":{"type":"string","minLength":1,"maxLength":3000},"target_lang":{"type":"string","enum":["uk","en","de","pl","es","pt","hi","fr","ko","it","ja","id","tr","nl","cs","ro","vi","ar","el","hu"]},"source_lang":{"type":"string","enum":["uk","en","de","pl","es","pt","hi","fr","ko","it","ja","id","tr","nl","cs","ro","vi","ar","el","hu"]},"domain":{"type":"string","enum":["vedic","western","tarot","numerology","hd","marketing","generic"]}},"required":["text","target_lang"]},"TranslateBatch":{"type":"object","properties":{"items":{"type":"array","items":{"type":"string","minLength":1,"maxLength":2000},"minItems":1,"maxItems":25},"target_lang":{"type":"string","enum":["uk","en","de","pl","es","pt","hi","fr","ko","it","ja","id","tr","nl","cs","ro","vi","ar","el","hu"]},"source_lang":{"type":"string","enum":["uk","en","de","pl","es","pt","hi","fr","ko","it","ja","id","tr","nl","cs","ro","vi","ar","el","hu"]},"domain":{"type":"string","enum":["vedic","western","tarot","numerology","hd","marketing","generic"]}},"required":["items","target_lang"]},"TriWheel":{"type":"object","properties":{"natal":{"$ref":"#/components/schemas/ChartInput"},"middle":{"$ref":"#/components/schemas/ChartInput"},"outer":{"$ref":"#/components/schemas/ChartInput"},"options":{"type":"object","properties":{"size":{"type":"integer","minimum":200,"maximum":2000},"theme":{"type":"string","enum":["light","dark","console","css"],"description":"css paints every colour as var(--aw-<role>, <light colour>), so the page that inlines the SVG can recolour it with CSS custom properties (--aw-chart-bg, --aw-fg, --aw-muted, --aw-ring, --aw-houses-fill, --aw-benefic, --aw-malefic, --aw-aspect-harmonious, --aw-aspect-tense, --aw-aspect-neutral, --aw-aspect-minor, --aw-aspect-quintile, --aw-moon-shadow, --aw-moon-light, --aw-cycle-physical, --aw-cycle-emotional, --aw-cycle-intellectual). With none set it looks exactly like light. Inside an <img> the variables cannot be set, so it stays light. The Western wheels and the aspect grid then also carry stable aw-* classes, and each planet is a <g> with data-planet and data-label, each aspect line has data-a and data-b; see the @astroway/render changelog for the list."},"showAspects":{"type":"boolean"},"showRetrograde":{"type":"boolean"},"title":{"type":"string","maxLength":120},"format":{"type":"string","enum":["svg","json"],"default":"json"},"bodies":{"type":"array","items":{"type":"string","enum":["Sun","Moon","Mercury","Venus","Mars","Jupiter","Saturn","Uranus","Neptune","Pluto","North Node","South Node","Chiron","Lilith"]},"minItems":1,"maxItems":14},"labels":{"type":"object","properties":{"asc":{"type":"string","minLength":1,"maxLength":40},"dsc":{"type":"string","minLength":1,"maxLength":40},"mc":{"type":"string","minLength":1,"maxLength":40},"ic":{"type":"string","minLength":1,"maxLength":40},"title":{"type":"string","minLength":1,"maxLength":200},"desc":{"type":"string","minLength":1,"maxLength":2000},"bodies":{"type":"object","properties":{"Sun":{"type":"string","minLength":1,"maxLength":40},"Moon":{"type":"string","minLength":1,"maxLength":40},"Mercury":{"type":"string","minLength":1,"maxLength":40},"Venus":{"type":"string","minLength":1,"maxLength":40},"Mars":{"type":"string","minLength":1,"maxLength":40},"Jupiter":{"type":"string","minLength":1,"maxLength":40},"Saturn":{"type":"string","minLength":1,"maxLength":40},"Uranus":{"type":"string","minLength":1,"maxLength":40},"Neptune":{"type":"string","minLength":1,"maxLength":40},"Pluto":{"type":"string","minLength":1,"maxLength":40},"North Node":{"type":"string","minLength":1,"maxLength":40},"South Node":{"type":"string","minLength":1,"maxLength":40},"Chiron":{"type":"string","minLength":1,"maxLength":40},"Lilith":{"type":"string","minLength":1,"maxLength":40}}},"signs":{"type":"array","items":{"type":"string","minLength":1,"maxLength":40}},"retrograde":{"type":"string","minLength":1,"maxLength":40}},"additionalProperties":false,"description":"Your own words in place of the English the image would otherwise carry: the ASC/DSC/MC/IC axis labels, the SVG <title> and <desc> read by screen readers, and the planet and sign names plus the word for retrograde in each planet's data-label (theme css). bodies is keyed by the English name, signs lists twelve names from Aries. Nothing is translated for you; absent keys keep the English."},"middleLabel":{"type":"string","maxLength":40,"default":"PR"},"outerLabel":{"type":"string","maxLength":40,"default":"TR"}}}},"required":["natal","middle","outer"]},"Varshphal":{"allOf":[{"$ref":"#/components/schemas/ChartInput"},{"type":"object","properties":{"age":{"type":"integer","minimum":0,"maximum":120}},"additionalProperties":{"nullable":true}}],"description":"Birth data for a single natal chart. Required: date (YYYY-MM-DD), time (HH:mm:ss), latitude and longitude in decimal degrees. The short forms lat, lon, lng and tz are rejected with 400 INVALID_FIELD; pass the full names. timezoneOffset is hours from UTC and defaults to 0, meaning UTC; send timezone instead (an IANA name such as Europe/Kyiv, or auto) and the offset for that date is worked out, summer time included. city is a display label only: nothing here geocodes it, so it never stands in for coordinates. houseSystem is a single Swiss Ephemeris letter, P by default; a name such as \"Placidus\" is refused, and the case matters because I and i are two different Sunshine systems."},"VedicKundli":{"type":"object","properties":{"chart":{"allOf":[{"$ref":"#/components/schemas/ChartInput"},{"type":"object","properties":{"latitude":{"type":"number","minimum":-90,"maximum":90,"description":"Birth latitude. Required here: the whole document is computed from it."},"longitude":{"type":"number","minimum":-180,"maximum":180,"description":"Birth longitude. Required here: the whole document is computed from it."}},"additionalProperties":{"nullable":true}}],"description":"Birth data for a single natal chart. Required: date (YYYY-MM-DD), time (HH:mm:ss), latitude and longitude in decimal degrees. The short forms lat, lon, lng and tz are rejected with 400 INVALID_FIELD; pass the full names. timezoneOffset is hours from UTC and defaults to 0, meaning UTC; send timezone instead (an IANA name such as Europe/Kyiv, or auto) and the offset for that date is worked out, summer time included. city is a display label only: nothing here geocodes it, so it never stands in for coordinates. houseSystem is a single Swiss Ephemeris letter, P by default; a name such as \"Placidus\" is refused, and the case matters because I and i are two different Sunshine systems."},"language":{"type":"string","enum":["uk","en","de","ru","pl","es","pt","hi","fr","ko","it","ja","id","tr","nl","ro","cs","vi","ar","el","hu"]},"whitelabel":{"anyOf":[{"type":"boolean"},{"type":"object","properties":{"companyName":{"type":"string","minLength":1,"maxLength":80},"companyUrl":{"type":"string","format":"uri"},"companyEmail":{"type":"string","format":"email"},"companyMobile":{"type":"string","maxLength":40},"companyBio":{"type":"string","maxLength":500},"logoUrl":{"type":"string","format":"uri"},"frontImage":{"type":"string","format":"uri"},"textPrimaryColor":{"type":"string","pattern":"^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$"},"textSecondaryColor":{"type":"string","pattern":"^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$"},"backgroundColor":{"type":"string","pattern":"^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$"},"themeColor":{"type":"string","pattern":"^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$","description":"Accent colour, used for section heading text and inline emphasis."},"headingColor":{"type":"string","pattern":"^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$","description":"Colour of the divider rule under each section heading (not the heading text, which is themeColor)."},"footerText":{"type":"string","maxLength":200},"fontPairing":{"type":"string","enum":["serif-sans","sans-serif","serif-only","sans-only","system"]},"reportName":{"type":"string","minLength":1,"maxLength":80}},"additionalProperties":false}]}},"required":["chart"]},"Vedic":{"allOf":[{"$ref":"#/components/schemas/ChartInput"},{"type":"object","properties":{"varga":{"nullable":true}},"additionalProperties":{"nullable":true}}],"description":"Birth data for a single natal chart. Required: date (YYYY-MM-DD), time (HH:mm:ss), latitude and longitude in decimal degrees. The short forms lat, lon, lng and tz are rejected with 400 INVALID_FIELD; pass the full names. timezoneOffset is hours from UTC and defaults to 0, meaning UTC; send timezone instead (an IANA name such as Europe/Kyiv, or auto) and the offset for that date is worked out, summer time included. city is a display label only: nothing here geocodes it, so it never stands in for coordinates. houseSystem is a single Swiss Ephemeris letter, P by default; a name such as \"Placidus\" is refused, and the case matters because I and i are two different Sunshine systems."},"VerifyConfirm":{"type":"object","properties":{"token":{"type":"string","minLength":64,"maxLength":64}},"required":["token"]},"WheelWestern":{"allOf":[{"$ref":"#/components/schemas/ChartInput"},{"type":"object","properties":{"options":{"type":"object","properties":{"size":{"type":"integer","minimum":200,"maximum":2000},"theme":{"type":"string","enum":["light","dark","console","css"],"description":"css paints every colour as var(--aw-<role>, <light colour>), so the page that inlines the SVG can recolour it with CSS custom properties (--aw-chart-bg, --aw-fg, --aw-muted, --aw-ring, --aw-houses-fill, --aw-benefic, --aw-malefic, --aw-aspect-harmonious, --aw-aspect-tense, --aw-aspect-neutral, --aw-aspect-minor, --aw-aspect-quintile, --aw-moon-shadow, --aw-moon-light, --aw-cycle-physical, --aw-cycle-emotional, --aw-cycle-intellectual). With none set it looks exactly like light. Inside an <img> the variables cannot be set, so it stays light. The Western wheels and the aspect grid then also carry stable aw-* classes, and each planet is a <g> with data-planet and data-label, each aspect line has data-a and data-b; see the @astroway/render changelog for the list."},"showAspects":{"type":"boolean"},"showRetrograde":{"type":"boolean"},"title":{"type":"string","maxLength":120},"format":{"type":"string","enum":["svg","json"],"default":"json"},"bodies":{"type":"array","items":{"type":"string","enum":["Sun","Moon","Mercury","Venus","Mars","Jupiter","Saturn","Uranus","Neptune","Pluto","North Node","South Node","Chiron","Lilith"]},"minItems":1,"maxItems":14},"labels":{"type":"object","properties":{"asc":{"type":"string","minLength":1,"maxLength":40},"dsc":{"type":"string","minLength":1,"maxLength":40},"mc":{"type":"string","minLength":1,"maxLength":40},"ic":{"type":"string","minLength":1,"maxLength":40},"title":{"type":"string","minLength":1,"maxLength":200},"desc":{"type":"string","minLength":1,"maxLength":2000},"bodies":{"type":"object","properties":{"Sun":{"type":"string","minLength":1,"maxLength":40},"Moon":{"type":"string","minLength":1,"maxLength":40},"Mercury":{"type":"string","minLength":1,"maxLength":40},"Venus":{"type":"string","minLength":1,"maxLength":40},"Mars":{"type":"string","minLength":1,"maxLength":40},"Jupiter":{"type":"string","minLength":1,"maxLength":40},"Saturn":{"type":"string","minLength":1,"maxLength":40},"Uranus":{"type":"string","minLength":1,"maxLength":40},"Neptune":{"type":"string","minLength":1,"maxLength":40},"Pluto":{"type":"string","minLength":1,"maxLength":40},"North Node":{"type":"string","minLength":1,"maxLength":40},"South Node":{"type":"string","minLength":1,"maxLength":40},"Chiron":{"type":"string","minLength":1,"maxLength":40},"Lilith":{"type":"string","minLength":1,"maxLength":40}}},"signs":{"type":"array","items":{"type":"string","minLength":1,"maxLength":40}},"retrograde":{"type":"string","minLength":1,"maxLength":40}},"additionalProperties":false,"description":"Your own words in place of the English the image would otherwise carry: the ASC/DSC/MC/IC axis labels, the SVG <title> and <desc> read by screen readers, and the planet and sign names plus the word for retrograde in each planet's data-label (theme css). bodies is keyed by the English name, signs lists twelve names from Aries. Nothing is translated for you; absent keys keep the English."}}}},"additionalProperties":{"nullable":true}}],"description":"Birth data for a single natal chart. Required: date (YYYY-MM-DD), time (HH:mm:ss), latitude and longitude in decimal degrees. The short forms lat, lon, lng and tz are rejected with 400 INVALID_FIELD; pass the full names. timezoneOffset is hours from UTC and defaults to 0, meaning UTC; send timezone instead (an IANA name such as Europe/Kyiv, or auto) and the offset for that date is worked out, summer time included. city is a display label only: nothing here geocodes it, so it never stands in for coordinates. houseSystem is a single Swiss Ephemeris letter, P by default; a name such as \"Placidus\" is refused, and the case matters because I and i are two different Sunshine systems."},"WheelWesternRequest":{"anyOf":[{"allOf":[{"$ref":"#/components/schemas/ChartInput"},{"type":"object","properties":{"options":{"type":"object","properties":{"size":{"type":"integer","minimum":200,"maximum":2000},"theme":{"type":"string","enum":["light","dark","console","css"],"description":"css paints every colour as var(--aw-<role>, <light colour>), so the page that inlines the SVG can recolour it with CSS custom properties (--aw-chart-bg, --aw-fg, --aw-muted, --aw-ring, --aw-houses-fill, --aw-benefic, --aw-malefic, --aw-aspect-harmonious, --aw-aspect-tense, --aw-aspect-neutral, --aw-aspect-minor, --aw-aspect-quintile, --aw-moon-shadow, --aw-moon-light, --aw-cycle-physical, --aw-cycle-emotional, --aw-cycle-intellectual). With none set it looks exactly like light. Inside an <img> the variables cannot be set, so it stays light. The Western wheels and the aspect grid then also carry stable aw-* classes, and each planet is a <g> with data-planet and data-label, each aspect line has data-a and data-b; see the @astroway/render changelog for the list."},"showAspects":{"type":"boolean"},"showRetrograde":{"type":"boolean"},"title":{"type":"string","maxLength":120},"format":{"type":"string","enum":["svg","json"],"default":"json"},"bodies":{"type":"array","items":{"type":"string","enum":["Sun","Moon","Mercury","Venus","Mars","Jupiter","Saturn","Uranus","Neptune","Pluto","North Node","South Node","Chiron","Lilith"]},"minItems":1,"maxItems":14},"labels":{"type":"object","properties":{"asc":{"type":"string","minLength":1,"maxLength":40},"dsc":{"type":"string","minLength":1,"maxLength":40},"mc":{"type":"string","minLength":1,"maxLength":40},"ic":{"type":"string","minLength":1,"maxLength":40},"title":{"type":"string","minLength":1,"maxLength":200},"desc":{"type":"string","minLength":1,"maxLength":2000},"bodies":{"type":"object","properties":{"Sun":{"type":"string","minLength":1,"maxLength":40},"Moon":{"type":"string","minLength":1,"maxLength":40},"Mercury":{"type":"string","minLength":1,"maxLength":40},"Venus":{"type":"string","minLength":1,"maxLength":40},"Mars":{"type":"string","minLength":1,"maxLength":40},"Jupiter":{"type":"string","minLength":1,"maxLength":40},"Saturn":{"type":"string","minLength":1,"maxLength":40},"Uranus":{"type":"string","minLength":1,"maxLength":40},"Neptune":{"type":"string","minLength":1,"maxLength":40},"Pluto":{"type":"string","minLength":1,"maxLength":40},"North Node":{"type":"string","minLength":1,"maxLength":40},"South Node":{"type":"string","minLength":1,"maxLength":40},"Chiron":{"type":"string","minLength":1,"maxLength":40},"Lilith":{"type":"string","minLength":1,"maxLength":40}}},"signs":{"type":"array","items":{"type":"string","minLength":1,"maxLength":40}},"retrograde":{"type":"string","minLength":1,"maxLength":40}},"additionalProperties":false,"description":"Your own words in place of the English the image would otherwise carry: the ASC/DSC/MC/IC axis labels, the SVG <title> and <desc> read by screen readers, and the planet and sign names plus the word for retrograde in each planet's data-label (theme css). bodies is keyed by the English name, signs lists twelve names from Aries. Nothing is translated for you; absent keys keep the English."}}}},"additionalProperties":{"nullable":true}}],"description":"Birth data for a single natal chart. Required: date (YYYY-MM-DD), time (HH:mm:ss), latitude and longitude in decimal degrees. The short forms lat, lon, lng and tz are rejected with 400 INVALID_FIELD; pass the full names. timezoneOffset is hours from UTC and defaults to 0, meaning UTC; send timezone instead (an IANA name such as Europe/Kyiv, or auto) and the offset for that date is worked out, summer time included. city is a display label only: nothing here geocodes it, so it never stands in for coordinates. houseSystem is a single Swiss Ephemeris letter, P by default; a name such as \"Placidus\" is refused, and the case matters because I and i are two different Sunshine systems."},{"$ref":"#/components/schemas/WheelFromChart"}]},"WheelFromChart":{"type":"object","properties":{"chart":{"$ref":"#/components/schemas/ChartData"},"options":{"type":"object","properties":{"size":{"type":"integer","minimum":200,"maximum":2000},"theme":{"type":"string","enum":["light","dark","console","css"],"description":"css paints every colour as var(--aw-<role>, <light colour>), so the page that inlines the SVG can recolour it with CSS custom properties (--aw-chart-bg, --aw-fg, --aw-muted, --aw-ring, --aw-houses-fill, --aw-benefic, --aw-malefic, --aw-aspect-harmonious, --aw-aspect-tense, --aw-aspect-neutral, --aw-aspect-minor, --aw-aspect-quintile, --aw-moon-shadow, --aw-moon-light, --aw-cycle-physical, --aw-cycle-emotional, --aw-cycle-intellectual). With none set it looks exactly like light. Inside an <img> the variables cannot be set, so it stays light. The Western wheels and the aspect grid then also carry stable aw-* classes, and each planet is a <g> with data-planet and data-label, each aspect line has data-a and data-b; see the @astroway/render changelog for the list."},"showAspects":{"type":"boolean"},"showRetrograde":{"type":"boolean"},"title":{"type":"string","maxLength":120},"format":{"type":"string","enum":["svg","json"],"default":"json"},"bodies":{"type":"array","items":{"type":"string","enum":["Sun","Moon","Mercury","Venus","Mars","Jupiter","Saturn","Uranus","Neptune","Pluto","North Node","South Node","Chiron","Lilith"]},"minItems":1,"maxItems":14},"labels":{"type":"object","properties":{"asc":{"type":"string","minLength":1,"maxLength":40},"dsc":{"type":"string","minLength":1,"maxLength":40},"mc":{"type":"string","minLength":1,"maxLength":40},"ic":{"type":"string","minLength":1,"maxLength":40},"title":{"type":"string","minLength":1,"maxLength":200},"desc":{"type":"string","minLength":1,"maxLength":2000},"bodies":{"type":"object","properties":{"Sun":{"type":"string","minLength":1,"maxLength":40},"Moon":{"type":"string","minLength":1,"maxLength":40},"Mercury":{"type":"string","minLength":1,"maxLength":40},"Venus":{"type":"string","minLength":1,"maxLength":40},"Mars":{"type":"string","minLength":1,"maxLength":40},"Jupiter":{"type":"string","minLength":1,"maxLength":40},"Saturn":{"type":"string","minLength":1,"maxLength":40},"Uranus":{"type":"string","minLength":1,"maxLength":40},"Neptune":{"type":"string","minLength":1,"maxLength":40},"Pluto":{"type":"string","minLength":1,"maxLength":40},"North Node":{"type":"string","minLength":1,"maxLength":40},"South Node":{"type":"string","minLength":1,"maxLength":40},"Chiron":{"type":"string","minLength":1,"maxLength":40},"Lilith":{"type":"string","minLength":1,"maxLength":40}}},"signs":{"type":"array","items":{"type":"string","minLength":1,"maxLength":40}},"retrograde":{"type":"string","minLength":1,"maxLength":40}},"additionalProperties":false,"description":"Your own words in place of the English the image would otherwise carry: the ASC/DSC/MC/IC axis labels, the SVG <title> and <desc> read by screen readers, and the planet and sign names plus the word for retrograde in each planet's data-label (theme css). bodies is keyed by the English name, signs lists twelve names from Aries. Nothing is translated for you; absent keys keep the English."}}}},"required":["chart"],"additionalProperties":false,"description":"A chart you already hold, drawn as is: no birth data, 1 credit."},"ChartData":{"type":"object","properties":{"planets":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer","minimum":-1,"maximum":100000},"name":{"type":"string","minLength":1,"maxLength":40},"longitude":{"type":"number","minimum":0,"maximum":360},"isRetrograde":{"type":"boolean"},"speedLong":{"type":"number","minimum":-30,"maximum":30}},"required":["id","name","longitude"],"additionalProperties":{"nullable":true}},"minItems":1,"maxItems":30},"houses":{"type":"object","properties":{"cusps":{"type":"array","items":{"type":"number","minimum":0,"maximum":360}},"ascendant":{"type":"number","minimum":0,"maximum":360},"mc":{"type":"number","minimum":0,"maximum":360}},"required":["cusps","ascendant","mc"],"additionalProperties":{"nullable":true}},"aspects":{"type":"array","items":{"type":"object","properties":{"planet1":{"type":"string","minLength":1,"maxLength":40},"planet2":{"type":"string","minLength":1,"maxLength":40},"type":{"anyOf":[{"type":"string","minLength":1,"maxLength":40},{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":40}},"required":["name"],"additionalProperties":{"nullable":true}}]},"orb":{"type":"number","minimum":0,"maximum":30}},"required":["planet1","planet2","type"],"additionalProperties":{"nullable":true}},"maxItems":300}},"required":["planets","houses"],"additionalProperties":{"nullable":true},"description":"The data object of a POST /v1/chart response, sent back to be drawn without computing the chart again (1 credit instead of 10). Extra fields are ignored; planets (1 to 30, longitude 0 to 360), houses (exactly 12 cusps, ascendant, mc) and aspects are read."},"BiWheelRequest":{"anyOf":[{"type":"object","properties":{"natal":{"$ref":"#/components/schemas/ChartInput"},"outer":{"$ref":"#/components/schemas/ChartInput"},"options":{"type":"object","properties":{"size":{"type":"integer","minimum":200,"maximum":2000},"theme":{"type":"string","enum":["light","dark","console","css"],"description":"css paints every colour as var(--aw-<role>, <light colour>), so the page that inlines the SVG can recolour it with CSS custom properties (--aw-chart-bg, --aw-fg, --aw-muted, --aw-ring, --aw-houses-fill, --aw-benefic, --aw-malefic, --aw-aspect-harmonious, --aw-aspect-tense, --aw-aspect-neutral, --aw-aspect-minor, --aw-aspect-quintile, --aw-moon-shadow, --aw-moon-light, --aw-cycle-physical, --aw-cycle-emotional, --aw-cycle-intellectual). With none set it looks exactly like light. Inside an <img> the variables cannot be set, so it stays light. The Western wheels and the aspect grid then also carry stable aw-* classes, and each planet is a <g> with data-planet and data-label, each aspect line has data-a and data-b; see the @astroway/render changelog for the list."},"showAspects":{"type":"boolean"},"showRetrograde":{"type":"boolean"},"title":{"type":"string","maxLength":120},"format":{"type":"string","enum":["svg","json"],"default":"json"},"bodies":{"type":"array","items":{"type":"string","enum":["Sun","Moon","Mercury","Venus","Mars","Jupiter","Saturn","Uranus","Neptune","Pluto","North Node","South Node","Chiron","Lilith"]},"minItems":1,"maxItems":14},"labels":{"type":"object","properties":{"asc":{"type":"string","minLength":1,"maxLength":40},"dsc":{"type":"string","minLength":1,"maxLength":40},"mc":{"type":"string","minLength":1,"maxLength":40},"ic":{"type":"string","minLength":1,"maxLength":40},"title":{"type":"string","minLength":1,"maxLength":200},"desc":{"type":"string","minLength":1,"maxLength":2000},"bodies":{"type":"object","properties":{"Sun":{"type":"string","minLength":1,"maxLength":40},"Moon":{"type":"string","minLength":1,"maxLength":40},"Mercury":{"type":"string","minLength":1,"maxLength":40},"Venus":{"type":"string","minLength":1,"maxLength":40},"Mars":{"type":"string","minLength":1,"maxLength":40},"Jupiter":{"type":"string","minLength":1,"maxLength":40},"Saturn":{"type":"string","minLength":1,"maxLength":40},"Uranus":{"type":"string","minLength":1,"maxLength":40},"Neptune":{"type":"string","minLength":1,"maxLength":40},"Pluto":{"type":"string","minLength":1,"maxLength":40},"North Node":{"type":"string","minLength":1,"maxLength":40},"South Node":{"type":"string","minLength":1,"maxLength":40},"Chiron":{"type":"string","minLength":1,"maxLength":40},"Lilith":{"type":"string","minLength":1,"maxLength":40}}},"signs":{"type":"array","items":{"type":"string","minLength":1,"maxLength":40}},"retrograde":{"type":"string","minLength":1,"maxLength":40}},"additionalProperties":false,"description":"Your own words in place of the English the image would otherwise carry: the ASC/DSC/MC/IC axis labels, the SVG <title> and <desc> read by screen readers, and the planet and sign names plus the word for retrograde in each planet's data-label (theme css). bodies is keyed by the English name, signs lists twelve names from Aries. Nothing is translated for you; absent keys keep the English."},"outerLabel":{"type":"string","maxLength":40,"default":"TR"},"crossAspects":{"type":"boolean","description":"Draws the aspects between the two charts as dashed chords (the same set POST /synastry returns as crossAspects), skipping pairs with a body that is not drawn. In theme css each chord has class aw-cross-aspect, data-a (inner planet) and data-b (outer planet, b- prefix)."}}}},"required":["natal","outer"]},{"$ref":"#/components/schemas/BiWheelFromChart"}]},"BiWheelFromChart":{"type":"object","properties":{"natal":{"type":"object","properties":{"chart":{"$ref":"#/components/schemas/ChartData"}},"required":["chart"],"additionalProperties":false},"outer":{"type":"object","properties":{"chart":{"$ref":"#/components/schemas/ChartData"}},"required":["chart"],"additionalProperties":false},"options":{"type":"object","properties":{"size":{"type":"integer","minimum":200,"maximum":2000},"theme":{"type":"string","enum":["light","dark","console","css"],"description":"css paints every colour as var(--aw-<role>, <light colour>), so the page that inlines the SVG can recolour it with CSS custom properties (--aw-chart-bg, --aw-fg, --aw-muted, --aw-ring, --aw-houses-fill, --aw-benefic, --aw-malefic, --aw-aspect-harmonious, --aw-aspect-tense, --aw-aspect-neutral, --aw-aspect-minor, --aw-aspect-quintile, --aw-moon-shadow, --aw-moon-light, --aw-cycle-physical, --aw-cycle-emotional, --aw-cycle-intellectual). With none set it looks exactly like light. Inside an <img> the variables cannot be set, so it stays light. The Western wheels and the aspect grid then also carry stable aw-* classes, and each planet is a <g> with data-planet and data-label, each aspect line has data-a and data-b; see the @astroway/render changelog for the list."},"showAspects":{"type":"boolean"},"showRetrograde":{"type":"boolean"},"title":{"type":"string","maxLength":120},"format":{"type":"string","enum":["svg","json"],"default":"json"},"bodies":{"type":"array","items":{"type":"string","enum":["Sun","Moon","Mercury","Venus","Mars","Jupiter","Saturn","Uranus","Neptune","Pluto","North Node","South Node","Chiron","Lilith"]},"minItems":1,"maxItems":14},"labels":{"type":"object","properties":{"asc":{"type":"string","minLength":1,"maxLength":40},"dsc":{"type":"string","minLength":1,"maxLength":40},"mc":{"type":"string","minLength":1,"maxLength":40},"ic":{"type":"string","minLength":1,"maxLength":40},"title":{"type":"string","minLength":1,"maxLength":200},"desc":{"type":"string","minLength":1,"maxLength":2000},"bodies":{"type":"object","properties":{"Sun":{"type":"string","minLength":1,"maxLength":40},"Moon":{"type":"string","minLength":1,"maxLength":40},"Mercury":{"type":"string","minLength":1,"maxLength":40},"Venus":{"type":"string","minLength":1,"maxLength":40},"Mars":{"type":"string","minLength":1,"maxLength":40},"Jupiter":{"type":"string","minLength":1,"maxLength":40},"Saturn":{"type":"string","minLength":1,"maxLength":40},"Uranus":{"type":"string","minLength":1,"maxLength":40},"Neptune":{"type":"string","minLength":1,"maxLength":40},"Pluto":{"type":"string","minLength":1,"maxLength":40},"North Node":{"type":"string","minLength":1,"maxLength":40},"South Node":{"type":"string","minLength":1,"maxLength":40},"Chiron":{"type":"string","minLength":1,"maxLength":40},"Lilith":{"type":"string","minLength":1,"maxLength":40}}},"signs":{"type":"array","items":{"type":"string","minLength":1,"maxLength":40}},"retrograde":{"type":"string","minLength":1,"maxLength":40}},"additionalProperties":false,"description":"Your own words in place of the English the image would otherwise carry: the ASC/DSC/MC/IC axis labels, the SVG <title> and <desc> read by screen readers, and the planet and sign names plus the word for retrograde in each planet's data-label (theme css). bodies is keyed by the English name, signs lists twelve names from Aries. Nothing is translated for you; absent keys keep the English."},"outerLabel":{"type":"string","maxLength":40,"default":"TR"},"crossAspects":{"type":"boolean","description":"Draws the aspects between the two charts as dashed chords (the same set POST /synastry returns as crossAspects), skipping pairs with a body that is not drawn. In theme css each chord has class aw-cross-aspect, data-a (inner planet) and data-b (outer planet, b- prefix)."}}}},"required":["natal","outer"],"additionalProperties":false,"description":"Two charts you already hold, drawn as is: no birth data, 1 credit. Both must be charts."},"YearAhead":{"type":"object","properties":{"chart":{"$ref":"#/components/schemas/ChartInput"},"year":{"type":"integer","minimum":1900,"maximum":2100},"language":{"type":"string","enum":["uk","en","de","ru","pl","es","pt","hi","fr","ko","it","ja","id","tr","nl","ro","cs","vi","ar","el","hu"],"default":"uk"},"tone":{"type":"string","enum":["warm","professional","concise"],"default":"warm"},"length":{"type":"string","enum":["short","medium","long"],"default":"medium"}},"required":["chart"]},"YearRange":{"type":"object","properties":{"startYear":{"type":"number","nullable":true},"endYear":{"type":"number","nullable":true}},"required":["startYear","endYear"]},"YearlyFusion":{"allOf":[{"$ref":"#/components/schemas/ChartInput"},{"type":"object","properties":{"year":{"type":"integer","minimum":1900,"maximum":2100}},"required":["year"],"additionalProperties":{"nullable":true}}],"description":"Birth data for a single natal chart. Required: date (YYYY-MM-DD), time (HH:mm:ss), latitude and longitude in decimal degrees. The short forms lat, lon, lng and tz are rejected with 400 INVALID_FIELD; pass the full names. timezoneOffset is hours from UTC and defaults to 0, meaning UTC; send timezone instead (an IANA name such as Europe/Kyiv, or auto) and the offset for that date is worked out, summer time included. city is a display label only: nothing here geocodes it, so it never stands in for coordinates. houseSystem is a single Swiss Ephemeris letter, P by default; a name such as \"Placidus\" is refused, and the case matters because I and i are two different Sunshine systems."},"Zodiac":{"type":"object","properties":{"sign":{"type":"string","enum":["aries","taurus","gemini","cancer","leo","virgo","libra","scorpio","sagittarius","capricorn","aquarius","pisces"]}},"required":["sign"]},"Zr":{"allOf":[{"$ref":"#/components/schemas/ChartInput"},{"type":"object","properties":{"years":{"type":"integer","minimum":20,"maximum":120,"default":80}},"additionalProperties":{"nullable":true}}],"description":"Birth data for a single natal chart. Required: date (YYYY-MM-DD), time (HH:mm:ss), latitude and longitude in decimal degrees. The short forms lat, lon, lng and tz are rejected with 400 INVALID_FIELD; pass the full names. timezoneOffset is hours from UTC and defaults to 0, meaning UTC; send timezone instead (an IANA name such as Europe/Kyiv, or auto) and the offset for that date is worked out, summer time included. city is a display label only: nothing here geocodes it, so it never stands in for coordinates. houseSystem is a single Swiss Ephemeris letter, P by default; a name such as \"Placidus\" is refused, and the case matters because I and i are two different Sunshine systems."}},"parameters":{"ResponseFields":{"in":"query","name":"fields","required":false,"schema":{"type":"string"},"description":"Comma-separated dotted paths, relative to `data`, to keep in the response. A path is applied to every element of an array, so `planets.name` means the name of each planet. Paths that match nothing come back in `_fields_unmatched`; a list where nothing matches at all is a 400, because an empty object would be a confident wrong answer.","example":"planets.name,planets.longitude"},"ResponsePrecision":{"in":"query","name":"precision","required":false,"schema":{"type":"integer","minimum":0,"maximum":15},"description":"Round every non-integer number in the response to this many decimal places. Integers are left alone, because an id is not a measurement. Ecliptic longitudes ship with fourteen decimals by default; 2 is about a tenth of an arcminute.","example":4}}},"paths":{"/chart":{"post":{"tags":["Core"],"summary":"Natal Chart","description":"Calculate a full natal chart: planets, house cusps, aspects, sect, and angular data for a given birth moment. When the birth time is unknown, send timeUnknown: true instead of time and the response carries planets and aspects with houses, angles and sect set to null, plus a timeUnknown block giving the range the Moon covers that day. With ?lang= the response adds localized: planet, sign and aspect names in that language, keyed by the English names.","operationId":"chart","x-quality":"green","x-source":"Standard Western natal chart conventions: Placidus houses (default), tropical zodiac, Sun-Moon-Asc Big Three. Engine: Swiss Ephemeris WASM (Astrodienst aloistr/swisseph) via shared @/core lib.","security":[{"ApiKeyAuth":[]}],"parameters":[{"in":"query","name":"lang","required":false,"schema":{"type":"string","enum":["uk","en","de","ru","pl","es","pt","fr","it","nl","cs","ro","hu","el","tr","ar","hi","ja","ko","vi","id"],"example":"de"},"description":"Adds `localized`: planet, sign and aspect names in this language, keyed by the English identifiers the response already uses. Without it the response is unchanged; `Accept-Language` alone does not add it."},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInputUnknownTime"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/chart \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/chart', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/chart',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('chart', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"input":{"type":"object","properties":{"name":{"type":"string","nullable":true},"date":{"type":"string","nullable":true},"time":{"type":"string","nullable":true},"timezoneOffset":{"type":"number","nullable":true},"latitude":{"type":"number","nullable":true},"longitude":{"type":"number","nullable":true},"houseSystem":{"type":"string","nullable":true},"city":{"type":"string","nullable":true},"cosmogram":{"type":"boolean","nullable":true}},"nullable":true},"julianDay":{"type":"number","nullable":true},"siderealTime":{"type":"number","nullable":true},"planets":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"longitude":{"type":"number","nullable":true},"latitude":{"type":"number","nullable":true},"distance":{"type":"number","nullable":true},"speedLong":{"type":"number","nullable":true},"speedLat":{"type":"number","nullable":true},"speedDist":{"type":"number","nullable":true},"isRetrograde":{"type":"boolean","nullable":true},"declination":{"type":"number","nullable":true},"rightAscension":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"houses":{"type":"object","properties":{"system":{"type":"string","nullable":true},"cusps":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"ascendant":{"type":"number","nullable":true},"mc":{"type":"number","nullable":true},"armc":{"type":"number","nullable":true},"vertex":{"type":"number","nullable":true},"equatorialAsc":{"type":"number","nullable":true},"coAscWK":{"type":"number","nullable":true},"coAscMunkasey":{"type":"number","nullable":true},"polarAsc":{"type":"number","nullable":true}},"nullable":true},"aspects":{"type":"array","items":{"type":"object","properties":{"planet1":{"type":"string","nullable":true},"planet2":{"type":"string","nullable":true},"planet1Id":{"type":"number","nullable":true},"planet2Id":{"type":"number","nullable":true},"type":{"type":"object","properties":{"name":{"type":"string","nullable":true},"i18nKey":{"type":"string","nullable":true},"angle":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true},"symbol":{"type":"string","nullable":true},"isMajor":{"type":"boolean","nullable":true},"color":{"type":"string","nullable":true}},"nullable":true},"exactAngle":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true},"isApplying":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true},"houseAspects":{"type":"array","items":{"type":"object","properties":{"planetName":{"type":"string","nullable":true},"planetId":{"type":"number","nullable":true},"houseIndex":{"type":"number","nullable":true},"cuspLongitude":{"type":"number","nullable":true},"type":{"type":"object","properties":{"name":{"type":"string","nullable":true},"i18nKey":{"type":"string","nullable":true},"angle":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true},"symbol":{"type":"string","nullable":true},"isMajor":{"type":"boolean","nullable":true},"color":{"type":"string","nullable":true}},"nullable":true},"exactAngle":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true},"isApplying":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true},"parallelAspects":{"type":"array","items":{"type":"object","properties":{"planet1":{"type":"string","nullable":true},"planet2":{"type":"string","nullable":true},"planet1Id":{"type":"number","nullable":true},"planet2Id":{"type":"number","nullable":true},"type":{"type":"string","nullable":true},"exactDiff":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"antiscia":{"type":"array","items":{"type":"object","properties":{"planetId":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"antiscion":{"type":"number","nullable":true},"contraAntiscion":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"antisciaAspects":{"type":"array","items":{},"nullable":true},"chartSect":{"type":"string","nullable":true},"meta":{"type":"object","properties":{"engineVersion":{"type":"string","nullable":true},"calculatedAt":{"type":"string","nullable":true}},"nullable":true},"localized":{"type":"object","properties":{"planets":{"type":"object","properties":{"Sun":{"type":"string","nullable":true},"Moon":{"type":"string","nullable":true}},"nullable":true},"signs":{"type":"object","properties":{"aries":{"type":"string","nullable":true},"taurus":{"type":"string","nullable":true}},"nullable":true},"aspects":{"type":"object","properties":{"Trine":{"type":"string","nullable":true}},"nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"input":{"name":"","date":"1990-05-15","time":"15:30:00","timezoneOffset":4,"latitude":50.45,"longitude":30.52,"houseSystem":"P","city":"","cosmogram":false},"julianDay":2448026.9791666665,"siderealTime":3.029043551629416,"planets":[{"id":0,"name":"Sun","longitude":54.37601980167181,"latitude":-0.000020054940759470553,"distance":1.0108955908980104,"speedLong":0.9642248003676466,"speedLat":0.00003805311526169511,"speedDist":0.00022039347866615117,"isRetrograde":false,"declination":18.867035147029778,"rightAscension":52.00919841916813}],"houses":{"system":"P","cusps":[169.9679500481848],"ascendant":169.9679500481848,"mc":77.07426201523143,"armc":75.95565327444125,"vertex":336.6271586045666,"equatorialAsc":164.74875654391414,"coAscWK":149.27468505332592,"coAscMunkasey":168.73706704232438,"polarAsc":329.2746850533259},"aspects":[{"planet1":"Sun","planet2":"Moon","planet1Id":0,"planet2Id":1,"type":{"name":"Trine","i18nKey":"aspect_trine","angle":120,"orb":12,"symbol":"△","isMajor":true,"color":"#3366cc"},"exactAngle":117.47133202515602,"orb":2.5286679748439838,"isApplying":false}],"houseAspects":[{"planetName":"Sun","planetId":0,"houseIndex":0,"cuspLongitude":169.9679500481848,"type":{"name":"Trine","i18nKey":"aspect_trine","angle":120,"orb":12,"symbol":"△","isMajor":true,"color":"#3366cc"},"exactAngle":115.59193024651299,"orb":4.408069753487013,"isApplying":false}],"parallelAspects":[{"planet1":"Moon","planet2":"Saturn","planet1Id":1,"planet2Id":6,"type":"parallel","exactDiff":0.9889902750346735,"orb":0.9889902750346735}],"antiscia":[{"planetId":0,"planetName":"Sun","antiscion":125.62398019832818,"contraAntiscion":305.6239801983282}],"antisciaAspects":[],"chartSect":"diurnal","meta":{"engineVersion":"2.10.03","calculatedAt":"2026-08-23T22:03:43.067Z"},"localized":{"planets":{"Sun":"Sonne","Moon":"Mond"},"signs":{"aries":"Widder","taurus":"Stier"},"aspects":{"Trine":"Trigon"}}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}}}},"/planets":{"post":{"tags":["Core"],"summary":"Planet Positions","description":"Calculate raw planet longitudes for a given date/time without full chart context (no houses, no aspects).","operationId":"planets","x-quality":"green","x-source":"Standard Western natal chart conventions: Placidus houses (default), tropical zodiac, Sun-Moon-Asc Big Three. Engine: Swiss Ephemeris WASM (Astrodienst aloistr/swisseph) via shared @/core lib.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/planets \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/planets', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/planets',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('planets', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"planets":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"longitude":{"type":"number","nullable":true},"latitude":{"type":"number","nullable":true},"distance":{"type":"number","nullable":true},"speedLong":{"type":"number","nullable":true},"speedLat":{"type":"number","nullable":true},"speedDist":{"type":"number","nullable":true},"isRetrograde":{"type":"boolean","nullable":true},"declination":{"type":"number","nullable":true},"rightAscension":{"type":"number","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"planets":[{"id":0,"name":"Sun","longitude":54.37601980167181,"latitude":-0.000020054940759470553,"distance":1.0108955908980104,"speedLong":0.9642248003676466,"speedLat":0.00003805311526169511,"speedDist":0.00022039347866615117,"isRetrograde":false,"declination":18.867035147029778,"rightAscension":52.00919841916813}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/ephemeris":{"post":{"tags":["Core"],"summary":"Ephemeris Range","description":"Return planet positions for a date range with configurable step (min 0.01 days). Max range: 1 year for sub-day steps, 5 years otherwise. Optionally filter by planetIds.","operationId":"ephemeris","x-quality":"green","x-source":"Standard Western natal chart conventions: Placidus houses (default), tropical zodiac, Sun-Moon-Asc Big Three. Engine: Swiss Ephemeris WASM (Astrodienst aloistr/swisseph) via shared @/core lib.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ephemeris"},"example":{"startDate":"2024-01-01","endDate":"2024-12-31","stepDays":1,"planetIds":[0,1,2]}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/ephemeris \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"startDate\": \"2024-01-01\", \"endDate\": \"2024-12-31\", \"stepDays\": 1, \"planetIds\": [ 0, 1, 2 ] }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/ephemeris', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"startDate\": \"2024-01-01\",\n    \"endDate\": \"2024-12-31\",\n    \"stepDays\": 1,\n    \"planetIds\": [\n      0,\n      1,\n      2\n    ]\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/ephemeris',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'startDate': \"2024-01-01\",\n      'endDate': \"2024-12-31\",\n      'stepDays': 1,\n      'planetIds': [\n        0,\n        1,\n        2\n      ]\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('ephemeris', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'startDate' => '2024-01-01',\n        'endDate' => '2024-12-31',\n        'stepDays' => 1,\n        'planetIds' => [0, 1, 2],\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"ephemeris":{"type":"array","items":{"type":"object","properties":{"jd":{"type":"number","nullable":true},"date":{"type":"string","nullable":true},"positions":{"type":"array","items":{"type":"object","properties":{"planetId":{"type":"number","nullable":true},"longitude":{"type":"number","nullable":true},"isRetrograde":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"ephemeris":[{"jd":2460311,"date":"2024-01-01T12:00:00.000Z","positions":[{"planetId":0,"longitude":280.5484942560719,"isRetrograde":false}]}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/sun-times":{"post":{"tags":["Core"],"summary":"Sun Times","description":"Calculate sunrise, sunset, twilight times, and day length for a given date and geographic location.","operationId":"sun-times","x-quality":"green","x-source":"Standard Western natal chart conventions: Placidus houses (default), tropical zodiac, Sun-Moon-Asc Big Three. Engine: Swiss Ephemeris WASM (Astrodienst aloistr/swisseph) via shared @/core lib.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SunTimes"},"example":{"date":"2024-06-21","latitude":50.45,"longitude":30.52,"timezoneOffset":3}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/sun-times \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"2024-06-21\", \"latitude\": 50.45, \"longitude\": 30.52, \"timezoneOffset\": 3 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/sun-times', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"2024-06-21\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52,\n    \"timezoneOffset\": 3\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/sun-times',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"2024-06-21\",\n      'latitude': 50.45,\n      'longitude': 30.52,\n      'timezoneOffset': 3\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('sun-times', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '2024-06-21',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n        'timezoneOffset' => 3,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"sunrise":{"type":"string","nullable":true},"sunset":{"type":"string","nullable":true},"dayLength":{"type":"number","nullable":true},"dawn":{"type":"string","nullable":true},"dusk":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"sunrise":"05:03","sunset":"21:12","dayLength":969,"dawn":"04:21","dusk":"21:54"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/synastry":{"post":{"tags":["Comparisons"],"summary":"Synastry","description":"Calculate cross-chart aspects between two natal charts for relationship analysis. Either partner may set timeUnknown: true: cross-aspects are still returned, while that partner's houses, angles and sect come back null.","operationId":"synastry","x-quality":"green","x-source":"Synastry per Robert Hand \"Planets in Composite\" 1975 + Stephen Arroyo \"Relationships and Life Cycles\" 1979. Composite midpoint method per Hand. Davison time-place midpoint per Ronald Davison 1977.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwoChartUnknownTime"},"example":{"chart1":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52},"chart2":{"date":"1985-11-03","time":"09:15:00","timezone":"Europe/Kyiv","latitude":48.46,"longitude":35.04}}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/synastry \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"chart1\": { \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }, \"chart2\": { \"date\": \"1985-11-03\", \"time\": \"09:15:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 48.46, \"longitude\": 35.04 } }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/synastry', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"chart1\": {\n      \"date\": \"1990-05-15\",\n      \"time\": \"15:30:00\",\n      \"timezone\": \"Europe/Kyiv\",\n      \"latitude\": 50.45,\n      \"longitude\": 30.52\n    },\n    \"chart2\": {\n      \"date\": \"1985-11-03\",\n      \"time\": \"09:15:00\",\n      \"timezone\": \"Europe/Kyiv\",\n      \"latitude\": 48.46,\n      \"longitude\": 35.04\n    }\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/synastry',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'chart1': {\n        'date': \"1990-05-15\",\n        'time': \"15:30:00\",\n        'timezone': \"Europe/Kyiv\",\n        'latitude': 50.45,\n        'longitude': 30.52\n      },\n      'chart2': {\n        'date': \"1985-11-03\",\n        'time': \"09:15:00\",\n        'timezone': \"Europe/Kyiv\",\n        'latitude': 48.46,\n        'longitude': 35.04\n      }\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('synastry', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'chart1' => [\n            'date' => '1990-05-15',\n            'time' => '15:30:00',\n            'timezone' => 'Europe/Kyiv',\n            'latitude' => 50.45,\n            'longitude' => 30.52,\n        ],\n        'chart2' => [\n            'date' => '1985-11-03',\n            'time' => '09:15:00',\n            'timezone' => 'Europe/Kyiv',\n            'latitude' => 48.46,\n            'longitude' => 35.04,\n        ],\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"chart1":{"type":"object","properties":{"input":{"type":"object","properties":{"name":{"type":"string","nullable":true},"date":{"type":"string","nullable":true},"time":{"type":"string","nullable":true},"timezoneOffset":{"type":"number","nullable":true},"latitude":{"type":"number","nullable":true},"longitude":{"type":"number","nullable":true},"houseSystem":{"type":"string","nullable":true},"city":{"type":"string","nullable":true},"cosmogram":{"type":"boolean","nullable":true}},"nullable":true},"julianDay":{"type":"number","nullable":true},"siderealTime":{"type":"number","nullable":true},"planets":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"longitude":{"type":"number","nullable":true},"latitude":{"type":"number","nullable":true},"distance":{"type":"number","nullable":true},"speedLong":{"type":"number","nullable":true},"speedLat":{"type":"number","nullable":true},"speedDist":{"type":"number","nullable":true},"isRetrograde":{"type":"boolean","nullable":true},"declination":{"type":"number","nullable":true},"rightAscension":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"houses":{"type":"object","properties":{"system":{"type":"string","nullable":true},"cusps":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"ascendant":{"type":"number","nullable":true},"mc":{"type":"number","nullable":true},"armc":{"type":"number","nullable":true},"vertex":{"type":"number","nullable":true},"equatorialAsc":{"type":"number","nullable":true},"coAscWK":{"type":"number","nullable":true},"coAscMunkasey":{"type":"number","nullable":true},"polarAsc":{"type":"number","nullable":true}},"nullable":true},"aspects":{"type":"array","items":{"type":"object","properties":{"planet1":{"type":"string","nullable":true},"planet2":{"type":"string","nullable":true},"planet1Id":{"type":"number","nullable":true},"planet2Id":{"type":"number","nullable":true},"type":{"type":"object","properties":{"name":{"type":"string","nullable":true},"i18nKey":{"type":"string","nullable":true},"angle":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true},"symbol":{"type":"string","nullable":true},"isMajor":{"type":"boolean","nullable":true},"color":{"type":"string","nullable":true}},"nullable":true},"exactAngle":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true},"isApplying":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true},"houseAspects":{"type":"array","items":{"type":"object","properties":{"planetName":{"type":"string","nullable":true},"planetId":{"type":"number","nullable":true},"houseIndex":{"type":"number","nullable":true},"cuspLongitude":{"type":"number","nullable":true},"type":{"type":"object","properties":{"name":{"type":"string","nullable":true},"i18nKey":{"type":"string","nullable":true},"angle":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true},"symbol":{"type":"string","nullable":true},"isMajor":{"type":"boolean","nullable":true},"color":{"type":"string","nullable":true}},"nullable":true},"exactAngle":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true},"isApplying":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true},"parallelAspects":{"type":"array","items":{"type":"object","properties":{"planet1":{"type":"string","nullable":true},"planet2":{"type":"string","nullable":true},"planet1Id":{"type":"number","nullable":true},"planet2Id":{"type":"number","nullable":true},"type":{"type":"string","nullable":true},"exactDiff":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"antiscia":{"type":"array","items":{"type":"object","properties":{"planetId":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"antiscion":{"type":"number","nullable":true},"contraAntiscion":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"antisciaAspects":{"type":"array","items":{},"nullable":true},"chartSect":{"type":"string","nullable":true},"meta":{"type":"object","properties":{"engineVersion":{"type":"string","nullable":true},"calculatedAt":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"chart2":{"type":"object","properties":{"input":{"type":"object","properties":{"name":{"type":"string","nullable":true},"date":{"type":"string","nullable":true},"time":{"type":"string","nullable":true},"timezoneOffset":{"type":"number","nullable":true},"latitude":{"type":"number","nullable":true},"longitude":{"type":"number","nullable":true},"houseSystem":{"type":"string","nullable":true},"city":{"type":"string","nullable":true},"cosmogram":{"type":"boolean","nullable":true}},"nullable":true},"julianDay":{"type":"number","nullable":true},"siderealTime":{"type":"number","nullable":true},"planets":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"longitude":{"type":"number","nullable":true},"latitude":{"type":"number","nullable":true},"distance":{"type":"number","nullable":true},"speedLong":{"type":"number","nullable":true},"speedLat":{"type":"number","nullable":true},"speedDist":{"type":"number","nullable":true},"isRetrograde":{"type":"boolean","nullable":true},"declination":{"type":"number","nullable":true},"rightAscension":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"houses":{"type":"object","properties":{"system":{"type":"string","nullable":true},"cusps":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"ascendant":{"type":"number","nullable":true},"mc":{"type":"number","nullable":true},"armc":{"type":"number","nullable":true},"vertex":{"type":"number","nullable":true},"equatorialAsc":{"type":"number","nullable":true},"coAscWK":{"type":"number","nullable":true},"coAscMunkasey":{"type":"number","nullable":true},"polarAsc":{"type":"number","nullable":true}},"nullable":true},"aspects":{"type":"array","items":{"type":"object","properties":{"planet1":{"type":"string","nullable":true},"planet2":{"type":"string","nullable":true},"planet1Id":{"type":"number","nullable":true},"planet2Id":{"type":"number","nullable":true},"type":{"type":"object","properties":{"name":{"type":"string","nullable":true},"i18nKey":{"type":"string","nullable":true},"angle":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true},"symbol":{"type":"string","nullable":true},"isMajor":{"type":"boolean","nullable":true},"color":{"type":"string","nullable":true}},"nullable":true},"exactAngle":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true},"isApplying":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true},"houseAspects":{"type":"array","items":{"type":"object","properties":{"planetName":{"type":"string","nullable":true},"planetId":{"type":"number","nullable":true},"houseIndex":{"type":"number","nullable":true},"cuspLongitude":{"type":"number","nullable":true},"type":{"type":"object","properties":{"name":{"type":"string","nullable":true},"i18nKey":{"type":"string","nullable":true},"angle":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true},"symbol":{"type":"string","nullable":true},"isMajor":{"type":"boolean","nullable":true},"color":{"type":"string","nullable":true}},"nullable":true},"exactAngle":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true},"isApplying":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true},"parallelAspects":{"type":"array","items":{"type":"object","properties":{"planet1":{"type":"string","nullable":true},"planet2":{"type":"string","nullable":true},"planet1Id":{"type":"number","nullable":true},"planet2Id":{"type":"number","nullable":true},"type":{"type":"string","nullable":true},"exactDiff":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"antiscia":{"type":"array","items":{"type":"object","properties":{"planetId":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"antiscion":{"type":"number","nullable":true},"contraAntiscion":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"antisciaAspects":{"type":"array","items":{},"nullable":true},"chartSect":{"type":"string","nullable":true},"meta":{"type":"object","properties":{"engineVersion":{"type":"string","nullable":true},"calculatedAt":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"crossAspects":{"type":"array","items":{"type":"object","properties":{"planet1":{"type":"string","nullable":true},"planet1Id":{"type":"number","nullable":true},"planet2":{"type":"string","nullable":true},"planet2Id":{"type":"number","nullable":true},"type":{"type":"object","properties":{"name":{"type":"string","nullable":true},"i18nKey":{"type":"string","nullable":true},"angle":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true},"symbol":{"type":"string","nullable":true},"isMajor":{"type":"boolean","nullable":true},"color":{"type":"string","nullable":true}},"nullable":true},"exactAngle":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true},"isApplying":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true},"compatibility":{"type":"object","properties":{"score":{"type":"number","nullable":true},"label":{"type":"string","nullable":true},"harmony":{"type":"number","nullable":true},"tension":{"type":"number","nullable":true},"top":{"type":"array","items":{"type":"object","properties":{"aspect":{"type":"object","properties":{"planet1":{"type":"string","nullable":true},"planet1Id":{"type":"number","nullable":true},"planet2":{"type":"string","nullable":true},"planet2Id":{"type":"number","nullable":true},"type":{"type":"object","properties":{"name":{"type":"string","nullable":true},"i18nKey":{"type":"string","nullable":true},"angle":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true},"symbol":{"type":"string","nullable":true},"isMajor":{"type":"boolean","nullable":true},"color":{"type":"string","nullable":true}},"nullable":true},"exactAngle":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true},"isApplying":{"type":"boolean","nullable":true}},"nullable":true},"strength":{"type":"number","nullable":true},"sign":{"type":"number","nullable":true}},"nullable":true},"nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"chart1":{"input":{"name":"","date":"1990-05-15","time":"15:30:00","timezoneOffset":4,"latitude":50.45,"longitude":30.52,"houseSystem":"P","city":"","cosmogram":false},"julianDay":2448026.9791666665,"siderealTime":3.029043551629416,"planets":[{"id":0,"name":"Sun","longitude":54.37601980167181,"latitude":-0.000020054940759470553,"distance":1.0108955908980104,"speedLong":0.9642248003676466,"speedLat":0.00003805311526169511,"speedDist":0.00022039347866615117,"isRetrograde":false,"declination":18.867035147029778,"rightAscension":52.00919841916813}],"houses":{"system":"P","cusps":[169.9679500481848],"ascendant":169.9679500481848,"mc":77.07426201523143,"armc":75.95565327444125,"vertex":336.6271586045666,"equatorialAsc":164.74875654391414,"coAscWK":149.27468505332592,"coAscMunkasey":168.73706704232438,"polarAsc":329.2746850533259},"aspects":[{"planet1":"Sun","planet2":"Moon","planet1Id":0,"planet2Id":1,"type":{"name":"Trine","i18nKey":"aspect_trine","angle":120,"orb":12,"symbol":"△","isMajor":true,"color":"#3366cc"},"exactAngle":117.47133202515602,"orb":2.5286679748439838,"isApplying":false}],"houseAspects":[{"planetName":"Sun","planetId":0,"houseIndex":0,"cuspLongitude":169.9679500481848,"type":{"name":"Trine","i18nKey":"aspect_trine","angle":120,"orb":12,"symbol":"△","isMajor":true,"color":"#3366cc"},"exactAngle":115.59193024651299,"orb":4.408069753487013,"isApplying":false}],"parallelAspects":[{"planet1":"Moon","planet2":"Saturn","planet1Id":1,"planet2Id":6,"type":"parallel","exactDiff":0.9889902750346735,"orb":0.9889902750346735}],"antiscia":[{"planetId":0,"planetName":"Sun","antiscion":125.62398019832818,"contraAntiscion":305.6239801983282}],"antisciaAspects":[],"chartSect":"diurnal","meta":{"engineVersion":"2.10.03","calculatedAt":"2026-08-23T22:24:02.486Z"}},"chart2":{"input":{"name":"","date":"1985-11-03","time":"09:15:00","timezoneOffset":3,"latitude":48.46,"longitude":35.04,"houseSystem":"P","city":"","cosmogram":false},"julianDay":2446372.7604166665,"siderealTime":9.08021654643949,"planets":[{"id":0,"name":"Sun","longitude":220.77033612885523,"latitude":0.00017390409589492878,"distance":0.9919111684105741,"speedLong":1.001466165031108,"speedLat":0.00001657793612950324,"speedDist":-0.00024797941616784515,"isRetrograde":false,"declination":-15.058009781877828,"rightAscension":218.34750425400088}],"houses":{"system":"P","cusps":[239.2194912194484],"ascendant":239.2194912194484,"mc":170.4692673562458,"armc":171.24324819659233,"vertex":102.15081754955976,"equatorialAsc":261.95619251649237,"coAscWK":287.38103061998686,"coAscMunkasey":243.52896760432273,"polarAsc":107.38103061998683},"aspects":[{"planet1":"Sun","planet2":"Moon","planet1Id":0,"planet2Id":1,"type":{"name":"Trine","i18nKey":"aspect_trine","angle":120,"orb":12,"symbol":"△","isMajor":true,"color":"#3366cc"},"exactAngle":119.79213346849329,"orb":0.20786653150670986,"isApplying":false}],"houseAspects":[{"planetName":"Sun","planetId":0,"houseIndex":2,"cuspLongitude":311.9608523725515,"type":{"name":"Square","i18nKey":"aspect_square","angle":90,"orb":10,"symbol":"□","isMajor":true,"color":"#cc3333"},"exactAngle":91.1905162436963,"orb":1.190516243696294,"isApplying":true}],"parallelAspects":[{"planet1":"Sun","planet2":"true Node","planet1Id":0,"planet2Id":11,"type":"contra-parallel","exactDiff":0.5016816840850105,"orb":0.5016816840850105}],"antiscia":[{"planetId":0,"planetName":"Sun","antiscion":319.2296638711448,"contraAntiscion":139.22966387114477}],"antisciaAspects":[],"chartSect":"diurnal","meta":{"engineVersion":"2.10.03","calculatedAt":"2026-08-23T22:24:02.486Z"}},"crossAspects":[{"planet1":"Sun","planet1Id":0,"planet2":"Saturn","planet2Id":6,"type":{"name":"Opposition","i18nKey":"aspect_opposition","angle":180,"orb":12,"symbol":"☍","isMajor":true,"color":"#cc3333"},"exactAngle":175.99902688473145,"orb":4.00097311526855,"isApplying":true}],"compatibility":{"score":51,"label":"mixed","harmony":15.8,"tension":16.8,"top":[{"aspect":{"planet1":"Venus","planet1Id":3,"planet2":"Moon","planet2Id":1,"type":{"name":"Square","i18nKey":"aspect_square","angle":90,"orb":10,"symbol":"□","isMajor":true,"color":"#cc3333"},"exactAngle":88.18365203424705,"orb":1.8163479657529535,"isApplying":false},"strength":2.0869825615583784,"sign":-1}]}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/match/score":{"post":{"tags":["Comparisons"],"summary":"Match Score (dating compatibility)","description":"One-call dating-compatibility aggregate over the synastry engine: overall score (0-100) + label + harmony/tension, the attraction score (Venus-Mars / Moon-Venus / 5th-house), the most influential cross-aspects, and green/red flags surfaced from those aspects. Built for dating apps that want a single call instead of synastry + attraction + their own flag logic. Same TwoChart input as /synastry.","operationId":"match_score","x-quality":"green","x-source":"Re-shapes the GREEN synastry engine (calcCompatibilityScore + calcAttractionScore); flags surface the same cross-aspects (harmonious personal vs hard Mars/Saturn/Uranus/Pluto). No invented scoring model.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwoChart"},"example":{"chart1":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52},"chart2":{"date":"1985-11-03","time":"09:15:00","timezone":"Europe/Kyiv","latitude":48.46,"longitude":35.04}}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/match/score \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"chart1\": { \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }, \"chart2\": { \"date\": \"1985-11-03\", \"time\": \"09:15:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 48.46, \"longitude\": 35.04 } }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/match/score', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"chart1\": {\n      \"date\": \"1990-05-15\",\n      \"time\": \"15:30:00\",\n      \"timezone\": \"Europe/Kyiv\",\n      \"latitude\": 50.45,\n      \"longitude\": 30.52\n    },\n    \"chart2\": {\n      \"date\": \"1985-11-03\",\n      \"time\": \"09:15:00\",\n      \"timezone\": \"Europe/Kyiv\",\n      \"latitude\": 48.46,\n      \"longitude\": 35.04\n    }\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/match/score',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'chart1': {\n        'date': \"1990-05-15\",\n        'time': \"15:30:00\",\n        'timezone': \"Europe/Kyiv\",\n        'latitude': 50.45,\n        'longitude': 30.52\n      },\n      'chart2': {\n        'date': \"1985-11-03\",\n        'time': \"09:15:00\",\n        'timezone': \"Europe/Kyiv\",\n        'latitude': 48.46,\n        'longitude': 35.04\n      }\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('match/score', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'chart1' => [\n            'date' => '1990-05-15',\n            'time' => '15:30:00',\n            'timezone' => 'Europe/Kyiv',\n            'latitude' => 50.45,\n            'longitude' => 30.52,\n        ],\n        'chart2' => [\n            'date' => '1985-11-03',\n            'time' => '09:15:00',\n            'timezone' => 'Europe/Kyiv',\n            'latitude' => 48.46,\n            'longitude' => 35.04,\n        ],\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"score":{"type":"number","nullable":true},"label":{"type":"string","nullable":true},"harmony":{"type":"number","nullable":true},"tension":{"type":"number","nullable":true},"attraction":{"type":"object","properties":{"score":{"type":"number","nullable":true},"components":{"type":"object","properties":{"sunMoon":{"type":"number","nullable":true},"marsVenus":{"type":"number","nullable":true},"ascDsc":{"type":"number","nullable":true},"marsMars":{"type":"number","nullable":true},"sunMars":{"type":"number","nullable":true},"fifthHouseOverlay":{"type":"number","nullable":true}},"nullable":true},"notes":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}},"nullable":true},"topAspects":{"type":"array","items":{"type":"object","properties":{"aspect":{"type":"string","nullable":true},"planet1":{"type":"string","nullable":true},"planet2":{"type":"string","nullable":true},"type":{"type":"string","nullable":true},"angle":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true},"tone":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"greenFlags":{"type":"array","items":{"type":"object","properties":{"aspect":{"type":"string","nullable":true},"note":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"redFlags":{"type":"array","items":{"type":"object","properties":{"aspect":{"type":"string","nullable":true},"note":{"type":"string","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"score":51,"label":"mixed","harmony":15.8,"tension":16.8,"attraction":{"score":10.12,"components":{"sunMoon":0,"marsVenus":0,"ascDsc":5.92,"marsMars":0,"sunMars":4.2,"fifthHouseOverlay":0},"notes":["chart1 Sun on chart2 DSC (orb 4.8°)","Moon-Venus Square"]},"topAspects":[{"aspect":"Venus square Moon","planet1":"Venus","planet2":"Moon","type":"Square","angle":90,"orb":1.8,"tone":"challenging"},{"aspect":"Jupiter conjunction Moon","planet1":"Jupiter","planet2":"Moon","type":"Conjunction","angle":0,"orb":1.4,"tone":"harmonious"}],"greenFlags":[{"aspect":"Jupiter conjunction Moon","note":"emotional bond"}],"redFlags":[{"aspect":"Uranus opposition Moon","note":"emotional bond"}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/composite":{"post":{"tags":["Comparisons"],"summary":"Composite Chart","description":"Calculate a midpoint composite chart by averaging the planetary positions and house cusps of two natal charts.","operationId":"composite","x-quality":"green","x-source":"Synastry per Robert Hand \"Planets in Composite\" 1975 + Stephen Arroyo \"Relationships and Life Cycles\" 1979. Composite midpoint method per Hand. Davison time-place midpoint per Ronald Davison 1977.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwoChart"},"example":{"chart1":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52},"chart2":{"date":"1985-11-03","time":"09:15:00","timezone":"Europe/Kyiv","latitude":48.46,"longitude":35.04}}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/composite \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"chart1\": { \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }, \"chart2\": { \"date\": \"1985-11-03\", \"time\": \"09:15:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 48.46, \"longitude\": 35.04 } }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/composite', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"chart1\": {\n      \"date\": \"1990-05-15\",\n      \"time\": \"15:30:00\",\n      \"timezone\": \"Europe/Kyiv\",\n      \"latitude\": 50.45,\n      \"longitude\": 30.52\n    },\n    \"chart2\": {\n      \"date\": \"1985-11-03\",\n      \"time\": \"09:15:00\",\n      \"timezone\": \"Europe/Kyiv\",\n      \"latitude\": 48.46,\n      \"longitude\": 35.04\n    }\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/composite',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'chart1': {\n        'date': \"1990-05-15\",\n        'time': \"15:30:00\",\n        'timezone': \"Europe/Kyiv\",\n        'latitude': 50.45,\n        'longitude': 30.52\n      },\n      'chart2': {\n        'date': \"1985-11-03\",\n        'time': \"09:15:00\",\n        'timezone': \"Europe/Kyiv\",\n        'latitude': 48.46,\n        'longitude': 35.04\n      }\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('composite', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'chart1' => [\n            'date' => '1990-05-15',\n            'time' => '15:30:00',\n            'timezone' => 'Europe/Kyiv',\n            'latitude' => 50.45,\n            'longitude' => 30.52,\n        ],\n        'chart2' => [\n            'date' => '1985-11-03',\n            'time' => '09:15:00',\n            'timezone' => 'Europe/Kyiv',\n            'latitude' => 48.46,\n            'longitude' => 35.04,\n        ],\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"input":{"type":"object","properties":{"name":{"type":"string","nullable":true},"date":{"type":"string","nullable":true},"time":{"type":"string","nullable":true},"timezoneOffset":{"type":"number","nullable":true},"latitude":{"type":"number","nullable":true},"longitude":{"type":"number","nullable":true},"city":{"type":"string","nullable":true},"houseSystem":{"type":"string","nullable":true}},"nullable":true},"julianDay":{"type":"number","nullable":true},"siderealTime":{"type":"number","nullable":true},"planets":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"longitude":{"type":"number","nullable":true},"latitude":{"type":"number","nullable":true},"distance":{"type":"number","nullable":true},"speedLong":{"type":"number","nullable":true},"speedLat":{"type":"number","nullable":true},"speedDist":{"type":"number","nullable":true},"isRetrograde":{"type":"boolean","nullable":true},"declination":{"type":"number","nullable":true},"rightAscension":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"houses":{"type":"object","properties":{"system":{"type":"string","nullable":true},"cusps":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"ascendant":{"type":"number","nullable":true},"mc":{"type":"number","nullable":true},"armc":{"type":"number","nullable":true},"vertex":{"type":"number","nullable":true},"equatorialAsc":{"type":"number","nullable":true}},"nullable":true},"aspects":{"type":"array","items":{"type":"object","properties":{"planet1":{"type":"string","nullable":true},"planet2":{"type":"string","nullable":true},"planet1Id":{"type":"number","nullable":true},"planet2Id":{"type":"number","nullable":true},"type":{"type":"object","properties":{"name":{"type":"string","nullable":true},"i18nKey":{"type":"string","nullable":true},"angle":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true},"symbol":{"type":"string","nullable":true},"isMajor":{"type":"boolean","nullable":true},"color":{"type":"string","nullable":true}},"nullable":true},"exactAngle":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true},"isApplying":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true},"parallelAspects":{"type":"array","items":{"type":"object","properties":{"planet1":{"type":"string","nullable":true},"planet2":{"type":"string","nullable":true},"planet1Id":{"type":"number","nullable":true},"planet2Id":{"type":"number","nullable":true},"type":{"type":"string","nullable":true},"exactDiff":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"antiscia":{"type":"array","items":{"type":"object","properties":{"planetId":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"antiscion":{"type":"number","nullable":true},"contraAntiscion":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"antisciaAspects":{"type":"array","items":{"type":"object","properties":{"planet1":{"type":"string","nullable":true},"planet1Id":{"type":"number","nullable":true},"planet2":{"type":"string","nullable":true},"planet2Id":{"type":"number","nullable":true},"type":{"type":"string","nullable":true},"orb":{"type":"number","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"input":{"name":"Composite:  & ","date":"1990-05-15","time":"15:30:00","timezoneOffset":4,"latitude":50.45,"longitude":30.52,"city":" / ","houseSystem":"P"},"julianDay":2447199.8697916665,"siderealTime":18.054676631224762,"planets":[{"id":0,"name":"Sun","longitude":137.5731779652635,"latitude":0.00007692457756772911,"distance":1.0014033796542923,"speedLong":0.9828454826993773,"speedLat":0.000027315525695599175,"speedDist":-0.00001379296875084699,"isRetrograde":false,"declination":1.9045126825759748,"rightAscension":135.1783513365845}],"houses":{"system":"P","cusps":[204.23639247876403],"ascendant":204.23639247876403,"mc":121.36406239633548,"armc":123.5994507355168,"vertex":52.551218828162696,"equatorialAsc":215.9106110495879},"aspects":[{"planet1":"Sun","planet2":"Moon","planet1Id":0,"planet2Id":1,"type":{"name":"Trine","i18nKey":"aspect_trine","angle":120,"orb":12,"symbol":"△","isMajor":true,"color":"#3366cc"},"exactAngle":118.63173274682467,"orb":1.3682672531753326,"isApplying":false}],"parallelAspects":[{"planet1":"Sun","planet2":"Moon","planet1Id":0,"planet2Id":1,"type":"parallel","exactDiff":0.9550159899191932,"orb":0.9550159899191932}],"antiscia":[{"planetId":0,"planetName":"Sun","antiscion":42.42682203473646,"contraAntiscion":222.4268220347365}],"antisciaAspects":[{"planet1":"Pluto","planet1Id":9,"planet2":"mean Apogee","planet2Id":12,"type":"antiscia","orb":0.1583850589776148}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/davison":{"post":{"tags":["Comparisons"],"summary":"Davison Chart","description":"Calculate a Davison relationship chart using the midpoint in time and space between two birth moments.","operationId":"davison","x-quality":"green","x-source":"Synastry per Robert Hand \"Planets in Composite\" 1975 + Stephen Arroyo \"Relationships and Life Cycles\" 1979. Composite midpoint method per Hand. Davison time-place midpoint per Ronald Davison 1977.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwoChart"},"example":{"chart1":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52},"chart2":{"date":"1985-11-03","time":"09:15:00","timezone":"Europe/Kyiv","latitude":48.46,"longitude":35.04}}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/davison \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"chart1\": { \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }, \"chart2\": { \"date\": \"1985-11-03\", \"time\": \"09:15:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 48.46, \"longitude\": 35.04 } }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/davison', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"chart1\": {\n      \"date\": \"1990-05-15\",\n      \"time\": \"15:30:00\",\n      \"timezone\": \"Europe/Kyiv\",\n      \"latitude\": 50.45,\n      \"longitude\": 30.52\n    },\n    \"chart2\": {\n      \"date\": \"1985-11-03\",\n      \"time\": \"09:15:00\",\n      \"timezone\": \"Europe/Kyiv\",\n      \"latitude\": 48.46,\n      \"longitude\": 35.04\n    }\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/davison',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'chart1': {\n        'date': \"1990-05-15\",\n        'time': \"15:30:00\",\n        'timezone': \"Europe/Kyiv\",\n        'latitude': 50.45,\n        'longitude': 30.52\n      },\n      'chart2': {\n        'date': \"1985-11-03\",\n        'time': \"09:15:00\",\n        'timezone': \"Europe/Kyiv\",\n        'latitude': 48.46,\n        'longitude': 35.04\n      }\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('davison', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'chart1' => [\n            'date' => '1990-05-15',\n            'time' => '15:30:00',\n            'timezone' => 'Europe/Kyiv',\n            'latitude' => 50.45,\n            'longitude' => 30.52,\n        ],\n        'chart2' => [\n            'date' => '1985-11-03',\n            'time' => '09:15:00',\n            'timezone' => 'Europe/Kyiv',\n            'latitude' => 48.46,\n            'longitude' => 35.04,\n        ],\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"input":{"type":"object","properties":{"name":{"type":"string","nullable":true},"date":{"type":"string","nullable":true},"time":{"type":"string","nullable":true},"timezoneOffset":{"type":"number","nullable":true},"latitude":{"type":"number","nullable":true},"longitude":{"type":"number","nullable":true},"city":{"type":"string","nullable":true},"houseSystem":{"type":"string","nullable":true}},"nullable":true},"julianDay":{"type":"number","nullable":true},"siderealTime":{"type":"number","nullable":true},"planets":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"longitude":{"type":"number","nullable":true},"latitude":{"type":"number","nullable":true},"distance":{"type":"number","nullable":true},"speedLong":{"type":"number","nullable":true},"speedLat":{"type":"number","nullable":true},"speedDist":{"type":"number","nullable":true},"isRetrograde":{"type":"boolean","nullable":true},"declination":{"type":"number","nullable":true},"rightAscension":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"houses":{"type":"object","properties":{"system":{"type":"string","nullable":true},"cusps":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"ascendant":{"type":"number","nullable":true},"mc":{"type":"number","nullable":true},"armc":{"type":"number","nullable":true},"vertex":{"type":"number","nullable":true},"equatorialAsc":{"type":"number","nullable":true},"coAscWK":{"type":"number","nullable":true},"coAscMunkasey":{"type":"number","nullable":true},"polarAsc":{"type":"number","nullable":true}},"nullable":true},"aspects":{"type":"array","items":{"type":"object","properties":{"planet1":{"type":"string","nullable":true},"planet2":{"type":"string","nullable":true},"planet1Id":{"type":"number","nullable":true},"planet2Id":{"type":"number","nullable":true},"type":{"type":"object","properties":{"name":{"type":"string","nullable":true},"i18nKey":{"type":"string","nullable":true},"angle":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true},"symbol":{"type":"string","nullable":true},"isMajor":{"type":"boolean","nullable":true},"color":{"type":"string","nullable":true}},"nullable":true},"exactAngle":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true},"isApplying":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true},"houseAspects":{"type":"array","items":{"type":"object","properties":{"planetName":{"type":"string","nullable":true},"planetId":{"type":"number","nullable":true},"houseIndex":{"type":"number","nullable":true},"cuspLongitude":{"type":"number","nullable":true},"type":{"type":"object","properties":{"name":{"type":"string","nullable":true},"i18nKey":{"type":"string","nullable":true},"angle":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true},"symbol":{"type":"string","nullable":true},"isMajor":{"type":"boolean","nullable":true},"color":{"type":"string","nullable":true}},"nullable":true},"exactAngle":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true},"isApplying":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true},"parallelAspects":{"type":"array","items":{"type":"object","properties":{"planet1":{"type":"string","nullable":true},"planet2":{"type":"string","nullable":true},"planet1Id":{"type":"number","nullable":true},"planet2Id":{"type":"number","nullable":true},"type":{"type":"string","nullable":true},"exactDiff":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"antiscia":{"type":"array","items":{"type":"object","properties":{"planetId":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"antiscion":{"type":"number","nullable":true},"contraAntiscion":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"antisciaAspects":{"type":"array","items":{"type":"object","properties":{"planet1":{"type":"string","nullable":true},"planet1Id":{"type":"number","nullable":true},"planet2":{"type":"string","nullable":true},"planet2Id":{"type":"number","nullable":true},"type":{"type":"string","nullable":true},"orb":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"chartSect":{"type":"string","nullable":true},"meta":{"type":"object","properties":{"engineVersion":{"type":"string","nullable":true},"calculatedAt":{"type":"string","nullable":true}},"nullable":true},"midpoint":{"type":"object","properties":{"utc":{"type":"string","nullable":true},"lat":{"type":"number","nullable":true},"lng":{"type":"number","nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"input":{"name":"Davison:  & ","date":"1988-02-08","time":"08:52:30","timezoneOffset":0,"latitude":49.455,"longitude":32.78,"city":" / ","houseSystem":"P"},"julianDay":2447199.8697916665,"siderealTime":18.054676631224762,"planets":[{"id":0,"name":"Sun","longitude":318.8064683594271,"latitude":-2.3021171834512642e-8,"distance":0.9863675568381827,"speedLong":1.012713470647329,"speedLat":-0.00003073201423130371,"speedDist":0.00017463771431496235,"isRetrograde":false,"declination":-15.190022829516021,"rightAscension":321.23599072236976}],"houses":{"system":"P","cusps":[61.61023092980163],"ascendant":61.61023092980163,"mc":301.36473610682833,"armc":303.60014946837146,"vertex":206.61258051664726,"equatorialAsc":35.911331180508036,"coAscWK":24.236894176827263,"coAscMunkasey":52.55213055132587,"polarAsc":204.23689417682726},"aspects":[{"planet1":"Sun","planet2":"Moon","planet1Id":0,"planet2Id":1,"type":{"name":"Trine","i18nKey":"aspect_trine","angle":120,"orb":12,"symbol":"△","isMajor":true,"color":"#3366cc"},"exactAngle":120.03431715217826,"orb":0.03431715217826081,"isApplying":true}],"houseAspects":[{"planetName":"Sun","planetId":0,"houseIndex":1,"cuspLongitude":84.28404257862482,"type":{"name":"Trine","i18nKey":"aspect_trine","angle":120,"orb":12,"symbol":"△","isMajor":true,"color":"#3366cc"},"exactAngle":125.47757421919775,"orb":5.477574219197749,"isApplying":true}],"parallelAspects":[{"planet1":"Moon","planet2":"Mercury","planet1Id":1,"planet2Id":2,"type":"parallel","exactDiff":0.7148130536588315,"orb":0.7148130536588315}],"antiscia":[{"planetId":0,"planetName":"Sun","antiscion":221.19353164057293,"contraAntiscion":41.19353164057293}],"antisciaAspects":[{"planet1":"Mars","planet1Id":4,"planet2":"Neptune","planet2Id":8,"type":"antiscia","orb":0.31302595321483295}],"chartSect":"diurnal","meta":{"engineVersion":"2.10.03","calculatedAt":"2026-08-23T22:03:43.440Z"},"midpoint":{"utc":"1988-02-08T08:52:30Z","lat":49.455,"lng":32.78}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/coalescent":{"post":{"tags":["Comparisons"],"summary":"Coalescent Chart","description":"Calculate a coalescent chart: the harmonic chart that resonates most strongly between two charts.","operationId":"coalescent","x-quality":"yellow","x-source":"Lawrence Grinnell, \"The Coalescent Chart\" (1981). Adopted in Solar Fire, Kepler, Astrolabe.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Coalescent"},"example":{"input1":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52},"input2":{"date":"1985-11-03","time":"09:15:00","timezone":"Europe/Kyiv","latitude":48.46,"longitude":35.04}}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/coalescent \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"input1\": { \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }, \"input2\": { \"date\": \"1985-11-03\", \"time\": \"09:15:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 48.46, \"longitude\": 35.04 } }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/coalescent', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"input1\": {\n      \"date\": \"1990-05-15\",\n      \"time\": \"15:30:00\",\n      \"timezone\": \"Europe/Kyiv\",\n      \"latitude\": 50.45,\n      \"longitude\": 30.52\n    },\n    \"input2\": {\n      \"date\": \"1985-11-03\",\n      \"time\": \"09:15:00\",\n      \"timezone\": \"Europe/Kyiv\",\n      \"latitude\": 48.46,\n      \"longitude\": 35.04\n    }\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/coalescent',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'input1': {\n        'date': \"1990-05-15\",\n        'time': \"15:30:00\",\n        'timezone': \"Europe/Kyiv\",\n        'latitude': 50.45,\n        'longitude': 30.52\n      },\n      'input2': {\n        'date': \"1985-11-03\",\n        'time': \"09:15:00\",\n        'timezone': \"Europe/Kyiv\",\n        'latitude': 48.46,\n        'longitude': 35.04\n      }\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('coalescent', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'input1' => [\n            'date' => '1990-05-15',\n            'time' => '15:30:00',\n            'timezone' => 'Europe/Kyiv',\n            'latitude' => 50.45,\n            'longitude' => 30.52,\n        ],\n        'input2' => [\n            'date' => '1985-11-03',\n            'time' => '09:15:00',\n            'timezone' => 'Europe/Kyiv',\n            'latitude' => 48.46,\n            'longitude' => 35.04,\n        ],\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"input":{"type":"object","properties":{"name":{"type":"string","nullable":true},"date":{"type":"string","nullable":true},"time":{"type":"string","nullable":true},"timezoneOffset":{"type":"number","nullable":true},"latitude":{"type":"number","nullable":true},"longitude":{"type":"number","nullable":true},"houseSystem":{"type":"string","nullable":true},"city":{"type":"string","nullable":true}},"nullable":true},"julianDay":{"type":"number","nullable":true},"siderealTime":{"type":"number","nullable":true},"planets":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"longitude":{"type":"number","nullable":true},"latitude":{"type":"number","nullable":true},"distance":{"type":"number","nullable":true},"speedLong":{"type":"number","nullable":true},"speedLat":{"type":"number","nullable":true},"speedDist":{"type":"number","nullable":true},"isRetrograde":{"type":"boolean","nullable":true},"declination":{"type":"number","nullable":true},"rightAscension":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"houses":{"type":"object","properties":{"system":{"type":"string","nullable":true},"cusps":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"ascendant":{"type":"number","nullable":true},"mc":{"type":"number","nullable":true},"armc":{"type":"number","nullable":true},"vertex":{"type":"number","nullable":true},"equatorialAsc":{"type":"number","nullable":true},"coAscWK":{"type":"number","nullable":true},"coAscMunkasey":{"type":"number","nullable":true},"polarAsc":{"type":"number","nullable":true}},"nullable":true},"aspects":{"type":"array","items":{"type":"object","properties":{"planet1":{"type":"string","nullable":true},"planet2":{"type":"string","nullable":true},"planet1Id":{"type":"number","nullable":true},"planet2Id":{"type":"number","nullable":true},"type":{"type":"object","properties":{"name":{"type":"string","nullable":true},"i18nKey":{"type":"string","nullable":true},"angle":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true},"symbol":{"type":"string","nullable":true},"isMajor":{"type":"boolean","nullable":true},"color":{"type":"string","nullable":true}},"nullable":true},"exactAngle":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true},"isApplying":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true},"houseAspects":{"type":"array","items":{"type":"object","properties":{"planetName":{"type":"string","nullable":true},"planetId":{"type":"number","nullable":true},"houseIndex":{"type":"number","nullable":true},"cuspLongitude":{"type":"number","nullable":true},"type":{"type":"object","properties":{"name":{"type":"string","nullable":true},"i18nKey":{"type":"string","nullable":true},"angle":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true},"symbol":{"type":"string","nullable":true},"isMajor":{"type":"boolean","nullable":true},"color":{"type":"string","nullable":true}},"nullable":true},"exactAngle":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true},"isApplying":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true},"parallelAspects":{"type":"array","items":{"type":"object","properties":{"planet1":{"type":"string","nullable":true},"planet2":{"type":"string","nullable":true},"planet1Id":{"type":"number","nullable":true},"planet2Id":{"type":"number","nullable":true},"type":{"type":"string","nullable":true},"exactDiff":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"antiscia":{"type":"array","items":{"type":"object","properties":{"planetId":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"antiscion":{"type":"number","nullable":true},"contraAntiscion":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"antisciaAspects":{"type":"array","items":{},"nullable":true},"chartSect":{"type":"string","nullable":true},"meta":{"type":"object","properties":{"engineVersion":{"type":"string","nullable":true},"calculatedAt":{"type":"string","nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"input":{"name":"Coalescent","date":"1988-01-12","time":"20:42:21","timezoneOffset":0,"latitude":49.455,"longitude":32.78,"houseSystem":"P","city":""},"julianDay":2447173.3627430554,"siderealTime":4.143720340564857,"planets":[{"id":0,"name":"Sun","longitude":291.8628868675811,"latitude":-0.0000028637440151347395,"distance":0.9834909887351447,"speedLong":1.0189415053560238,"speedLat":-0.00002121736135846728,"speedDist":0.000051726527845501946,"isRetrograde":false,"declination":-21.667965759608165,"rightAscension":293.6219800190459}],"houses":{"system":"P","cusps":[183.56989077439184],"ascendant":183.56989077439184,"mc":94.53014803429774,"armc":94.93580510847286,"vertex":8.528913145412409,"equatorialAsc":185.3773944333107,"coAscWK":190.84824720158213,"coAscMunkasey":183.92384168726073,"polarAsc":10.848247201582112},"aspects":[{"planet1":"Sun","planet2":"Moon","planet1Id":0,"planet2Id":1,"type":{"name":"Square","i18nKey":"aspect_square","angle":90,"orb":10,"symbol":"□","isMajor":true,"color":"#cc3333"},"exactAngle":83.42445786928107,"orb":6.5755421307189295,"isApplying":false}],"houseAspects":[{"planetName":"Sun","planetId":0,"houseIndex":0,"cuspLongitude":183.56989077439184,"type":{"name":"Trine","i18nKey":"aspect_trine","angle":120,"orb":12,"symbol":"△","isMajor":true,"color":"#3366cc"},"exactAngle":108.29299609318926,"orb":11.70700390681074,"isApplying":true}],"parallelAspects":[{"planet1":"Sun","planet2":"Mercury","planet1Id":0,"planet2Id":2,"type":"parallel","exactDiff":0.577241977462382,"orb":0.577241977462382}],"antiscia":[{"planetId":0,"planetName":"Sun","antiscion":248.1371131324189,"contraAntiscion":68.1371131324189}],"antisciaAspects":[],"chartSect":"nocturnal","meta":{"engineVersion":"2.10.03","calculatedAt":"2026-08-23T22:03:43.626Z"}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/group-synastry":{"post":{"tags":["Comparisons"],"summary":"Group Synastry","description":"Calculate synastry aspects among 2–8 charts simultaneously, returning all pairwise cross-chart aspect matrices.","operationId":"group-synastry","x-quality":"green","x-source":"Synastry per Robert Hand \"Planets in Composite\" 1975 + Stephen Arroyo \"Relationships and Life Cycles\" 1979. Composite midpoint method per Hand. Davison time-place midpoint per Ronald Davison 1977.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MultiChart"},"example":{"inputs":[{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52,"name":"Person A"},{"date":"1985-11-03","time":"09:15:00","timezone":"Europe/Kyiv","latitude":48.46,"longitude":35.04,"name":"Person B"}]}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/group-synastry \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"inputs\": [ { \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52, \"name\": \"Person A\" }, { \"date\": \"1985-11-03\", \"time\": \"09:15:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 48.46, \"longitude\": 35.04, \"name\": \"Person B\" } ] }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/group-synastry', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"inputs\": [\n      {\n        \"date\": \"1990-05-15\",\n        \"time\": \"15:30:00\",\n        \"timezone\": \"Europe/Kyiv\",\n        \"latitude\": 50.45,\n        \"longitude\": 30.52,\n        \"name\": \"Person A\"\n      },\n      {\n        \"date\": \"1985-11-03\",\n        \"time\": \"09:15:00\",\n        \"timezone\": \"Europe/Kyiv\",\n        \"latitude\": 48.46,\n        \"longitude\": 35.04,\n        \"name\": \"Person B\"\n      }\n    ]\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/group-synastry',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'inputs': [\n        {\n          'date': \"1990-05-15\",\n          'time': \"15:30:00\",\n          'timezone': \"Europe/Kyiv\",\n          'latitude': 50.45,\n          'longitude': 30.52,\n          'name': \"Person A\"\n        },\n        {\n          'date': \"1985-11-03\",\n          'time': \"09:15:00\",\n          'timezone': \"Europe/Kyiv\",\n          'latitude': 48.46,\n          'longitude': 35.04,\n          'name': \"Person B\"\n        }\n      ]\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('group-synastry', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'inputs' => [[\n            'date' => '1990-05-15',\n            'time' => '15:30:00',\n            'timezone' => 'Europe/Kyiv',\n            'latitude' => 50.45,\n            'longitude' => 30.52,\n            'name' => 'Person A',\n        ], [\n            'date' => '1985-11-03',\n            'time' => '09:15:00',\n            'timezone' => 'Europe/Kyiv',\n            'latitude' => 48.46,\n            'longitude' => 35.04,\n            'name' => 'Person B',\n        ]],\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"charts":{"type":"array","items":{"type":"object","properties":{"input":{"type":"object","properties":{"name":{"type":"string","nullable":true},"date":{"type":"string","nullable":true},"time":{"type":"string","nullable":true},"timezoneOffset":{"type":"number","nullable":true},"latitude":{"type":"number","nullable":true},"longitude":{"type":"number","nullable":true},"houseSystem":{"type":"string","nullable":true},"city":{"type":"string","nullable":true},"cosmogram":{"type":"boolean","nullable":true}},"nullable":true},"julianDay":{"type":"number","nullable":true},"siderealTime":{"type":"number","nullable":true},"planets":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"longitude":{"type":"number","nullable":true},"latitude":{"type":"number","nullable":true},"distance":{"type":"number","nullable":true},"speedLong":{"type":"number","nullable":true},"speedLat":{"type":"number","nullable":true},"speedDist":{"type":"number","nullable":true},"isRetrograde":{"type":"boolean","nullable":true},"declination":{"type":"number","nullable":true},"rightAscension":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"houses":{"type":"object","properties":{"system":{"type":"string","nullable":true},"cusps":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"ascendant":{"type":"number","nullable":true},"mc":{"type":"number","nullable":true},"armc":{"type":"number","nullable":true},"vertex":{"type":"number","nullable":true},"equatorialAsc":{"type":"number","nullable":true},"coAscWK":{"type":"number","nullable":true},"coAscMunkasey":{"type":"number","nullable":true},"polarAsc":{"type":"number","nullable":true}},"nullable":true},"aspects":{"type":"array","items":{"type":"object","properties":{"planet1":{"type":"string","nullable":true},"planet2":{"type":"string","nullable":true},"planet1Id":{"type":"number","nullable":true},"planet2Id":{"type":"number","nullable":true},"type":{"type":"object","properties":{"name":{"type":"string","nullable":true},"i18nKey":{"type":"string","nullable":true},"angle":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true},"symbol":{"type":"string","nullable":true},"isMajor":{"type":"boolean","nullable":true},"color":{"type":"string","nullable":true}},"nullable":true},"exactAngle":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true},"isApplying":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true},"houseAspects":{"type":"array","items":{"type":"object","properties":{"planetName":{"type":"string","nullable":true},"planetId":{"type":"number","nullable":true},"houseIndex":{"type":"number","nullable":true},"cuspLongitude":{"type":"number","nullable":true},"type":{"type":"object","properties":{"name":{"type":"string","nullable":true},"i18nKey":{"type":"string","nullable":true},"angle":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true},"symbol":{"type":"string","nullable":true},"isMajor":{"type":"boolean","nullable":true},"color":{"type":"string","nullable":true}},"nullable":true},"exactAngle":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true},"isApplying":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true},"parallelAspects":{"type":"array","items":{"type":"object","properties":{"planet1":{"type":"string","nullable":true},"planet2":{"type":"string","nullable":true},"planet1Id":{"type":"number","nullable":true},"planet2Id":{"type":"number","nullable":true},"type":{"type":"string","nullable":true},"exactDiff":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"antiscia":{"type":"array","items":{"type":"object","properties":{"planetId":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"antiscion":{"type":"number","nullable":true},"contraAntiscion":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"antisciaAspects":{"type":"array","items":{},"nullable":true},"chartSect":{"type":"string","nullable":true},"meta":{"type":"object","properties":{"engineVersion":{"type":"string","nullable":true},"calculatedAt":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"nullable":true},"pairs":{"type":"array","items":{"type":"object","properties":{"i":{"type":"number","nullable":true},"j":{"type":"number","nullable":true},"crossAspects":{"type":"array","items":{"type":"object","properties":{"planet1":{"type":"string","nullable":true},"planet1Id":{"type":"number","nullable":true},"planet2":{"type":"string","nullable":true},"planet2Id":{"type":"number","nullable":true},"type":{"type":"object","properties":{"name":{"type":"string","nullable":true},"i18nKey":{"type":"string","nullable":true},"angle":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true},"symbol":{"type":"string","nullable":true},"isMajor":{"type":"boolean","nullable":true},"color":{"type":"string","nullable":true}},"nullable":true},"exactAngle":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true},"isApplying":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true},"compatibility":{"type":"object","properties":{"score":{"type":"number","nullable":true},"label":{"type":"string","nullable":true},"harmony":{"type":"number","nullable":true},"tension":{"type":"number","nullable":true},"top":{"type":"array","items":{"type":"object","properties":{"aspect":{"type":"object","properties":{"planet1":{"type":"string","nullable":true},"planet1Id":{"type":"number","nullable":true},"planet2":{"type":"string","nullable":true},"planet2Id":{"type":"number","nullable":true},"type":{"type":"object","properties":{"name":{"type":"string","nullable":true},"i18nKey":{"type":"string","nullable":true},"angle":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true},"symbol":{"type":"string","nullable":true},"isMajor":{"type":"boolean","nullable":true},"color":{"type":"string","nullable":true}},"nullable":true},"exactAngle":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true},"isApplying":{"type":"boolean","nullable":true}},"nullable":true},"strength":{"type":"number","nullable":true},"sign":{"type":"number","nullable":true}},"nullable":true},"nullable":true}},"nullable":true}},"nullable":true},"nullable":true},"matrix":{"type":"array","items":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"nullable":true},"averageScore":{"type":"number","nullable":true}}}}},"example":{"ok":true,"data":{"charts":[{"input":{"name":"Person A","date":"1990-05-15","time":"15:30:00","timezoneOffset":4,"latitude":50.45,"longitude":30.52,"houseSystem":"P","city":"","cosmogram":false},"julianDay":2448026.9791666665,"siderealTime":3.029043551629416,"planets":[{"id":0,"name":"Sun","longitude":54.37601980167181,"latitude":-0.000020054940759470553,"distance":1.0108955908980104,"speedLong":0.9642248003676466,"speedLat":0.00003805311526169511,"speedDist":0.00022039347866615117,"isRetrograde":false,"declination":18.867035147029778,"rightAscension":52.00919841916813}],"houses":{"system":"P","cusps":[169.9679500481848],"ascendant":169.9679500481848,"mc":77.07426201523143,"armc":75.95565327444125,"vertex":336.6271586045666,"equatorialAsc":164.74875654391414,"coAscWK":149.27468505332592,"coAscMunkasey":168.73706704232438,"polarAsc":329.2746850533259},"aspects":[{"planet1":"Sun","planet2":"Moon","planet1Id":0,"planet2Id":1,"type":{"name":"Trine","i18nKey":"aspect_trine","angle":120,"orb":12,"symbol":"△","isMajor":true,"color":"#3366cc"},"exactAngle":117.47133202515602,"orb":2.5286679748439838,"isApplying":false}],"houseAspects":[{"planetName":"Sun","planetId":0,"houseIndex":0,"cuspLongitude":169.9679500481848,"type":{"name":"Trine","i18nKey":"aspect_trine","angle":120,"orb":12,"symbol":"△","isMajor":true,"color":"#3366cc"},"exactAngle":115.59193024651299,"orb":4.408069753487013,"isApplying":false}],"parallelAspects":[{"planet1":"Moon","planet2":"Saturn","planet1Id":1,"planet2Id":6,"type":"parallel","exactDiff":0.9889902750346735,"orb":0.9889902750346735}],"antiscia":[{"planetId":0,"planetName":"Sun","antiscion":125.62398019832818,"contraAntiscion":305.6239801983282}],"antisciaAspects":[],"chartSect":"diurnal","meta":{"engineVersion":"2.10.03","calculatedAt":"2026-08-23T22:10:18.946Z"}}],"pairs":[{"i":0,"j":1,"crossAspects":[{"planet1":"Sun","planet1Id":0,"planet2":"Saturn","planet2Id":6,"type":{"name":"Opposition","i18nKey":"aspect_opposition","angle":180,"orb":12,"symbol":"☍","isMajor":true,"color":"#cc3333"},"exactAngle":175.99902688473145,"orb":4.00097311526855,"isApplying":true}],"compatibility":{"score":51,"label":"mixed","harmony":15.8,"tension":16.8,"top":[{"aspect":{"planet1":"Venus","planet1Id":3,"planet2":"Moon","planet2Id":1,"type":{"name":"Square","i18nKey":"aspect_square","angle":90,"orb":10,"symbol":"□","isMajor":true,"color":"#cc3333"},"exactAngle":88.18365203424705,"orb":1.8163479657529535,"isApplying":false},"strength":2.0869825615583784,"sign":-1}]}}],"matrix":[[100]],"averageScore":51}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/synastry/aspect-grid":{"post":{"tags":["Comparisons"],"summary":"Synastry Aspect Grid","description":"NxM matrix of cross-chart aspects between the two charts (default 13×13: Sun..Pluto + nodes + Lilith + Chiron). Cells contain aspect or null.","operationId":"synastry_aspect-grid","x-quality":"green","x-source":"Synastry per Robert Hand \"Planets in Composite\" 1975 + Stephen Arroyo \"Relationships and Life Cycles\" 1979. Composite midpoint method per Hand. Davison time-place midpoint per Ronald Davison 1977.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwoChart"},"example":{"chart1":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52},"chart2":{"date":"1985-11-03","time":"09:15:00","timezone":"Europe/Kyiv","latitude":48.46,"longitude":35.04}}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/synastry/aspect-grid \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"chart1\": { \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }, \"chart2\": { \"date\": \"1985-11-03\", \"time\": \"09:15:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 48.46, \"longitude\": 35.04 } }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/synastry/aspect-grid', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"chart1\": {\n      \"date\": \"1990-05-15\",\n      \"time\": \"15:30:00\",\n      \"timezone\": \"Europe/Kyiv\",\n      \"latitude\": 50.45,\n      \"longitude\": 30.52\n    },\n    \"chart2\": {\n      \"date\": \"1985-11-03\",\n      \"time\": \"09:15:00\",\n      \"timezone\": \"Europe/Kyiv\",\n      \"latitude\": 48.46,\n      \"longitude\": 35.04\n    }\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/synastry/aspect-grid',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'chart1': {\n        'date': \"1990-05-15\",\n        'time': \"15:30:00\",\n        'timezone': \"Europe/Kyiv\",\n        'latitude': 50.45,\n        'longitude': 30.52\n      },\n      'chart2': {\n        'date': \"1985-11-03\",\n        'time': \"09:15:00\",\n        'timezone': \"Europe/Kyiv\",\n        'latitude': 48.46,\n        'longitude': 35.04\n      }\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('synastry/aspect-grid', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'chart1' => [\n            'date' => '1990-05-15',\n            'time' => '15:30:00',\n            'timezone' => 'Europe/Kyiv',\n            'latitude' => 50.45,\n            'longitude' => 30.52,\n        ],\n        'chart2' => [\n            'date' => '1985-11-03',\n            'time' => '09:15:00',\n            'timezone' => 'Europe/Kyiv',\n            'latitude' => 48.46,\n            'longitude' => 35.04,\n        ],\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"bodies1":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"longitude":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"bodies2":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"longitude":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"grid":{"type":"array","items":{"type":"array","items":{"nullable":true},"nullable":true},"nullable":true},"totals":{"type":"object","properties":{"harmonious":{"type":"number","nullable":true},"challenging":{"type":"number","nullable":true},"neutral":{"type":"number","nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"bodies1":[{"id":0,"name":"Sun","longitude":54.37601980167181}],"bodies2":[{"id":0,"name":"Sun","longitude":220.77033612885523}],"grid":[[null]],"totals":{"harmonious":19,"challenging":15,"neutral":4}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/synastry/house-overlay":{"post":{"tags":["Comparisons"],"summary":"Synastry House Overlay","description":"Locate each chart’s personal planets in the partner’s houses; reports top-3 emphasized houses on either side.","operationId":"synastry_house-overlay","x-quality":"green","x-source":"Synastry per Robert Hand \"Planets in Composite\" 1975 + Stephen Arroyo \"Relationships and Life Cycles\" 1979. Composite midpoint method per Hand. Davison time-place midpoint per Ronald Davison 1977.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwoChart"},"example":{"chart1":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52},"chart2":{"date":"1985-11-03","time":"09:15:00","timezone":"Europe/Kyiv","latitude":48.46,"longitude":35.04}}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/synastry/house-overlay \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"chart1\": { \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }, \"chart2\": { \"date\": \"1985-11-03\", \"time\": \"09:15:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 48.46, \"longitude\": 35.04 } }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/synastry/house-overlay', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"chart1\": {\n      \"date\": \"1990-05-15\",\n      \"time\": \"15:30:00\",\n      \"timezone\": \"Europe/Kyiv\",\n      \"latitude\": 50.45,\n      \"longitude\": 30.52\n    },\n    \"chart2\": {\n      \"date\": \"1985-11-03\",\n      \"time\": \"09:15:00\",\n      \"timezone\": \"Europe/Kyiv\",\n      \"latitude\": 48.46,\n      \"longitude\": 35.04\n    }\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/synastry/house-overlay',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'chart1': {\n        'date': \"1990-05-15\",\n        'time': \"15:30:00\",\n        'timezone': \"Europe/Kyiv\",\n        'latitude': 50.45,\n        'longitude': 30.52\n      },\n      'chart2': {\n        'date': \"1985-11-03\",\n        'time': \"09:15:00\",\n        'timezone': \"Europe/Kyiv\",\n        'latitude': 48.46,\n        'longitude': 35.04\n      }\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('synastry/house-overlay', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'chart1' => [\n            'date' => '1990-05-15',\n            'time' => '15:30:00',\n            'timezone' => 'Europe/Kyiv',\n            'latitude' => 50.45,\n            'longitude' => 30.52,\n        ],\n        'chart2' => [\n            'date' => '1985-11-03',\n            'time' => '09:15:00',\n            'timezone' => 'Europe/Kyiv',\n            'latitude' => 48.46,\n            'longitude' => 35.04,\n        ],\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"chart1InChart2":{"type":"array","items":{"type":"object","properties":{"planetId":{"type":"number","nullable":true},"planet":{"type":"string","nullable":true},"longitude":{"type":"number","nullable":true},"house":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"chart2InChart1":{"type":"array","items":{"type":"object","properties":{"planetId":{"type":"number","nullable":true},"planet":{"type":"string","nullable":true},"longitude":{"type":"number","nullable":true},"house":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"emphasizedHouses":{"type":"object","properties":{"chart1":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"chart2":{"type":"array","items":{"type":"number","nullable":true},"nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"chart1InChart2":[{"planetId":0,"planet":"Sun","longitude":54.37601980167181,"house":6}],"chart2InChart1":[{"planetId":0,"planet":"Sun","longitude":220.77033612885523,"house":2}],"emphasizedHouses":{"chart1":[2],"chart2":[2]}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/synastry/element-balance":{"post":{"tags":["Comparisons"],"summary":"Synastry Element Balance","description":"Element (fire/earth/air/water) and modality (cardinal/fixed/mutable) tallies for each chart and the combined pair, with dominant and missing elements.","operationId":"synastry_element-balance","x-quality":"green","x-source":"Synastry per Robert Hand \"Planets in Composite\" 1975 + Stephen Arroyo \"Relationships and Life Cycles\" 1979. Composite midpoint method per Hand. Davison time-place midpoint per Ronald Davison 1977.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwoChart"},"example":{"chart1":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52},"chart2":{"date":"1985-11-03","time":"09:15:00","timezone":"Europe/Kyiv","latitude":48.46,"longitude":35.04}}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/synastry/element-balance \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"chart1\": { \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }, \"chart2\": { \"date\": \"1985-11-03\", \"time\": \"09:15:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 48.46, \"longitude\": 35.04 } }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/synastry/element-balance', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"chart1\": {\n      \"date\": \"1990-05-15\",\n      \"time\": \"15:30:00\",\n      \"timezone\": \"Europe/Kyiv\",\n      \"latitude\": 50.45,\n      \"longitude\": 30.52\n    },\n    \"chart2\": {\n      \"date\": \"1985-11-03\",\n      \"time\": \"09:15:00\",\n      \"timezone\": \"Europe/Kyiv\",\n      \"latitude\": 48.46,\n      \"longitude\": 35.04\n    }\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/synastry/element-balance',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'chart1': {\n        'date': \"1990-05-15\",\n        'time': \"15:30:00\",\n        'timezone': \"Europe/Kyiv\",\n        'latitude': 50.45,\n        'longitude': 30.52\n      },\n      'chart2': {\n        'date': \"1985-11-03\",\n        'time': \"09:15:00\",\n        'timezone': \"Europe/Kyiv\",\n        'latitude': 48.46,\n        'longitude': 35.04\n      }\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('synastry/element-balance', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'chart1' => [\n            'date' => '1990-05-15',\n            'time' => '15:30:00',\n            'timezone' => 'Europe/Kyiv',\n            'latitude' => 50.45,\n            'longitude' => 30.52,\n        ],\n        'chart2' => [\n            'date' => '1985-11-03',\n            'time' => '09:15:00',\n            'timezone' => 'Europe/Kyiv',\n            'latitude' => 48.46,\n            'longitude' => 35.04,\n        ],\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"chart1":{"type":"object","properties":{"fire":{"type":"number","nullable":true},"earth":{"type":"number","nullable":true},"air":{"type":"number","nullable":true},"water":{"type":"number","nullable":true},"cardinal":{"type":"number","nullable":true},"fixed":{"type":"number","nullable":true},"mutable":{"type":"number","nullable":true}},"nullable":true},"chart2":{"type":"object","properties":{"fire":{"type":"number","nullable":true},"earth":{"type":"number","nullable":true},"air":{"type":"number","nullable":true},"water":{"type":"number","nullable":true},"cardinal":{"type":"number","nullable":true},"fixed":{"type":"number","nullable":true},"mutable":{"type":"number","nullable":true}},"nullable":true},"combined":{"type":"object","properties":{"fire":{"type":"number","nullable":true},"earth":{"type":"number","nullable":true},"air":{"type":"number","nullable":true},"water":{"type":"number","nullable":true},"cardinal":{"type":"number","nullable":true},"fixed":{"type":"number","nullable":true},"mutable":{"type":"number","nullable":true}},"nullable":true},"balance":{"type":"object","properties":{"dominantElement":{"type":"string","nullable":true},"dominantModality":{"type":"string","nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"chart1":{"fire":1,"earth":4,"air":0,"water":2,"cardinal":4,"fixed":2,"mutable":1},"chart2":{"fire":1,"earth":0,"air":3,"water":3,"cardinal":3,"fixed":3,"mutable":1},"combined":{"fire":2,"earth":4,"air":3,"water":5,"cardinal":7,"fixed":5,"mutable":2},"balance":{"dominantElement":"water","dominantModality":"cardinal"}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/synastry/attraction-score":{"post":{"tags":["Comparisons"],"summary":"Synastry Attraction Score","description":"Weighted 0–100 attraction score from Sun-Moon, Mars-Venus, ASC/DSC, Mars-Mars, Sun-Mars, Moon-Venus contacts and 5th-house overlay.","operationId":"synastry_attraction-score","x-quality":"green","x-source":"Synastry per Robert Hand \"Planets in Composite\" 1975 + Stephen Arroyo \"Relationships and Life Cycles\" 1979. Composite midpoint method per Hand. Davison time-place midpoint per Ronald Davison 1977.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwoChart"},"example":{"chart1":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52},"chart2":{"date":"1985-11-03","time":"09:15:00","timezone":"Europe/Kyiv","latitude":48.46,"longitude":35.04}}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/synastry/attraction-score \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"chart1\": { \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }, \"chart2\": { \"date\": \"1985-11-03\", \"time\": \"09:15:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 48.46, \"longitude\": 35.04 } }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/synastry/attraction-score', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"chart1\": {\n      \"date\": \"1990-05-15\",\n      \"time\": \"15:30:00\",\n      \"timezone\": \"Europe/Kyiv\",\n      \"latitude\": 50.45,\n      \"longitude\": 30.52\n    },\n    \"chart2\": {\n      \"date\": \"1985-11-03\",\n      \"time\": \"09:15:00\",\n      \"timezone\": \"Europe/Kyiv\",\n      \"latitude\": 48.46,\n      \"longitude\": 35.04\n    }\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/synastry/attraction-score',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'chart1': {\n        'date': \"1990-05-15\",\n        'time': \"15:30:00\",\n        'timezone': \"Europe/Kyiv\",\n        'latitude': 50.45,\n        'longitude': 30.52\n      },\n      'chart2': {\n        'date': \"1985-11-03\",\n        'time': \"09:15:00\",\n        'timezone': \"Europe/Kyiv\",\n        'latitude': 48.46,\n        'longitude': 35.04\n      }\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('synastry/attraction-score', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'chart1' => [\n            'date' => '1990-05-15',\n            'time' => '15:30:00',\n            'timezone' => 'Europe/Kyiv',\n            'latitude' => 50.45,\n            'longitude' => 30.52,\n        ],\n        'chart2' => [\n            'date' => '1985-11-03',\n            'time' => '09:15:00',\n            'timezone' => 'Europe/Kyiv',\n            'latitude' => 48.46,\n            'longitude' => 35.04,\n        ],\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"score":{"type":"number","nullable":true},"components":{"type":"object","properties":{"sunMoon":{"type":"number","nullable":true},"marsVenus":{"type":"number","nullable":true},"ascDsc":{"type":"number","nullable":true},"marsMars":{"type":"number","nullable":true},"sunMars":{"type":"number","nullable":true},"fifthHouseOverlay":{"type":"number","nullable":true}},"nullable":true},"notes":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"score":10.12,"components":{"sunMoon":0,"marsVenus":0,"ascDsc":5.92,"marsMars":0,"sunMars":4.2,"fifthHouseOverlay":0},"notes":["chart1 Sun on chart2 DSC (orb 4.8°)","Moon-Venus Square","chart2 Venus on chart1 ASC (orb 1.5°)","2 personal-planet hits in partner’s 5th house"]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/transits":{"post":{"tags":["Prognostics"],"summary":"Transits","description":"Calculate transit planet aspects to natal planets for a given date. Returns applying and separating aspects.","operationId":"transits","x-quality":"green","x-source":"Transit interpretation per Robert Hand \"Planets in Transit\" 1976 + Howard Sasportas. Secondary progressions: 1-day-per-year canon (Ptolemy lineage). Solar arc directions per Frank C. Clifford. Solar return per Robert Hand \"Planets in Composite\".","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Transits"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52,"transitDate":"2024-06-15","transitTime":"12:00:00","transitTzOffset":3}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/transits \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52, \"transitDate\": \"2024-06-15\", \"transitTime\": \"12:00:00\", \"transitTzOffset\": 3 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/transits', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52,\n    \"transitDate\": \"2024-06-15\",\n    \"transitTime\": \"12:00:00\",\n    \"transitTzOffset\": 3\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/transits',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52,\n      'transitDate': \"2024-06-15\",\n      'transitTime': \"12:00:00\",\n      'transitTzOffset': 3\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('transits', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n        'transitDate' => '2024-06-15',\n        'transitTime' => '12:00:00',\n        'transitTzOffset' => 3,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"input":{"type":"object","properties":{"name":{"type":"string","nullable":true},"date":{"type":"string","nullable":true},"time":{"type":"string","nullable":true},"timezoneOffset":{"type":"number","nullable":true},"latitude":{"type":"number","nullable":true},"longitude":{"type":"number","nullable":true},"houseSystem":{"type":"string","nullable":true},"city":{"type":"string","nullable":true},"cosmogram":{"type":"boolean","nullable":true}},"nullable":true},"julianDay":{"type":"number","nullable":true},"siderealTime":{"type":"number","nullable":true},"planets":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"longitude":{"type":"number","nullable":true},"latitude":{"type":"number","nullable":true},"distance":{"type":"number","nullable":true},"speedLong":{"type":"number","nullable":true},"speedLat":{"type":"number","nullable":true},"speedDist":{"type":"number","nullable":true},"isRetrograde":{"type":"boolean","nullable":true},"declination":{"type":"number","nullable":true},"rightAscension":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"houses":{"type":"object","properties":{"system":{"type":"string","nullable":true},"cusps":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"ascendant":{"type":"number","nullable":true},"mc":{"type":"number","nullable":true},"armc":{"type":"number","nullable":true},"vertex":{"type":"number","nullable":true},"equatorialAsc":{"type":"number","nullable":true},"coAscWK":{"type":"number","nullable":true},"coAscMunkasey":{"type":"number","nullable":true},"polarAsc":{"type":"number","nullable":true}},"nullable":true},"aspects":{"type":"array","items":{"type":"object","properties":{"planet1":{"type":"string","nullable":true},"planet2":{"type":"string","nullable":true},"planet1Id":{"type":"number","nullable":true},"planet2Id":{"type":"number","nullable":true},"type":{"type":"object","properties":{"name":{"type":"string","nullable":true},"i18nKey":{"type":"string","nullable":true},"angle":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true},"symbol":{"type":"string","nullable":true},"isMajor":{"type":"boolean","nullable":true},"color":{"type":"string","nullable":true}},"nullable":true},"exactAngle":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true},"isApplying":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true},"parallelAspects":{"type":"array","items":{"type":"object","properties":{"planet1":{"type":"string","nullable":true},"planet2":{"type":"string","nullable":true},"planet1Id":{"type":"number","nullable":true},"planet2Id":{"type":"number","nullable":true},"type":{"type":"string","nullable":true},"exactDiff":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"antiscia":{"type":"array","items":{"type":"object","properties":{"planetId":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"antiscion":{"type":"number","nullable":true},"contraAntiscion":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"antisciaAspects":{"type":"array","items":{},"nullable":true}}}}},"example":{"ok":true,"data":{"input":{"name":"Transit 2024-06-15","date":"2024-06-15","time":"12:00:00","timezoneOffset":3,"latitude":50.45,"longitude":30.52,"houseSystem":"P","city":"","cosmogram":false},"julianDay":2460476.875,"siderealTime":2.6092491286903003,"planets":[{"id":0,"name":"Sun","longitude":84.75653503121559,"latitude":-0.0000164358265263301,"distance":1.0157821041670574,"speedLong":0.9550136432789496,"speedLat":-0.000036549230140863315,"speedDist":0.00008577562543556365,"isRetrograde":false,"declination":23.33453040532501,"rightAscension":84.28796798183103}],"houses":{"system":"P","cusps":[165.47753491960438],"ascendant":165.47753491960438,"mc":71.2147540958855,"armc":69.65873693035451,"vertex":326.8292566611795,"equatorialAsc":157.99779882370274,"coAscWK":137.44370360743522,"coAscMunkasey":163.70012789506856,"polarAsc":317.4437036074352},"aspects":[{"planet1":"Sun","planet2":"Mercury","planet1Id":0,"planet2Id":2,"type":{"name":"Conjunction","i18nKey":"aspect_conjunction","angle":0,"orb":12,"symbol":"☌","isMajor":true,"color":"#660480"},"exactAngle":0.8530438136031364,"orb":0.8530438136031364,"isApplying":false}],"parallelAspects":[{"planet1":"Sun","planet2":"Venus","planet1Id":0,"planet2Id":3,"type":"parallel","exactDiff":0.4468409597308387,"orb":0.4468409597308387}],"antiscia":[{"planetId":0,"planetName":"Sun","antiscion":95.2434649687844,"contraAntiscion":275.2434649687844}],"antisciaAspects":[]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/transit-calendar":{"post":{"tags":["Prognostics"],"summary":"Transit Calendar","description":"List the exact moments of transit-to-natal aspects in a date range, one event per exact pass, so a retrograde triple pass gives three events.","operationId":"transit-calendar","x-quality":"green","x-source":"Transit interpretation per Robert Hand \"Planets in Transit\" 1976 + Howard Sasportas. Secondary progressions: 1-day-per-year canon (Ptolemy lineage). Solar arc directions per Frank C. Clifford. Solar return per Robert Hand \"Planets in Composite\".","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransitCalendar"},"example":{"natal":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52},"startDate":"2024-01-01","endDate":"2024-12-31"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/transit-calendar \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"natal\": { \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }, \"startDate\": \"2024-01-01\", \"endDate\": \"2024-12-31\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/transit-calendar', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"natal\": {\n      \"date\": \"1990-05-15\",\n      \"time\": \"15:30:00\",\n      \"timezone\": \"Europe/Kyiv\",\n      \"latitude\": 50.45,\n      \"longitude\": 30.52\n    },\n    \"startDate\": \"2024-01-01\",\n    \"endDate\": \"2024-12-31\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/transit-calendar',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'natal': {\n        'date': \"1990-05-15\",\n        'time': \"15:30:00\",\n        'timezone': \"Europe/Kyiv\",\n        'latitude': 50.45,\n        'longitude': 30.52\n      },\n      'startDate': \"2024-01-01\",\n      'endDate': \"2024-12-31\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('transit-calendar', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'natal' => [\n            'date' => '1990-05-15',\n            'time' => '15:30:00',\n            'timezone' => 'Europe/Kyiv',\n            'latitude' => 50.45,\n            'longitude' => 30.52,\n        ],\n        'startDate' => '2024-01-01',\n        'endDate' => '2024-12-31',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"maxOrb":{"type":"number","nullable":true},"count":{"type":"number","nullable":true},"events":{"type":"array","items":{"type":"object","properties":{"jd":{"type":"number","nullable":true},"date":{"type":"string","nullable":true},"transitPlanetId":{"type":"number","nullable":true},"natalPlanetId":{"type":"number","nullable":true},"aspect":{"type":"object","properties":{"name":{"type":"string","nullable":true},"i18nKey":{"type":"string","nullable":true},"angle":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true},"symbol":{"type":"string","nullable":true},"isMajor":{"type":"boolean","nullable":true},"color":{"type":"string","nullable":true}},"nullable":true},"transitLongitude":{"type":"number","nullable":true},"natalLongitude":{"type":"number","nullable":true},"isRetrograde":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"startDate":"2024-01-01","endDate":"2024-12-31","maxOrb":1,"count":449,"events":[{"jd":2460313.2036132812,"date":"2024-01-03T16:53:12.000Z","transitPlanetId":0,"natalPlanetId":3,"aspect":{"name":"Square","i18nKey":"aspect_square","angle":90,"orb":10,"symbol":"□","isMajor":true,"color":"#cc3333"},"transitLongitude":282.7942342415268,"natalLongitude":12.794550626114901,"isRetrograde":false}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/forecast-calendar":{"post":{"tags":["Prognostics"],"summary":"Forecast Calendar","description":"Generate a combined forecast calendar including transits, lunar phases, ingresses, and retrograde stations for a given period.","operationId":"forecast-calendar","x-quality":"green","x-source":"Transit interpretation per Robert Hand \"Planets in Transit\" 1976 + Howard Sasportas. Secondary progressions: 1-day-per-year canon (Ptolemy lineage). Solar arc directions per Frank C. Clifford. Solar return per Robert Hand \"Planets in Composite\".","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForecastCalendar"},"example":{"natal":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52},"year":2024}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/forecast-calendar \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"natal\": { \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }, \"year\": 2024 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/forecast-calendar', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"natal\": {\n      \"date\": \"1990-05-15\",\n      \"time\": \"15:30:00\",\n      \"timezone\": \"Europe/Kyiv\",\n      \"latitude\": 50.45,\n      \"longitude\": 30.52\n    },\n    \"year\": 2024\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/forecast-calendar',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'natal': {\n        'date': \"1990-05-15\",\n        'time': \"15:30:00\",\n        'timezone': \"Europe/Kyiv\",\n        'latitude': 50.45,\n        'longitude': 30.52\n      },\n      'year': 2024\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('forecast-calendar', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'natal' => [\n            'date' => '1990-05-15',\n            'time' => '15:30:00',\n            'timezone' => 'Europe/Kyiv',\n            'latitude' => 50.45,\n            'longitude' => 30.52,\n        ],\n        'year' => 2024,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"cells":{"type":"array","items":{"type":"array","items":{"type":"object","properties":{"house":{"type":"number","nullable":true},"month":{"type":"number","nullable":true},"harmonious":{"type":"number","nullable":true},"tense":{"type":"number","nullable":true},"neutral":{"type":"number","nullable":true},"total":{"type":"number","nullable":true},"events":{"type":"array","items":{},"nullable":true}},"nullable":true},"nullable":true},"nullable":true},"dailySummary":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string","nullable":true},"jd":{"type":"number","nullable":true},"harmonious":{"type":"number","nullable":true},"tense":{"type":"number","nullable":true},"total":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"maxAbsTotal":{"type":"number","nullable":true},"year":{"type":"number","nullable":true}}}}},"example":{"ok":true,"data":{"cells":[[{"house":1,"month":0,"harmonious":0,"tense":0,"neutral":0,"total":0,"events":[]}]],"dailySummary":[{"date":"2024-01-01","jd":2460311,"harmonious":15.532704951429205,"tense":6.18192715439193,"total":9.350777797037274}],"maxAbsTotal":405.21774838414404,"year":2024}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/progressions":{"post":{"tags":["Prognostics"],"summary":"Secondary Progressions","description":"Calculate secondary progressed chart (day-for-a-year) for a target date. Returns progressed planets, houses and angles, and the aspects between progressed planets.","operationId":"progressions","x-quality":"green","x-source":"Transit interpretation per Robert Hand \"Planets in Transit\" 1976 + Howard Sasportas. Secondary progressions: 1-day-per-year canon (Ptolemy lineage). Solar arc directions per Frank C. Clifford. Solar return per Robert Hand \"Planets in Composite\".","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NatalTarget"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52,"targetDate":"2024-06-15","targetTime":"12:00:00","targetTzOffset":3}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/progressions \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52, \"targetDate\": \"2024-06-15\", \"targetTime\": \"12:00:00\", \"targetTzOffset\": 3 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/progressions', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52,\n    \"targetDate\": \"2024-06-15\",\n    \"targetTime\": \"12:00:00\",\n    \"targetTzOffset\": 3\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/progressions',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52,\n      'targetDate': \"2024-06-15\",\n      'targetTime': \"12:00:00\",\n      'targetTzOffset': 3\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('progressions', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n        'targetDate' => '2024-06-15',\n        'targetTime' => '12:00:00',\n        'targetTzOffset' => 3,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"input":{"type":"object","properties":{"name":{"type":"string","nullable":true},"date":{"type":"string","nullable":true},"time":{"type":"string","nullable":true},"timezoneOffset":{"type":"number","nullable":true},"latitude":{"type":"number","nullable":true},"longitude":{"type":"number","nullable":true},"houseSystem":{"type":"string","nullable":true},"city":{"type":"string","nullable":true},"cosmogram":{"type":"boolean","nullable":true}},"nullable":true},"julianDay":{"type":"number","nullable":true},"siderealTime":{"type":"number","nullable":true},"planets":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"longitude":{"type":"number","nullable":true},"latitude":{"type":"number","nullable":true},"distance":{"type":"number","nullable":true},"speedLong":{"type":"number","nullable":true},"speedLat":{"type":"number","nullable":true},"speedDist":{"type":"number","nullable":true},"isRetrograde":{"type":"boolean","nullable":true},"declination":{"type":"number","nullable":true},"rightAscension":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"houses":{"type":"object","properties":{"system":{"type":"string","nullable":true},"cusps":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"ascendant":{"type":"number","nullable":true},"mc":{"type":"number","nullable":true},"armc":{"type":"number","nullable":true},"vertex":{"type":"number","nullable":true},"equatorialAsc":{"type":"number","nullable":true},"coAscWK":{"type":"number","nullable":true},"coAscMunkasey":{"type":"number","nullable":true},"polarAsc":{"type":"number","nullable":true}},"nullable":true},"aspects":{"type":"array","items":{"type":"object","properties":{"planet1":{"type":"string","nullable":true},"planet2":{"type":"string","nullable":true},"planet1Id":{"type":"number","nullable":true},"planet2Id":{"type":"number","nullable":true},"type":{"type":"object","properties":{"name":{"type":"string","nullable":true},"i18nKey":{"type":"string","nullable":true},"angle":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true},"symbol":{"type":"string","nullable":true},"isMajor":{"type":"boolean","nullable":true},"color":{"type":"string","nullable":true}},"nullable":true},"exactAngle":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true},"isApplying":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true},"parallelAspects":{"type":"array","items":{"type":"object","properties":{"planet1":{"type":"string","nullable":true},"planet2":{"type":"string","nullable":true},"planet1Id":{"type":"number","nullable":true},"planet2Id":{"type":"number","nullable":true},"type":{"type":"string","nullable":true},"exactDiff":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"antiscia":{"type":"array","items":{"type":"object","properties":{"planetId":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"antiscion":{"type":"number","nullable":true},"contraAntiscion":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"antisciaAspects":{"type":"array","items":{"type":"object","properties":{"planet1":{"type":"string","nullable":true},"planet1Id":{"type":"number","nullable":true},"planet2":{"type":"string","nullable":true},"planet2Id":{"type":"number","nullable":true},"type":{"type":"string","nullable":true},"orb":{"type":"number","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"input":{"name":"Progressions → 2024-06-15","date":"1990-05-15","time":"15:30:00","timezoneOffset":4,"latitude":50.45,"longitude":30.52,"houseSystem":"P","city":"","cosmogram":false},"julianDay":2448061.0651237736,"siderealTime":7.331812272154528,"planets":[{"id":0,"name":"Sun","longitude":87.05669019255905,"latitude":0.00017308938829032328,"distance":1.016045515679932,"speedLong":0.9548843683268312,"speedLat":-0.000013053321100739394,"speedDist":0.00008373139986352549,"isRetrograde":false,"declination":23.409415388350144,"rightAscension":86.79243008221984}],"houses":{"system":"P","cusps":[215.914385825456],"ascendant":215.914385825456,"mc":138.0576010888303,"armc":140.49718408231791,"vertex":71.70592713584179,"equatorialAsc":232.8970860791957,"coAscWK":262.4786170527793,"coAscMunkasey":220.22856096274322,"polarAsc":82.47861705277931},"aspects":[{"planet1":"Sun","planet2":"Moon","planet1Id":0,"planet2Id":1,"type":{"name":"Sextile","i18nKey":"aspect_sextile","angle":60,"orb":6.5,"symbol":"⚹","isMajor":true,"color":"#3366cc"},"exactAngle":58.964298423791675,"orb":1.035701576208325,"isApplying":false}],"parallelAspects":[{"planet1":"Sun","planet2":"Jupiter","planet1Id":0,"planet2Id":5,"type":"parallel","exactDiff":0.8049579008274357,"orb":0.8049579008274357}],"antiscia":[{"planetId":0,"planetName":"Sun","antiscion":92.94330980744098,"contraAntiscion":272.943309807441}],"antisciaAspects":[{"planet1":"Venus","planet1Id":3,"planet2":"true Node","planet2Id":11,"type":"contra-antiscia","orb":0.43944968928730077}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/tertiary-progressions":{"post":{"tags":["Prognostics"],"summary":"Tertiary Progressions","description":"Calculate tertiary progressions (day-for-a-lunar-month) to a target date. Supports converse direction.","operationId":"tertiary-progressions","x-quality":"green","x-source":"Transit interpretation per Robert Hand \"Planets in Transit\" 1976 + Howard Sasportas. Secondary progressions: 1-day-per-year canon (Ptolemy lineage). Solar arc directions per Frank C. Clifford. Solar return per Robert Hand \"Planets in Composite\".","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NatalTarget"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52,"targetDate":"2024-06-15","targetTime":"12:00:00","targetTzOffset":3,"converse":false}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/tertiary-progressions \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52, \"targetDate\": \"2024-06-15\", \"targetTime\": \"12:00:00\", \"targetTzOffset\": 3, \"converse\": false }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/tertiary-progressions', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52,\n    \"targetDate\": \"2024-06-15\",\n    \"targetTime\": \"12:00:00\",\n    \"targetTzOffset\": 3,\n    \"converse\": false\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/tertiary-progressions',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52,\n      'targetDate': \"2024-06-15\",\n      'targetTime': \"12:00:00\",\n      'targetTzOffset': 3,\n      'converse': False\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('tertiary-progressions', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n        'targetDate' => '2024-06-15',\n        'targetTime' => '12:00:00',\n        'targetTzOffset' => 3,\n        'converse' => false,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"input":{"type":"object","properties":{"name":{"type":"string","nullable":true},"date":{"type":"string","nullable":true},"time":{"type":"string","nullable":true},"timezoneOffset":{"type":"number","nullable":true},"latitude":{"type":"number","nullable":true},"longitude":{"type":"number","nullable":true},"houseSystem":{"type":"string","nullable":true},"city":{"type":"string","nullable":true},"cosmogram":{"type":"boolean","nullable":true}},"nullable":true},"julianDay":{"type":"number","nullable":true},"siderealTime":{"type":"number","nullable":true},"planets":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"longitude":{"type":"number","nullable":true},"latitude":{"type":"number","nullable":true},"distance":{"type":"number","nullable":true},"speedLong":{"type":"number","nullable":true},"speedLat":{"type":"number","nullable":true},"speedDist":{"type":"number","nullable":true},"isRetrograde":{"type":"boolean","nullable":true},"declination":{"type":"number","nullable":true},"rightAscension":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"houses":{"type":"object","properties":{"system":{"type":"string","nullable":true},"cusps":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"ascendant":{"type":"number","nullable":true},"mc":{"type":"number","nullable":true},"armc":{"type":"number","nullable":true},"vertex":{"type":"number","nullable":true},"equatorialAsc":{"type":"number","nullable":true},"coAscWK":{"type":"number","nullable":true},"coAscMunkasey":{"type":"number","nullable":true},"polarAsc":{"type":"number","nullable":true}},"nullable":true},"aspects":{"type":"array","items":{"type":"object","properties":{"planet1":{"type":"string","nullable":true},"planet2":{"type":"string","nullable":true},"planet1Id":{"type":"number","nullable":true},"planet2Id":{"type":"number","nullable":true},"type":{"type":"object","properties":{"name":{"type":"string","nullable":true},"i18nKey":{"type":"string","nullable":true},"angle":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true},"symbol":{"type":"string","nullable":true},"isMajor":{"type":"boolean","nullable":true},"color":{"type":"string","nullable":true}},"nullable":true},"exactAngle":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true},"isApplying":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true},"parallelAspects":{"type":"array","items":{"type":"object","properties":{"planet1":{"type":"string","nullable":true},"planet2":{"type":"string","nullable":true},"planet1Id":{"type":"number","nullable":true},"planet2Id":{"type":"number","nullable":true},"type":{"type":"string","nullable":true},"exactDiff":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"antiscia":{"type":"array","items":{"type":"object","properties":{"planetId":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"antiscion":{"type":"number","nullable":true},"contraAntiscion":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"antisciaAspects":{"type":"array","items":{},"nullable":true}}}}},"example":{"ok":true,"data":{"input":{"name":"Tertiary → 2024-06-15","date":"1990-05-15","time":"15:30:00","timezoneOffset":4,"latitude":50.45,"longitude":30.52,"houseSystem":"P","city":"","cosmogram":false},"julianDay":2449033.557522579,"siderealTime":11.051782995537353,"planets":[{"id":0,"name":"Sun","longitude":326.37386762675595,"latitude":-0.00014603664337027459,"distance":0.9877876801691781,"speedLong":1.0101636769977502,"speedLat":0.000036537972893623424,"speedDist":0.0002045738734234075,"isRetrograde":false,"declination":-12.725689855157736,"rightAscension":328.60954896886494}],"houses":{"system":"P","cusps":[256.8501808076703],"ascendant":256.8501808076703,"mc":197.67470899763742,"armc":196.2967449330603,"vertex":121.40302239860097,"equatorialAsc":285.0151768888801,"coAscWK":307.5995192298875,"coAscMunkasey":265.7673258758589,"polarAsc":127.59951922988753},"aspects":[{"planet1":"Sun","planet2":"Saturn","planet1Id":0,"planet2Id":6,"type":{"name":"Conjunction","i18nKey":"aspect_conjunction","angle":0,"orb":12,"symbol":"☌","isMajor":true,"color":"#660480"},"exactAngle":4.794214890476269,"orb":4.794214890476269,"isApplying":false}],"parallelAspects":[{"planet1":"Moon","planet2":"Uranus","planet1Id":1,"planet2Id":7,"type":"parallel","exactDiff":0.5940040375591593,"orb":0.5940040375591593}],"antiscia":[{"planetId":0,"planetName":"Sun","antiscion":213.62613237324405,"contraAntiscion":33.62613237324405}],"antisciaAspects":[]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/minor-progressions":{"post":{"tags":["Prognostics"],"summary":"Minor Progressions","description":"Calculate minor progressions (lunar month-for-a-year) to a target date. Supports converse direction.","operationId":"minor-progressions","x-quality":"green","x-source":"Transit interpretation per Robert Hand \"Planets in Transit\" 1976 + Howard Sasportas. Secondary progressions: 1-day-per-year canon (Ptolemy lineage). Solar arc directions per Frank C. Clifford. Solar return per Robert Hand \"Planets in Composite\".","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NatalTarget"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52,"targetDate":"2024-06-15","targetTime":"12:00:00","targetTzOffset":3,"converse":false}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/minor-progressions \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52, \"targetDate\": \"2024-06-15\", \"targetTime\": \"12:00:00\", \"targetTzOffset\": 3, \"converse\": false }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/minor-progressions', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52,\n    \"targetDate\": \"2024-06-15\",\n    \"targetTime\": \"12:00:00\",\n    \"targetTzOffset\": 3,\n    \"converse\": false\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/minor-progressions',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52,\n      'targetDate': \"2024-06-15\",\n      'targetTime': \"12:00:00\",\n      'targetTzOffset': 3,\n      'converse': False\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('minor-progressions', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n        'targetDate' => '2024-06-15',\n        'targetTime' => '12:00:00',\n        'targetTzOffset' => 3,\n        'converse' => false,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"input":{"type":"object","properties":{"name":{"type":"string","nullable":true},"date":{"type":"string","nullable":true},"time":{"type":"string","nullable":true},"timezoneOffset":{"type":"number","nullable":true},"latitude":{"type":"number","nullable":true},"longitude":{"type":"number","nullable":true},"houseSystem":{"type":"string","nullable":true},"city":{"type":"string","nullable":true},"cosmogram":{"type":"boolean","nullable":true}},"nullable":true},"julianDay":{"type":"number","nullable":true},"siderealTime":{"type":"number","nullable":true},"planets":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"longitude":{"type":"number","nullable":true},"latitude":{"type":"number","nullable":true},"distance":{"type":"number","nullable":true},"speedLong":{"type":"number","nullable":true},"speedLat":{"type":"number","nullable":true},"speedDist":{"type":"number","nullable":true},"isRetrograde":{"type":"boolean","nullable":true},"declination":{"type":"number","nullable":true},"rightAscension":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"houses":{"type":"object","properties":{"system":{"type":"string","nullable":true},"cusps":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"ascendant":{"type":"number","nullable":true},"mc":{"type":"number","nullable":true},"armc":{"type":"number","nullable":true},"vertex":{"type":"number","nullable":true},"equatorialAsc":{"type":"number","nullable":true},"coAscWK":{"type":"number","nullable":true},"coAscMunkasey":{"type":"number","nullable":true},"polarAsc":{"type":"number","nullable":true}},"nullable":true},"aspects":{"type":"array","items":{"type":"object","properties":{"planet1":{"type":"string","nullable":true},"planet2":{"type":"string","nullable":true},"planet1Id":{"type":"number","nullable":true},"planet2Id":{"type":"number","nullable":true},"type":{"type":"object","properties":{"name":{"type":"string","nullable":true},"i18nKey":{"type":"string","nullable":true},"angle":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true},"symbol":{"type":"string","nullable":true},"isMajor":{"type":"boolean","nullable":true},"color":{"type":"string","nullable":true}},"nullable":true},"exactAngle":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true},"isApplying":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true},"parallelAspects":{"type":"array","items":{"type":"object","properties":{"planet1":{"type":"string","nullable":true},"planet2":{"type":"string","nullable":true},"planet1Id":{"type":"number","nullable":true},"planet2Id":{"type":"number","nullable":true},"type":{"type":"string","nullable":true},"exactDiff":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"antiscia":{"type":"array","items":{"type":"object","properties":{"planetId":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"antiscion":{"type":"number","nullable":true},"contraAntiscion":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"antisciaAspects":{"type":"array","items":{},"nullable":true}}}}},"example":{"ok":true,"data":{"input":{"name":"Minor → 2024-06-15","date":"1990-05-15","time":"15:30:00","timezoneOffset":4,"latitude":50.45,"longitude":30.52,"houseSystem":"P","city":"","cosmogram":false},"julianDay":2448958.261438814,"siderealTime":22.998046820992563,"planets":[{"id":0,"name":"Sun","longitude":249.8232847691771,"latitude":0.000154261662109965,"distance":0.9859001349233969,"speedLong":1.0139270190933565,"speedLat":0.000007816801005280431,"speedDist":-0.00016227686690265132,"isRetrograde":false,"declination":-21.923701281342233,"rightAscension":248.17301998286786}],"houses":{"system":"P","cusps":[127.02108717567768],"ascendant":127.02108717567768,"mc":16.808391520816993,"armc":15.490702314888438,"vertex":265.0507875368164,"equatorialAsc":104.26675977804022,"coAscWK":76.20272439904295,"coAscMunkasey":120.7591463204724,"polarAsc":256.20272439904295},"aspects":[{"planet1":"Sun","planet2":"Moon","planet1Id":0,"planet2Id":1,"type":{"name":"Square","i18nKey":"aspect_square","angle":90,"orb":10,"symbol":"□","isMajor":true,"color":"#cc3333"},"exactAngle":84.56969853895973,"orb":5.430301461040273,"isApplying":true}],"parallelAspects":[{"planet1":"Sun","planet2":"Uranus","planet1Id":0,"planet2Id":7,"type":"parallel","exactDiff":0.9684839704730841,"orb":0.9684839704730841}],"antiscia":[{"planetId":0,"planetName":"Sun","antiscion":290.1767152308229,"contraAntiscion":110.17671523082291}],"antisciaAspects":[]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/primary-directions":{"post":{"tags":["Prognostics"],"summary":"Primary Directions","description":"Calculate primary directions (Ptolemaic or Regiomontanus) up to a maximum age. Returns a timeline of directed aspect hits.","operationId":"primary-directions","x-quality":"green","x-source":"Transit interpretation per Robert Hand \"Planets in Transit\" 1976 + Howard Sasportas. Secondary progressions: 1-day-per-year canon (Ptolemy lineage). Solar arc directions per Frank C. Clifford. Solar return per Robert Hand \"Planets in Composite\".","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrimaryDirections"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52,"key":0.9856353,"maxAge":80,"aspectAngles":[0,60,90,120,180]}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/primary-directions \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52, \"key\": 0.9856353, \"maxAge\": 80, \"aspectAngles\": [ 0, 60, 90, 120, 180 ] }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/primary-directions', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52,\n    \"key\": 0.9856353,\n    \"maxAge\": 80,\n    \"aspectAngles\": [\n      0,\n      60,\n      90,\n      120,\n      180\n    ]\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/primary-directions',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52,\n      'key': 0.9856353,\n      'maxAge': 80,\n      'aspectAngles': [\n        0,\n        60,\n        90,\n        120,\n        180\n      ]\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('primary-directions', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n        'key' => 0.9856353,\n        'maxAge' => 80,\n        'aspectAngles' => [0, 60, 90, 120, 180],\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"directions":{"type":"array","items":{"type":"object","properties":{"promissor":{"type":"string","nullable":true},"promissorId":{"type":"number","nullable":true},"significator":{"type":"string","nullable":true},"significatorId":{"type":"number","nullable":true},"aspectAngle":{"type":"number","nullable":true},"arc":{"type":"number","nullable":true},"ageYears":{"type":"number","nullable":true},"isDirect":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"directions":[{"promissor":"Venus","promissorId":3,"significator":"MC","significatorId":-2,"aspectAngle":60,"arc":0.09232215600522409,"ageYears":0.09366766389680249,"isDirect":false}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/symbolic-directions":{"post":{"tags":["Prognostics"],"summary":"Symbolic Directions","description":"Calculate symbolic arc directions to natal points for a target date. Key: \"one_degree\" (default), \"naibod\", or \"solar_arc\" (the arc of the progressed Sun).","operationId":"symbolic-directions","x-quality":"green","x-source":"Transit interpretation per Robert Hand \"Planets in Transit\" 1976 + Howard Sasportas. Secondary progressions: 1-day-per-year canon (Ptolemy lineage). Solar arc directions per Frank C. Clifford. Solar return per Robert Hand \"Planets in Composite\".","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SymbolicDirections"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52,"targetDate":"2026-05-15","key":"solar_arc","converse":false}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/symbolic-directions \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52, \"targetDate\": \"2026-05-15\", \"key\": \"solar_arc\", \"converse\": false }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/symbolic-directions', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52,\n    \"targetDate\": \"2026-05-15\",\n    \"key\": \"solar_arc\",\n    \"converse\": false\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/symbolic-directions',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52,\n      'targetDate': \"2026-05-15\",\n      'key': \"solar_arc\",\n      'converse': False\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('symbolic-directions', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n        'targetDate' => '2026-05-15',\n        'key' => 'solar_arc',\n        'converse' => false,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"planets":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"longitude":{"type":"number","nullable":true},"latitude":{"type":"number","nullable":true},"distance":{"type":"number","nullable":true},"speedLong":{"type":"number","nullable":true},"speedLat":{"type":"number","nullable":true},"speedDist":{"type":"number","nullable":true},"isRetrograde":{"type":"boolean","nullable":true},"declination":{"type":"number","nullable":true},"rightAscension":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"houses":{"type":"object","properties":{"system":{"type":"string","nullable":true},"cusps":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"ascendant":{"type":"number","nullable":true},"mc":{"type":"number","nullable":true},"armc":{"type":"number","nullable":true},"vertex":{"type":"number","nullable":true},"equatorialAsc":{"type":"number","nullable":true},"coAscWK":{"type":"number","nullable":true},"coAscMunkasey":{"type":"number","nullable":true},"polarAsc":{"type":"number","nullable":true}},"nullable":true},"arc":{"type":"number","nullable":true},"key":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"planets":[{"id":0,"name":"Sun","longitude":88.88433907245339,"latitude":-0.000020054940759470553,"distance":1.0108955908980104,"speedLong":0.0026244022051665704,"speedLat":0.00003805311526169511,"speedDist":0.00022039347866615117,"isRetrograde":false,"declination":18.867035147029778,"rightAscension":52.00919841916813}],"houses":{"system":"P","cusps":[204.4762693189664],"ascendant":204.4762693189664,"mc":111.58258128601301,"armc":75.95565327444125,"vertex":11.135477875348158,"equatorialAsc":164.74875654391414,"coAscWK":149.27468505332592,"coAscMunkasey":168.73706704232438,"polarAsc":329.2746850533259},"arc":34.50831927078158,"key":"solar_arc"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/solar-return":{"post":{"tags":["Prognostics"],"summary":"Solar Return","description":"Find the exact moment when the Sun returns to its natal longitude in a given year. Returns full solar return chart.","operationId":"solar-return","x-quality":"green","x-source":"Transit interpretation per Robert Hand \"Planets in Transit\" 1976 + Howard Sasportas. Secondary progressions: 1-day-per-year canon (Ptolemy lineage). Solar arc directions per Frank C. Clifford. Solar return per Robert Hand \"Planets in Composite\".","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SolarReturn"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52,"year":2024,"locationLat":50.45,"locationLng":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/solar-return \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52, \"year\": 2024, \"locationLat\": 50.45, \"locationLng\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/solar-return', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52,\n    \"year\": 2024,\n    \"locationLat\": 50.45,\n    \"locationLng\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/solar-return',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52,\n      'year': 2024,\n      'locationLat': 50.45,\n      'locationLng': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('solar-return', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n        'year' => 2024,\n        'locationLat' => 50.45,\n        'locationLng' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"input":{"type":"object","properties":{"name":{"type":"string","nullable":true},"date":{"type":"string","nullable":true},"time":{"type":"string","nullable":true},"timezoneOffset":{"type":"number","nullable":true},"latitude":{"type":"number","nullable":true},"longitude":{"type":"number","nullable":true},"houseSystem":{"type":"string","nullable":true},"city":{"type":"string","nullable":true},"cosmogram":{"type":"boolean","nullable":true}},"nullable":true},"julianDay":{"type":"number","nullable":true},"siderealTime":{"type":"number","nullable":true},"planets":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"longitude":{"type":"number","nullable":true},"latitude":{"type":"number","nullable":true},"distance":{"type":"number","nullable":true},"speedLong":{"type":"number","nullable":true},"speedLat":{"type":"number","nullable":true},"speedDist":{"type":"number","nullable":true},"isRetrograde":{"type":"boolean","nullable":true},"declination":{"type":"number","nullable":true},"rightAscension":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"houses":{"type":"object","properties":{"system":{"type":"string","nullable":true},"cusps":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"ascendant":{"type":"number","nullable":true},"mc":{"type":"number","nullable":true},"armc":{"type":"number","nullable":true},"vertex":{"type":"number","nullable":true},"equatorialAsc":{"type":"number","nullable":true},"coAscWK":{"type":"number","nullable":true},"coAscMunkasey":{"type":"number","nullable":true},"polarAsc":{"type":"number","nullable":true}},"nullable":true},"aspects":{"type":"array","items":{"type":"object","properties":{"planet1":{"type":"string","nullable":true},"planet2":{"type":"string","nullable":true},"planet1Id":{"type":"number","nullable":true},"planet2Id":{"type":"number","nullable":true},"type":{"type":"object","properties":{"name":{"type":"string","nullable":true},"i18nKey":{"type":"string","nullable":true},"angle":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true},"symbol":{"type":"string","nullable":true},"isMajor":{"type":"boolean","nullable":true},"color":{"type":"string","nullable":true}},"nullable":true},"exactAngle":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true},"isApplying":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true},"parallelAspects":{"type":"array","items":{"type":"object","properties":{"planet1":{"type":"string","nullable":true},"planet2":{"type":"string","nullable":true},"planet1Id":{"type":"number","nullable":true},"planet2Id":{"type":"number","nullable":true},"type":{"type":"string","nullable":true},"exactDiff":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"antiscia":{"type":"array","items":{"type":"object","properties":{"planetId":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"antiscion":{"type":"number","nullable":true},"contraAntiscion":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"antisciaAspects":{"type":"array","items":{"type":"object","properties":{"planet1":{"type":"string","nullable":true},"planet1Id":{"type":"number","nullable":true},"planet2":{"type":"string","nullable":true},"planet2Id":{"type":"number","nullable":true},"type":{"type":"string","nullable":true},"orb":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"returnMoment":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"input":{"name":"Solar Return 2024","date":"1990-05-15","time":"15:30:00","timezoneOffset":4,"latitude":50.45,"longitude":30.52,"houseSystem":"P","city":"","cosmogram":false},"julianDay":2460445.202911377,"siderealTime":8.397937464199412,"planets":[{"id":0,"name":"Sun","longitude":54.376021989917724,"latitude":0.00008724027183176669,"distance":1.0107932923205385,"speedLong":0.9646654604008498,"speedLat":-0.000009106688127973156,"speedDist":0.00021051493963556572,"isRetrograde":false,"declination":18.86426681997296,"rightAscension":52.00993961205619}],"houses":{"system":"P","cusps":[227.24909394699864],"ascendant":227.24909394699864,"mc":154.63138196124675,"armc":156.48906196299117,"vertex":87.65617170968403,"equatorialAsc":248.24092430749454,"coAscWK":277.18895171676945,"coAscMunkasey":232.8613145081442,"polarAsc":97.18895171676948},"aspects":[{"planet1":"Sun","planet2":"Jupiter","planet1Id":0,"planet2Id":5,"type":{"name":"Conjunction","i18nKey":"aspect_conjunction","angle":0,"orb":12,"symbol":"☌","isMajor":true,"color":"#660480"},"exactAngle":2.9680931237517925,"orb":2.9680931237517925,"isApplying":true}],"parallelAspects":[{"planet1":"Sun","planet2":"Jupiter","planet1Id":0,"planet2Id":5,"type":"parallel","exactDiff":0.015776799111364426,"orb":0.015776799111364426}],"antiscia":[{"planetId":0,"planetName":"Sun","antiscion":125.62397801008228,"contraAntiscion":305.6239780100823}],"antisciaAspects":[{"planet1":"Jupiter","planet1Id":5,"planet2":"Pluto","planet2Id":9,"type":"contra-antiscia","orb":0.5852470959202947}],"returnMoment":"2024-05-14T16:52:12Z"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/lunar-return":{"post":{"tags":["Prognostics"],"summary":"Lunar Return","description":"Find the next date when the Moon returns to its natal longitude. Returns full lunar return chart.","operationId":"lunar-return","x-quality":"green","x-source":"Transit interpretation per Robert Hand \"Planets in Transit\" 1976 + Howard Sasportas. Secondary progressions: 1-day-per-year canon (Ptolemy lineage). Solar arc directions per Frank C. Clifford. Solar return per Robert Hand \"Planets in Composite\".","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LunarReturn"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52,"afterDate":"2024-05-01","locationLat":50.45,"locationLng":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/lunar-return \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52, \"afterDate\": \"2024-05-01\", \"locationLat\": 50.45, \"locationLng\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/lunar-return', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52,\n    \"afterDate\": \"2024-05-01\",\n    \"locationLat\": 50.45,\n    \"locationLng\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/lunar-return',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52,\n      'afterDate': \"2024-05-01\",\n      'locationLat': 50.45,\n      'locationLng': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('lunar-return', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n        'afterDate' => '2024-05-01',\n        'locationLat' => 50.45,\n        'locationLng' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"input":{"type":"object","properties":{"name":{"type":"string","nullable":true},"date":{"type":"string","nullable":true},"time":{"type":"string","nullable":true},"timezoneOffset":{"type":"number","nullable":true},"latitude":{"type":"number","nullable":true},"longitude":{"type":"number","nullable":true},"houseSystem":{"type":"string","nullable":true},"city":{"type":"string","nullable":true},"cosmogram":{"type":"boolean","nullable":true}},"nullable":true},"julianDay":{"type":"number","nullable":true},"siderealTime":{"type":"number","nullable":true},"planets":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"longitude":{"type":"number","nullable":true},"latitude":{"type":"number","nullable":true},"distance":{"type":"number","nullable":true},"speedLong":{"type":"number","nullable":true},"speedLat":{"type":"number","nullable":true},"speedDist":{"type":"number","nullable":true},"isRetrograde":{"type":"boolean","nullable":true},"declination":{"type":"number","nullable":true},"rightAscension":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"houses":{"type":"object","properties":{"system":{"type":"string","nullable":true},"cusps":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"ascendant":{"type":"number","nullable":true},"mc":{"type":"number","nullable":true},"armc":{"type":"number","nullable":true},"vertex":{"type":"number","nullable":true},"equatorialAsc":{"type":"number","nullable":true},"coAscWK":{"type":"number","nullable":true},"coAscMunkasey":{"type":"number","nullable":true},"polarAsc":{"type":"number","nullable":true}},"nullable":true},"aspects":{"type":"array","items":{"type":"object","properties":{"planet1":{"type":"string","nullable":true},"planet2":{"type":"string","nullable":true},"planet1Id":{"type":"number","nullable":true},"planet2Id":{"type":"number","nullable":true},"type":{"type":"object","properties":{"name":{"type":"string","nullable":true},"i18nKey":{"type":"string","nullable":true},"angle":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true},"symbol":{"type":"string","nullable":true},"isMajor":{"type":"boolean","nullable":true},"color":{"type":"string","nullable":true}},"nullable":true},"exactAngle":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true},"isApplying":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true},"parallelAspects":{"type":"array","items":{"type":"object","properties":{"planet1":{"type":"string","nullable":true},"planet2":{"type":"string","nullable":true},"planet1Id":{"type":"number","nullable":true},"planet2Id":{"type":"number","nullable":true},"type":{"type":"string","nullable":true},"exactDiff":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"antiscia":{"type":"array","items":{"type":"object","properties":{"planetId":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"antiscion":{"type":"number","nullable":true},"contraAntiscion":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"antisciaAspects":{"type":"array","items":{},"nullable":true},"returnMoment":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"input":{"name":"Lunar Return","date":"1990-05-15","time":"15:30:00","timezoneOffset":4,"latitude":50.45,"longitude":30.52,"houseSystem":"P","city":"","cosmogram":false},"julianDay":2460458.1388702393,"siderealTime":7.710974947664996,"planets":[{"id":0,"name":"Sun","longitude":66.81862928743185,"latitude":-0.00019816112250984198,"distance":1.0132867707943862,"speedLong":0.9595984054406106,"speedLat":0.000018019776740001692,"speedDist":0.00017643774601736785,"isRetrograde":false,"declination":21.44736393822304,"rightAscension":64.98033790483007}],"houses":{"system":"P","cusps":[219.93975197587037],"ascendant":219.93975197587037,"mc":143.86794278589426,"armc":146.18462421497495,"vertex":77.63593861121963,"equatorialAsc":238.4267269434602,"coAscWK":268.00572301858347,"coAscMunkasey":224.71733832260318,"polarAsc":88.00572301858347},"aspects":[{"planet1":"Sun","planet2":"Venus","planet1Id":0,"planet2Id":3,"type":{"name":"Conjunction","i18nKey":"aspect_conjunction","angle":0,"orb":12,"symbol":"☌","isMajor":true,"color":"#660480"},"exactAngle":2.1663444750009546,"orb":2.1663444750009546,"isApplying":true}],"parallelAspects":[{"planet1":"Sun","planet2":"Venus","planet1Id":0,"planet2Id":3,"type":"parallel","exactDiff":0.7466176317126276,"orb":0.7466176317126276}],"antiscia":[{"planetId":0,"planetName":"Sun","antiscion":113.18137071256814,"contraAntiscion":293.18137071256814}],"antisciaAspects":[],"returnMoment":"2024-05-27T15:19:58Z"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/planetary-return":{"post":{"tags":["Prognostics"],"summary":"Planetary Return","description":"Find all returns of any planet to its natal longitude within a given year. Returns full charts for each return.","operationId":"planetary-return","x-quality":"green","x-source":"Transit interpretation per Robert Hand \"Planets in Transit\" 1976 + Howard Sasportas. Secondary progressions: 1-day-per-year canon (Ptolemy lineage). Solar arc directions per Frank C. Clifford. Solar return per Robert Hand \"Planets in Composite\".","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanetaryReturn"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52,"planetId":5,"year":2024,"locationLat":50.45,"locationLng":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/planetary-return \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52, \"planetId\": 5, \"year\": 2024, \"locationLat\": 50.45, \"locationLng\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/planetary-return', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52,\n    \"planetId\": 5,\n    \"year\": 2024,\n    \"locationLat\": 50.45,\n    \"locationLng\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/planetary-return',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52,\n      'planetId': 5,\n      'year': 2024,\n      'locationLat': 50.45,\n      'locationLng': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('planetary-return', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n        'planetId' => 5,\n        'year' => 2024,\n        'locationLat' => 50.45,\n        'locationLng' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"returns":{"type":"array","items":{},"nullable":true}}}}},"example":{"ok":true,"data":{"returns":[]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/profections":{"post":{"tags":["Prognostics"],"summary":"Profections","description":"Calculate annual profections: profected Ascendant, lord of the year, activated house, and monthly profection sub-rulers.","operationId":"profections","x-quality":"green","x-source":"Transit interpretation per Robert Hand \"Planets in Transit\" 1976 + Howard Sasportas. Secondary progressions: 1-day-per-year canon (Ptolemy lineage). Solar arc directions per Frank C. Clifford. Solar return per Robert Hand \"Planets in Composite\".","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NatalTarget"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52,"targetDate":"2024-05-15","targetTime":"00:00:00","targetTzOffset":3}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/profections \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52, \"targetDate\": \"2024-05-15\", \"targetTime\": \"00:00:00\", \"targetTzOffset\": 3 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/profections', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52,\n    \"targetDate\": \"2024-05-15\",\n    \"targetTime\": \"00:00:00\",\n    \"targetTzOffset\": 3\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/profections',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52,\n      'targetDate': \"2024-05-15\",\n      'targetTime': \"00:00:00\",\n      'targetTzOffset': 3\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('profections', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n        'targetDate' => '2024-05-15',\n        'targetTime' => '00:00:00',\n        'targetTzOffset' => 3,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"age":{"type":"number","nullable":true},"ascendant":{"type":"number","nullable":true},"signIndex":{"type":"number","nullable":true},"mc":{"type":"number","nullable":true},"sun":{"type":"number","nullable":true},"moon":{"type":"number","nullable":true},"lordOfYear":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"age":33,"ascendant":79.96795004818478,"signIndex":2,"mc":347.0742620152314,"sun":324.3760198016719,"moon":206.90468777651586,"lordOfYear":"Mercury"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/firdaria":{"post":{"tags":["Prognostics"],"summary":"Firdaria","description":"Calculate Firdaria planetary periods: the traditional Persian time-lord system based on sect and planet order.","operationId":"firdaria","x-quality":"green","x-source":"Transit interpretation per Robert Hand \"Planets in Transit\" 1976 + Howard Sasportas. Secondary progressions: 1-day-per-year canon (Ptolemy lineage). Solar arc directions per Frank C. Clifford. Solar return per Robert Hand \"Planets in Composite\".","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Firdaria"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52,"maxYears":75}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/firdaria \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52, \"maxYears\": 75 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/firdaria', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52,\n    \"maxYears\": 75\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/firdaria',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52,\n      'maxYears': 75\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('firdaria', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n        'maxYears' => 75,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"periods":{"type":"array","items":{"type":"object","properties":{"planet":{"type":"string","nullable":true},"subPlanet":{"type":"string","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"isActive":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"periods":[{"planet":"Sun","subPlanet":"Sun","startDate":"1990-05-15T00:00:00.000Z","endDate":"1991-10-18T18:51:25.714Z","isActive":false}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/rectification":{"post":{"tags":["Prognostics"],"summary":"Rectification","description":"Rectify an approximate birth time using a list of life events and transit/direction hits to narrow the birth time window.","operationId":"rectification","x-quality":"green","x-source":"Transit interpretation per Robert Hand \"Planets in Transit\" 1976 + Howard Sasportas. Secondary progressions: 1-day-per-year canon (Ptolemy lineage). Solar arc directions per Frank C. Clifford. Solar return per Robert Hand \"Planets in Composite\".","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Rectification"},"example":{"baseInput":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52},"events":[{"date":"2010-03-15","type":"marriage","description":"married","weight":3},{"date":"2015-07-01","type":"career","description":"career change","weight":2}],"searchRangeMinutes":120,"stepMinutes":5}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/rectification \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"baseInput\": { \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }, \"events\": [ { \"date\": \"2010-03-15\", \"type\": \"marriage\", \"description\": \"married\", \"weight\": 3 }, { \"date\": \"2015-07-01\", \"type\": \"career\", \"description\": \"career change\", \"weight\": 2 } ], \"searchRangeMinutes\": 120, \"stepMinutes\": 5 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/rectification', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"baseInput\": {\n      \"date\": \"1990-05-15\",\n      \"time\": \"15:30:00\",\n      \"timezone\": \"Europe/Kyiv\",\n      \"latitude\": 50.45,\n      \"longitude\": 30.52\n    },\n    \"events\": [\n      {\n        \"date\": \"2010-03-15\",\n        \"type\": \"marriage\",\n        \"description\": \"married\",\n        \"weight\": 3\n      },\n      {\n        \"date\": \"2015-07-01\",\n        \"type\": \"career\",\n        \"description\": \"career change\",\n        \"weight\": 2\n      }\n    ],\n    \"searchRangeMinutes\": 120,\n    \"stepMinutes\": 5\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/rectification',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'baseInput': {\n        'date': \"1990-05-15\",\n        'time': \"15:30:00\",\n        'timezone': \"Europe/Kyiv\",\n        'latitude': 50.45,\n        'longitude': 30.52\n      },\n      'events': [\n        {\n          'date': \"2010-03-15\",\n          'type': \"marriage\",\n          'description': \"married\",\n          'weight': 3\n        },\n        {\n          'date': \"2015-07-01\",\n          'type': \"career\",\n          'description': \"career change\",\n          'weight': 2\n        }\n      ],\n      'searchRangeMinutes': 120,\n      'stepMinutes': 5\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('rectification', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'baseInput' => [\n            'date' => '1990-05-15',\n            'time' => '15:30:00',\n            'timezone' => 'Europe/Kyiv',\n            'latitude' => 50.45,\n            'longitude' => 30.52,\n        ],\n        'events' => [[\n            'date' => '2010-03-15',\n            'type' => 'marriage',\n            'description' => 'married',\n            'weight' => 3,\n        ], [\n            'date' => '2015-07-01',\n            'type' => 'career',\n            'description' => 'career change',\n            'weight' => 2,\n        ]],\n        'searchRangeMinutes' => 120,\n        'stepMinutes' => 5,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"candidates":{"type":"array","items":{"type":"object","properties":{"time":{"type":"string","nullable":true},"score":{"type":"number","nullable":true},"matchedEvents":{"type":"number","nullable":true}},"nullable":true},"nullable":true}}}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/rectification/trutine":{"post":{"tags":["Prognostics"],"summary":"Trutine of Hermes","description":"Apply the Trutine of Hermes (Animodar) technique to derive the birth time from the Moon's prenatal syzygy position.","operationId":"rectification_trutine","x-quality":"green","x-source":"Transit interpretation per Robert Hand \"Planets in Transit\" 1976 + Howard Sasportas. Secondary progressions: 1-day-per-year canon (Ptolemy lineage). Solar arc directions per Frank C. Clifford. Solar return per Robert Hand \"Planets in Composite\".","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/rectification/trutine \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/rectification/trutine', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/rectification/trutine',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('rectification/trutine', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"syzygyType":{"type":"string","nullable":true},"syzygyDate":{"type":"string","nullable":true},"moonAtSyzygy":{"type":"number","nullable":true},"correctedTime":{"type":"string","nullable":true},"correctedAscendant":{"type":"number","nullable":true}}}}},"example":{"ok":true,"data":{"syzygyType":"full_moon","syzygyDate":"1990-04-10","moonAtSyzygy":200.3,"correctedTime":"13:52:00","correctedAscendant":182.1}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/harmonics":{"post":{"tags":["Specialized Charts"],"summary":"Harmonic Chart","description":"Calculate a harmonic chart by multiplying all planet longitudes by the given harmonic number (H2–H36).","operationId":"harmonics","x-quality":"green","x-source":"Specialised chart calc per standard astrology canon: heliocentric (Astrodienst), draconic (lunar nodes axis), harmonic (John Addey \"Harmonics in Astrology\" 1976), composite (Hand 1975), Gauquelin sectors (Michel Gauquelin \"Cosmic Influences on Human Behavior\" 1973).","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Harmonic"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52,"harmonic":7}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/harmonics \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52, \"harmonic\": 7 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/harmonics', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52,\n    \"harmonic\": 7\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/harmonics',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52,\n      'harmonic': 7\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('harmonics', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n        'harmonic' => 7,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"input":{"type":"object","properties":{"name":{"type":"string","nullable":true},"date":{"type":"string","nullable":true},"time":{"type":"string","nullable":true},"timezoneOffset":{"type":"number","nullable":true},"latitude":{"type":"number","nullable":true},"longitude":{"type":"number","nullable":true},"houseSystem":{"type":"string","nullable":true},"city":{"type":"string","nullable":true},"cosmogram":{"type":"boolean","nullable":true}},"nullable":true},"julianDay":{"type":"number","nullable":true},"siderealTime":{"type":"number","nullable":true},"planets":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"longitude":{"type":"number","nullable":true},"latitude":{"type":"number","nullable":true},"distance":{"type":"number","nullable":true},"speedLong":{"type":"number","nullable":true},"speedLat":{"type":"number","nullable":true},"speedDist":{"type":"number","nullable":true},"isRetrograde":{"type":"boolean","nullable":true},"declination":{"type":"number","nullable":true},"rightAscension":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"houses":{"type":"object","properties":{"system":{"type":"string","nullable":true},"cusps":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"ascendant":{"type":"number","nullable":true},"mc":{"type":"number","nullable":true},"armc":{"type":"number","nullable":true},"vertex":{"type":"number","nullable":true},"equatorialAsc":{"type":"number","nullable":true},"coAscWK":{"type":"number","nullable":true},"coAscMunkasey":{"type":"number","nullable":true},"polarAsc":{"type":"number","nullable":true}},"nullable":true},"aspects":{"type":"array","items":{"type":"object","properties":{"planet1":{"type":"string","nullable":true},"planet2":{"type":"string","nullable":true},"planet1Id":{"type":"number","nullable":true},"planet2Id":{"type":"number","nullable":true},"type":{"type":"object","properties":{"name":{"type":"string","nullable":true},"i18nKey":{"type":"string","nullable":true},"angle":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true},"symbol":{"type":"string","nullable":true},"isMajor":{"type":"boolean","nullable":true},"color":{"type":"string","nullable":true}},"nullable":true},"exactAngle":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true},"isApplying":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true},"houseAspects":{"type":"array","items":{"type":"object","properties":{"planetName":{"type":"string","nullable":true},"planetId":{"type":"number","nullable":true},"houseIndex":{"type":"number","nullable":true},"cuspLongitude":{"type":"number","nullable":true},"type":{"type":"object","properties":{"name":{"type":"string","nullable":true},"i18nKey":{"type":"string","nullable":true},"angle":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true},"symbol":{"type":"string","nullable":true},"isMajor":{"type":"boolean","nullable":true},"color":{"type":"string","nullable":true}},"nullable":true},"exactAngle":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true},"isApplying":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true},"chartSect":{"type":"string","nullable":true},"meta":{"type":"object","properties":{"engineVersion":{"type":"string","nullable":true},"calculatedAt":{"type":"string","nullable":true}},"nullable":true},"harmonicNumber":{"type":"number","nullable":true}}}}},"example":{"ok":true,"data":{"input":{"name":"","date":"1990-05-15","time":"15:30:00","timezoneOffset":4,"latitude":50.45,"longitude":30.52,"houseSystem":"P","city":"","cosmogram":false},"julianDay":2448026.9791666665,"siderealTime":3.029043551629416,"planets":[{"id":0,"name":"Sun","longitude":20.632138611702658,"latitude":-0.000020054940759470553,"distance":1.0108955908980104,"speedLong":0.9642248003676466,"speedLat":0.00003805311526169511,"speedDist":0.00022039347866615117,"isRetrograde":false,"declination":18.867035147029778,"rightAscension":52.00919841916813}],"houses":{"system":"P","cusps":[109.77565033729365],"ascendant":109.77565033729365,"mc":179.51983410662,"armc":171.6895729210887,"vertex":196.390110231966,"equatorialAsc":73.24129580739896,"coAscWK":149.27468505332592,"coAscMunkasey":168.73706704232438,"polarAsc":329.2746850533259},"aspects":[{"planet1":"Sun","planet2":"Pluto","planet1Id":0,"planet2Id":9,"type":{"name":"Trine","i18nKey":"aspect_trine","angle":120,"orb":12,"symbol":"△","isMajor":true,"color":"#3366cc"},"exactAngle":122.54366357998151,"orb":2.543663579981512,"isApplying":true}],"houseAspects":[{"planetName":"Sun","planetId":0,"houseIndex":0,"cuspLongitude":169.9679500481848,"type":{"name":"Trine","i18nKey":"aspect_trine","angle":120,"orb":12,"symbol":"△","isMajor":true,"color":"#3366cc"},"exactAngle":115.59193024651299,"orb":4.408069753487013,"isApplying":false}],"chartSect":"diurnal","meta":{"engineVersion":"2.10.03","calculatedAt":"2026-08-23T22:03:46.307Z"},"harmonicNumber":7}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/draconic":{"post":{"tags":["Specialized Charts"],"summary":"Draconic Chart","description":"Calculate the draconic chart by shifting all planet longitudes relative to the True Node (0° = True Node).","operationId":"draconic","x-quality":"green","x-source":"Specialised chart calc per standard astrology canon: heliocentric (Astrodienst), draconic (lunar nodes axis), harmonic (John Addey \"Harmonics in Astrology\" 1976), composite (Hand 1975), Gauquelin sectors (Michel Gauquelin \"Cosmic Influences on Human Behavior\" 1973).","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/draconic \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/draconic', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/draconic',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('draconic', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"input":{"type":"object","properties":{"name":{"type":"string","nullable":true},"date":{"type":"string","nullable":true},"time":{"type":"string","nullable":true},"timezoneOffset":{"type":"number","nullable":true},"latitude":{"type":"number","nullable":true},"longitude":{"type":"number","nullable":true},"houseSystem":{"type":"string","nullable":true},"city":{"type":"string","nullable":true},"cosmogram":{"type":"boolean","nullable":true}},"nullable":true},"julianDay":{"type":"number","nullable":true},"siderealTime":{"type":"number","nullable":true},"planets":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"longitude":{"type":"number","nullable":true},"latitude":{"type":"number","nullable":true},"distance":{"type":"number","nullable":true},"speedLong":{"type":"number","nullable":true},"speedLat":{"type":"number","nullable":true},"speedDist":{"type":"number","nullable":true},"isRetrograde":{"type":"boolean","nullable":true},"declination":{"type":"number","nullable":true},"rightAscension":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"houses":{"type":"object","properties":{"system":{"type":"string","nullable":true},"cusps":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"ascendant":{"type":"number","nullable":true},"mc":{"type":"number","nullable":true},"armc":{"type":"number","nullable":true},"vertex":{"type":"number","nullable":true},"equatorialAsc":{"type":"number","nullable":true},"coAscWK":{"type":"number","nullable":true},"coAscMunkasey":{"type":"number","nullable":true},"polarAsc":{"type":"number","nullable":true}},"nullable":true},"aspects":{"type":"array","items":{"type":"object","properties":{"planet1":{"type":"string","nullable":true},"planet2":{"type":"string","nullable":true},"planet1Id":{"type":"number","nullable":true},"planet2Id":{"type":"number","nullable":true},"type":{"type":"object","properties":{"name":{"type":"string","nullable":true},"i18nKey":{"type":"string","nullable":true},"angle":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true},"symbol":{"type":"string","nullable":true},"isMajor":{"type":"boolean","nullable":true},"color":{"type":"string","nullable":true}},"nullable":true},"exactAngle":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true},"isApplying":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true},"houseAspects":{"type":"array","items":{"type":"object","properties":{"planetName":{"type":"string","nullable":true},"planetId":{"type":"number","nullable":true},"houseIndex":{"type":"number","nullable":true},"cuspLongitude":{"type":"number","nullable":true},"type":{"type":"object","properties":{"name":{"type":"string","nullable":true},"i18nKey":{"type":"string","nullable":true},"angle":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true},"symbol":{"type":"string","nullable":true},"isMajor":{"type":"boolean","nullable":true},"color":{"type":"string","nullable":true}},"nullable":true},"exactAngle":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true},"isApplying":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true},"chartSect":{"type":"string","nullable":true},"meta":{"type":"object","properties":{"engineVersion":{"type":"string","nullable":true},"calculatedAt":{"type":"string","nullable":true}},"nullable":true},"draconicChart":{"type":"boolean","nullable":true}}}}},"example":{"ok":true,"data":{"input":{"name":"","date":"1990-05-15","time":"15:30:00","timezoneOffset":4,"latitude":50.45,"longitude":30.52,"houseSystem":"P","city":"","cosmogram":false},"julianDay":2448026.9791666665,"siderealTime":3.029043551629416,"planets":[{"id":0,"name":"Sun","longitude":104.11759918243399,"latitude":-0.000020054940759470553,"distance":1.0108955908980104,"speedLong":0.9642248003676466,"speedLat":0.00003805311526169511,"speedDist":0.00022039347866615117,"isRetrograde":false,"declination":18.867035147029778,"rightAscension":52.00919841916813}],"houses":{"system":"P","cusps":[219.70952942894698],"ascendant":219.70952942894698,"mc":126.8158413959936,"armc":125.69723265520344,"vertex":26.368737985328778,"equatorialAsc":214.49033592467632,"coAscWK":149.27468505332592,"coAscMunkasey":168.73706704232438,"polarAsc":329.2746850533259},"aspects":[{"planet1":"Sun","planet2":"Moon","planet1Id":0,"planet2Id":1,"type":{"name":"Trine","i18nKey":"aspect_trine","angle":120,"orb":12,"symbol":"△","isMajor":true,"color":"#3366cc"},"exactAngle":117.47133202515602,"orb":2.5286679748439838,"isApplying":false}],"houseAspects":[{"planetName":"Sun","planetId":0,"houseIndex":0,"cuspLongitude":169.9679500481848,"type":{"name":"Trine","i18nKey":"aspect_trine","angle":120,"orb":12,"symbol":"△","isMajor":true,"color":"#3366cc"},"exactAngle":115.59193024651299,"orb":4.408069753487013,"isApplying":false}],"chartSect":"diurnal","meta":{"engineVersion":"2.10.03","calculatedAt":"2026-08-23T22:03:46.487Z"},"draconicChart":true}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/heliocentric":{"post":{"tags":["Specialized Charts"],"summary":"Heliocentric Chart","description":"Calculate heliocentric planetary positions (Sun-centered) for a given birth moment. Earth replaces Sun; Moon is excluded.","operationId":"heliocentric","x-quality":"green","x-source":"Specialised chart calc per standard astrology canon: heliocentric (Astrodienst), draconic (lunar nodes axis), harmonic (John Addey \"Harmonics in Astrology\" 1976), composite (Hand 1975), Gauquelin sectors (Michel Gauquelin \"Cosmic Influences on Human Behavior\" 1973).","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/heliocentric \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/heliocentric', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/heliocentric',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('heliocentric', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"input":{"type":"object","properties":{"name":{"type":"string","nullable":true},"date":{"type":"string","nullable":true},"time":{"type":"string","nullable":true},"timezoneOffset":{"type":"number","nullable":true},"latitude":{"type":"number","nullable":true},"longitude":{"type":"number","nullable":true},"houseSystem":{"type":"string","nullable":true},"city":{"type":"string","nullable":true},"cosmogram":{"type":"boolean","nullable":true}},"nullable":true},"julianDay":{"type":"number","nullable":true},"siderealTime":{"type":"number","nullable":true},"planets":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"longitude":{"type":"number","nullable":true},"latitude":{"type":"number","nullable":true},"distance":{"type":"number","nullable":true},"speedLong":{"type":"number","nullable":true},"speedLat":{"type":"number","nullable":true},"speedDist":{"type":"number","nullable":true},"isRetrograde":{"type":"boolean","nullable":true},"declination":{"type":"number","nullable":true},"rightAscension":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"houses":{"type":"object","properties":{"system":{"type":"string","nullable":true},"cusps":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"ascendant":{"type":"number","nullable":true},"mc":{"type":"number","nullable":true},"armc":{"type":"number","nullable":true},"vertex":{"type":"number","nullable":true},"equatorialAsc":{"type":"number","nullable":true},"coAscWK":{"type":"number","nullable":true},"coAscMunkasey":{"type":"number","nullable":true},"polarAsc":{"type":"number","nullable":true}},"nullable":true},"aspects":{"type":"array","items":{"type":"object","properties":{"planet1":{"type":"string","nullable":true},"planet2":{"type":"string","nullable":true},"planet1Id":{"type":"number","nullable":true},"planet2Id":{"type":"number","nullable":true},"type":{"type":"object","properties":{"name":{"type":"string","nullable":true},"i18nKey":{"type":"string","nullable":true},"angle":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true},"symbol":{"type":"string","nullable":true},"isMajor":{"type":"boolean","nullable":true},"color":{"type":"string","nullable":true}},"nullable":true},"exactAngle":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true},"isApplying":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true},"chartSect":{"type":"string","nullable":true},"meta":{"type":"object","properties":{"engineVersion":{"type":"string","nullable":true},"calculatedAt":{"type":"string","nullable":true}},"nullable":true},"heliocentricChart":{"type":"boolean","nullable":true}}}}},"example":{"ok":true,"data":{"input":{"name":"","date":"1990-05-15","time":"15:30:00","timezoneOffset":4,"latitude":50.45,"longitude":30.52,"houseSystem":"P","city":"","cosmogram":false},"julianDay":2448026.9791666665,"siderealTime":3.029043551629416,"planets":[{"id":14,"name":"Earth","longitude":234.37601980638937,"latitude":0.000020054909794402824,"distance":1.010894327425442,"speedLong":0.9642255753575968,"speedLat":-0.00003804256476343204,"speedDist":0.00022040825169437886,"isRetrograde":false,"declination":-18.867035148215013,"rightAscension":232.0091984239938}],"houses":{"system":"P","cusps":[169.9679500481848],"ascendant":169.9679500481848,"mc":77.07426201523143,"armc":75.95565327444125,"vertex":336.6271586045666,"equatorialAsc":164.74875654391414,"coAscWK":149.27468505332592,"coAscMunkasey":168.73706704232438,"polarAsc":329.2746850533259},"aspects":[{"planet1":"Earth","planet2":"Saturn","planet1Id":14,"planet2Id":6,"type":{"name":"Sextile","i18nKey":"aspect_sextile","angle":60,"orb":6.5,"symbol":"⚹","isMajor":true,"color":"#3366cc"},"exactAngle":55.81333604302631,"orb":4.186663956973689,"isApplying":false}],"chartSect":"diurnal","meta":{"engineVersion":"2.10.03","calculatedAt":"2026-08-23T22:03:46.661Z"},"heliocentricChart":true}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/horizon":{"post":{"tags":["Specialized Charts"],"summary":"Horizon Chart","description":"Calculate azimuth and altitude of planets above the local horizon for a given time and location.","operationId":"horizon","x-quality":"green","x-source":"Specialised chart calc per standard astrology canon: heliocentric (Astrodienst), draconic (lunar nodes axis), harmonic (John Addey \"Harmonics in Astrology\" 1976), composite (Hand 1975), Gauquelin sectors (Michel Gauquelin \"Cosmic Influences on Human Behavior\" 1973).","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/horizon \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/horizon', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/horizon',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('horizon', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"count":{"type":"number","nullable":true},"above":{"type":"number","nullable":true},"below":{"type":"number","nullable":true},"positions":{"type":"array","items":{"type":"object","properties":{"planetId":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"symbol":{"type":"string","nullable":true},"azimuth":{"type":"number","nullable":true},"altitude":{"type":"number","nullable":true},"apparentAltitude":{"type":"number","nullable":true},"isAboveHorizon":{"type":"boolean","nullable":true},"longitude":{"type":"number","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"count":13,"above":5,"below":8,"positions":[{"planetId":0,"name":"Sun","symbol":"","azimuth":219.80321127370044,"altitude":53.13193450370334,"apparentAltitude":53.14460185982338,"isAboveHorizon":true,"longitude":54.37601980167181}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic-divisional":{"post":{"tags":["Specialized Charts"],"summary":"Vedic Divisional Chart (DEPRECATED: use /vedic/varga/{D}<*>)","description":"DEPRECATED: moved to dedicated per-varga endpoints `/vedic/varga/{D1..D60}` for OpenAPI/SDK ergonomics. This generic endpoint still works and stays live until its 2027-06-15 sunset (12-month, per the /v1 stability policy), then will be removed; migrate to `/vedic/varga/{D}`. Calculate a Vedic divisional (varga) chart using sidereal zodiac. Supported vargas: D1–D60 (e.g. D9 Navamsha).","operationId":"vedic-divisional","x-quality":"green","x-source":"Specialised chart calc per standard astrology canon: heliocentric (Astrodienst), draconic (lunar nodes axis), harmonic (John Addey \"Harmonics in Astrology\" 1976), composite (Hand 1975), Gauquelin sectors (Michel Gauquelin \"Cosmic Influences on Human Behavior\" 1973).","deprecated":true,"security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Vedic"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52,"varga":"D9"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic-divisional \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52, \"varga\": \"D9\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic-divisional', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52,\n    \"varga\": \"D9\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic-divisional',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52,\n      'varga': \"D9\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic-divisional', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n        'varga' => 'D9',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"varga":{"type":"string","nullable":true},"planets":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"longitude":{"type":"number","nullable":true},"sign":{"type":"number","nullable":true},"degreeInSign":{"type":"number","nullable":true},"isRetrograde":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true},"ayanamsa":{"type":"number","nullable":true}}}}},"example":{"ok":true,"data":{"varga":"D9","planets":[{"id":0,"name":"Sun","longitude":275.8519073008707,"sign":9,"degreeInSign":5.851907300870721,"isRetrograde":false}],"ayanamsa":0}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/render/wheel-western":{"post":{"tags":["Visualization"],"summary":"Western Wheel (SVG)","description":"Render a Western natal wheel as SVG: signs ring, houses ring, planets, aspect lines. Pure server-side, no browser needed.","operationId":"render_wheel-western","x-quality":"green","x-source":"Standard wheel layout: ASC left, MC top, zodiac counter-clockwise (Hand 1981, Tyl 1973, Brennan 2017).","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WheelWesternRequest"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52,"options":{"size":800,"theme":"light","showAspects":true,"format":"json"}}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/render/wheel-western \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52, \"options\": { \"size\": 800, \"theme\": \"light\", \"showAspects\": true, \"format\": \"json\" } }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/render/wheel-western', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52,\n    \"options\": {\n      \"size\": 800,\n      \"theme\": \"light\",\n      \"showAspects\": true,\n      \"format\": \"json\"\n    }\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/render/wheel-western',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52,\n      'options': {\n        'size': 800,\n        'theme': \"light\",\n        'showAspects': True,\n        'format': \"json\"\n      }\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('render/wheel-western', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n        'options' => [\n            'size' => 800,\n            'theme' => 'light',\n            'showAspects' => true,\n            'format' => 'json',\n        ],\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"svg":{"type":"string","nullable":true},"format":{"type":"string","nullable":true},"byteLength":{"type":"number","nullable":true}}}}},"example":{"ok":true,"data":{"svg":"<svg xmlns=\"http://www.w3.org/2000/svg\" ...>","format":"svg","byteLength":16131}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/render/aspect-grid":{"post":{"tags":["Visualization"],"summary":"Aspect Grid (SVG)","description":"Triangular aspect matrix: rows × columns = planets, each cell shows aspect glyph + orb. Standard textbook layout.","operationId":"render_aspect-grid","x-quality":"green","x-source":"SVG wheel layout per Western convention: ASC on left, MC on top, zodiac counter-clockwise (Hand 1981, Tyl 1973, Brennan 2017). Custom renderers, no third-party chart library dependency.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WheelWesternRequest"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/render/aspect-grid \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/render/aspect-grid', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/render/aspect-grid',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('render/aspect-grid', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"svg":{"type":"string","nullable":true},"format":{"type":"string","nullable":true},"byteLength":{"type":"number","nullable":true}}}}},"example":{"ok":true,"data":{"svg":"<svg ...>","format":"svg","byteLength":14048}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/render/moon-phase":{"post":{"tags":["Visualization"],"summary":"Moon Phase (SVG)","description":"Render the moon disk with its illuminated fraction at the given moment. Returns SVG plus illumination metrics.","operationId":"render_moon-phase","x-quality":"green","x-source":"Geometric Sun-Moon elongation: f = (1 - cos(L_moon - L_sun)) / 2.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MoonPhase"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/render/moon-phase \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/render/moon-phase', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/render/moon-phase',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('render/moon-phase', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"svg":{"type":"string","nullable":true},"illuminationFraction":{"type":"number","nullable":true},"elongationDeg":{"type":"number","nullable":true},"waxing":{"type":"boolean","nullable":true},"phase":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"svg":"<svg ...>","illuminationFraction":0.730652,"elongationDeg":242.5287,"waxing":false,"phase":"Waning Gibbous"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/render/timeline":{"post":{"tags":["Visualization"],"summary":"Timeline (SVG)","description":"Gantt-style horizontal timeline of transit/aspect events over a date window. Caller supplies events array.","operationId":"render_timeline","x-quality":"green","x-source":"SVG wheel layout per Western convention: ASC on left, MC on top, zodiac counter-clockwise (Hand 1981, Tyl 1973, Brennan 2017). Custom renderers, no third-party chart library dependency.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Timeline"},"example":{"rangeStart":"2026-01-01","rangeEnd":"2026-12-31","events":[{"label":"Saturn ☐ Sun","start":"2026-03-15","end":"2026-04-20","exact":"2026-04-02","category":"Square"}],"options":{"theme":"light","width":1000}}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/render/timeline \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"rangeStart\": \"2026-01-01\", \"rangeEnd\": \"2026-12-31\", \"events\": [ { \"label\": \"Saturn ☐ Sun\", \"start\": \"2026-03-15\", \"end\": \"2026-04-20\", \"exact\": \"2026-04-02\", \"category\": \"Square\" } ], \"options\": { \"theme\": \"light\", \"width\": 1000 } }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/render/timeline', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"rangeStart\": \"2026-01-01\",\n    \"rangeEnd\": \"2026-12-31\",\n    \"events\": [\n      {\n        \"label\": \"Saturn ☐ Sun\",\n        \"start\": \"2026-03-15\",\n        \"end\": \"2026-04-20\",\n        \"exact\": \"2026-04-02\",\n        \"category\": \"Square\"\n      }\n    ],\n    \"options\": {\n      \"theme\": \"light\",\n      \"width\": 1000\n    }\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/render/timeline',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'rangeStart': \"2026-01-01\",\n      'rangeEnd': \"2026-12-31\",\n      'events': [\n        {\n          'label': \"Saturn ☐ Sun\",\n          'start': \"2026-03-15\",\n          'end': \"2026-04-20\",\n          'exact': \"2026-04-02\",\n          'category': \"Square\"\n        }\n      ],\n      'options': {\n        'theme': \"light\",\n        'width': 1000\n      }\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('render/timeline', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'rangeStart' => '2026-01-01',\n        'rangeEnd' => '2026-12-31',\n        'events' => [[\n            'label' => 'Saturn ☐ Sun',\n            'start' => '2026-03-15',\n            'end' => '2026-04-20',\n            'exact' => '2026-04-02',\n            'category' => 'Square',\n        ]],\n        'options' => [\n            'theme' => 'light',\n            'width' => 1000,\n        ],\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"svg":{"type":"string","nullable":true},"format":{"type":"string","nullable":true},"byteLength":{"type":"number","nullable":true}}}}},"example":{"ok":true,"data":{"svg":"<svg ...>","format":"svg","byteLength":3321}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/render/bi-wheel":{"post":{"tags":["Visualization"],"summary":"Bi-Wheel (SVG)","description":"Two concentric wheels: inner natal + outer ring with transit (or progression) planets. Standard bi-wheel layout.","operationId":"render_bi-wheel","x-quality":"green","x-source":"SVG wheel layout per Western convention: ASC on left, MC on top, zodiac counter-clockwise (Hand 1981, Tyl 1973, Brennan 2017). Custom renderers, no third-party chart library dependency.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BiWheelRequest"},"example":{"natal":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52},"outer":{"date":"2026-05-07","time":"12:00:00","timezoneOffset":0,"latitude":50.45,"longitude":30.52},"options":{"size":800,"outerLabel":"TR"}}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/render/bi-wheel \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"natal\": { \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }, \"outer\": { \"date\": \"2026-05-07\", \"time\": \"12:00:00\", \"timezoneOffset\": 0, \"latitude\": 50.45, \"longitude\": 30.52 }, \"options\": { \"size\": 800, \"outerLabel\": \"TR\" } }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/render/bi-wheel', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"natal\": {\n      \"date\": \"1990-05-15\",\n      \"time\": \"15:30:00\",\n      \"timezone\": \"Europe/Kyiv\",\n      \"latitude\": 50.45,\n      \"longitude\": 30.52\n    },\n    \"outer\": {\n      \"date\": \"2026-05-07\",\n      \"time\": \"12:00:00\",\n      \"timezoneOffset\": 0,\n      \"latitude\": 50.45,\n      \"longitude\": 30.52\n    },\n    \"options\": {\n      \"size\": 800,\n      \"outerLabel\": \"TR\"\n    }\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/render/bi-wheel',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'natal': {\n        'date': \"1990-05-15\",\n        'time': \"15:30:00\",\n        'timezone': \"Europe/Kyiv\",\n        'latitude': 50.45,\n        'longitude': 30.52\n      },\n      'outer': {\n        'date': \"2026-05-07\",\n        'time': \"12:00:00\",\n        'timezoneOffset': 0,\n        'latitude': 50.45,\n        'longitude': 30.52\n      },\n      'options': {\n        'size': 800,\n        'outerLabel': \"TR\"\n      }\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('render/bi-wheel', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'natal' => [\n            'date' => '1990-05-15',\n            'time' => '15:30:00',\n            'timezone' => 'Europe/Kyiv',\n            'latitude' => 50.45,\n            'longitude' => 30.52,\n        ],\n        'outer' => [\n            'date' => '2026-05-07',\n            'time' => '12:00:00',\n            'timezoneOffset' => 0,\n            'latitude' => 50.45,\n            'longitude' => 30.52,\n        ],\n        'options' => [\n            'size' => 800,\n            'outerLabel' => 'TR',\n        ],\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"svg":{"type":"string","nullable":true},"format":{"type":"string","nullable":true},"byteLength":{"type":"number","nullable":true}}}}},"example":{"ok":true,"data":{"svg":"<svg ...>","format":"svg","byteLength":17850}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/render/tri-wheel":{"post":{"tags":["Visualization"],"summary":"Tri-Wheel (SVG)","description":"Three concentric wheels: natal + progressed + transit. Used for advanced forecasting visuals.","operationId":"render_tri-wheel","x-quality":"green","x-source":"SVG wheel layout per Western convention: ASC on left, MC on top, zodiac counter-clockwise (Hand 1981, Tyl 1973, Brennan 2017). Custom renderers, no third-party chart library dependency.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TriWheel"},"example":{"natal":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52},"middle":{"date":"2010-06-15","time":"12:00:00","timezoneOffset":0,"latitude":50.45,"longitude":30.52},"outer":{"date":"2026-05-07","time":"12:00:00","timezoneOffset":0,"latitude":50.45,"longitude":30.52},"options":{"size":800}}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/render/tri-wheel \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"natal\": { \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }, \"middle\": { \"date\": \"2010-06-15\", \"time\": \"12:00:00\", \"timezoneOffset\": 0, \"latitude\": 50.45, \"longitude\": 30.52 }, \"outer\": { \"date\": \"2026-05-07\", \"time\": \"12:00:00\", \"timezoneOffset\": 0, \"latitude\": 50.45, \"longitude\": 30.52 }, \"options\": { \"size\": 800 } }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/render/tri-wheel', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"natal\": {\n      \"date\": \"1990-05-15\",\n      \"time\": \"15:30:00\",\n      \"timezone\": \"Europe/Kyiv\",\n      \"latitude\": 50.45,\n      \"longitude\": 30.52\n    },\n    \"middle\": {\n      \"date\": \"2010-06-15\",\n      \"time\": \"12:00:00\",\n      \"timezoneOffset\": 0,\n      \"latitude\": 50.45,\n      \"longitude\": 30.52\n    },\n    \"outer\": {\n      \"date\": \"2026-05-07\",\n      \"time\": \"12:00:00\",\n      \"timezoneOffset\": 0,\n      \"latitude\": 50.45,\n      \"longitude\": 30.52\n    },\n    \"options\": {\n      \"size\": 800\n    }\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/render/tri-wheel',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'natal': {\n        'date': \"1990-05-15\",\n        'time': \"15:30:00\",\n        'timezone': \"Europe/Kyiv\",\n        'latitude': 50.45,\n        'longitude': 30.52\n      },\n      'middle': {\n        'date': \"2010-06-15\",\n        'time': \"12:00:00\",\n        'timezoneOffset': 0,\n        'latitude': 50.45,\n        'longitude': 30.52\n      },\n      'outer': {\n        'date': \"2026-05-07\",\n        'time': \"12:00:00\",\n        'timezoneOffset': 0,\n        'latitude': 50.45,\n        'longitude': 30.52\n      },\n      'options': {\n        'size': 800\n      }\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('render/tri-wheel', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'natal' => [\n            'date' => '1990-05-15',\n            'time' => '15:30:00',\n            'timezone' => 'Europe/Kyiv',\n            'latitude' => 50.45,\n            'longitude' => 30.52,\n        ],\n        'middle' => [\n            'date' => '2010-06-15',\n            'time' => '12:00:00',\n            'timezoneOffset' => 0,\n            'latitude' => 50.45,\n            'longitude' => 30.52,\n        ],\n        'outer' => [\n            'date' => '2026-05-07',\n            'time' => '12:00:00',\n            'timezoneOffset' => 0,\n            'latitude' => 50.45,\n            'longitude' => 30.52,\n        ],\n        'options' => [\n            'size' => 800,\n        ],\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"svg":{"type":"string","nullable":true},"format":{"type":"string","nullable":true},"byteLength":{"type":"number","nullable":true}}}}},"example":{"ok":true,"data":{"svg":"<svg ...>","format":"svg","byteLength":19746}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/render/composite":{"post":{"tags":["Visualization"],"summary":"Composite Chart (SVG)","description":"Composite-chart wheel from two natal inputs. Computes midpoint composite then renders as Western wheel.","operationId":"render_composite","x-quality":"green","x-source":"SVG wheel layout per Western convention: ASC on left, MC on top, zodiac counter-clockwise (Hand 1981, Tyl 1973, Brennan 2017). Custom renderers, no third-party chart library dependency.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompositeRender"},"example":{"chart1":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52},"chart2":{"date":"1985-11-03","time":"09:15:00","timezone":"Europe/Kyiv","latitude":48.46,"longitude":35.04}}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/render/composite \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"chart1\": { \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }, \"chart2\": { \"date\": \"1985-11-03\", \"time\": \"09:15:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 48.46, \"longitude\": 35.04 } }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/render/composite', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"chart1\": {\n      \"date\": \"1990-05-15\",\n      \"time\": \"15:30:00\",\n      \"timezone\": \"Europe/Kyiv\",\n      \"latitude\": 50.45,\n      \"longitude\": 30.52\n    },\n    \"chart2\": {\n      \"date\": \"1985-11-03\",\n      \"time\": \"09:15:00\",\n      \"timezone\": \"Europe/Kyiv\",\n      \"latitude\": 48.46,\n      \"longitude\": 35.04\n    }\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/render/composite',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'chart1': {\n        'date': \"1990-05-15\",\n        'time': \"15:30:00\",\n        'timezone': \"Europe/Kyiv\",\n        'latitude': 50.45,\n        'longitude': 30.52\n      },\n      'chart2': {\n        'date': \"1985-11-03\",\n        'time': \"09:15:00\",\n        'timezone': \"Europe/Kyiv\",\n        'latitude': 48.46,\n        'longitude': 35.04\n      }\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('render/composite', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'chart1' => [\n            'date' => '1990-05-15',\n            'time' => '15:30:00',\n            'timezone' => 'Europe/Kyiv',\n            'latitude' => 50.45,\n            'longitude' => 30.52,\n        ],\n        'chart2' => [\n            'date' => '1985-11-03',\n            'time' => '09:15:00',\n            'timezone' => 'Europe/Kyiv',\n            'latitude' => 48.46,\n            'longitude' => 35.04,\n        ],\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"svg":{"type":"string","nullable":true},"format":{"type":"string","nullable":true},"byteLength":{"type":"number","nullable":true}}}}},"example":{"ok":true,"data":{"svg":"<svg ...>","format":"svg","byteLength":15863}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/render/biorhythm":{"post":{"tags":["Visualization"],"summary":"Biorhythm (SVG)","description":"Three-curve sine plot of physical (23d), emotional (28d), and intellectual (33d) cycles since birth.","operationId":"render_biorhythm","x-quality":"green","x-source":"Fliess 1897 + Swoboda 1904 cycle periods. Pop-pseudoscience. Disclaimer: entertainment, not science.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BiorhythmRender"},"example":{"birthDate":"1990-05-15","rangeStart":"2026-01-01","rangeEnd":"2026-12-31","options":{"width":1000,"height":400}}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/render/biorhythm \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"birthDate\": \"1990-05-15\", \"rangeStart\": \"2026-01-01\", \"rangeEnd\": \"2026-12-31\", \"options\": { \"width\": 1000, \"height\": 400 } }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/render/biorhythm', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"birthDate\": \"1990-05-15\",\n    \"rangeStart\": \"2026-01-01\",\n    \"rangeEnd\": \"2026-12-31\",\n    \"options\": {\n      \"width\": 1000,\n      \"height\": 400\n    }\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/render/biorhythm',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'birthDate': \"1990-05-15\",\n      'rangeStart': \"2026-01-01\",\n      'rangeEnd': \"2026-12-31\",\n      'options': {\n        'width': 1000,\n        'height': 400\n      }\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('render/biorhythm', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'birthDate' => '1990-05-15',\n        'rangeStart' => '2026-01-01',\n        'rangeEnd' => '2026-12-31',\n        'options' => [\n            'width' => 1000,\n            'height' => 400,\n        ],\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"svg":{"type":"string","nullable":true},"format":{"type":"string","nullable":true},"byteLength":{"type":"number","nullable":true}}}}},"example":{"ok":true,"data":{"svg":"<svg ...>","format":"svg","byteLength":61732}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/render/wheel-vedic-north":{"post":{"tags":["Visualization"],"summary":"Vedic Wheel: North Indian (SVG)","description":"North Indian diamond chart layout: 12 fixed positions, signs rotate per ascendant. Standard BPHS rendering.","operationId":"render_wheel-vedic-north","x-quality":"green","x-source":"SVG wheel layout per Western convention: ASC on left, MC on top, zodiac counter-clockwise (Hand 1981, Tyl 1973, Brennan 2017). Custom renderers, no third-party chart library dependency.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WheelWestern"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/render/wheel-vedic-north \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/render/wheel-vedic-north', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/render/wheel-vedic-north',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('render/wheel-vedic-north', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"svg":{"type":"string","nullable":true},"format":{"type":"string","nullable":true},"byteLength":{"type":"number","nullable":true}}}}},"example":{"ok":true,"data":{"svg":"<svg ...>","format":"svg","byteLength":4959}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/render/wheel-vedic-south":{"post":{"tags":["Visualization"],"summary":"Vedic Wheel: South Indian (SVG)","description":"South Indian 4×4 grid layout (Pisces top-left, signs fixed). House numbers placed where lagna sign falls.","operationId":"render_wheel-vedic-south","x-quality":"green","x-source":"SVG wheel layout per Western convention: ASC on left, MC on top, zodiac counter-clockwise (Hand 1981, Tyl 1973, Brennan 2017). Custom renderers, no third-party chart library dependency.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WheelWestern"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/render/wheel-vedic-south \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/render/wheel-vedic-south', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/render/wheel-vedic-south',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('render/wheel-vedic-south', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"svg":{"type":"string","nullable":true},"format":{"type":"string","nullable":true},"byteLength":{"type":"number","nullable":true}}}}},"example":{"ok":true,"data":{"svg":"<svg ...>","format":"svg","byteLength":5845}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/render/wheel-vedic-east":{"post":{"tags":["Visualization"],"summary":"Vedic Wheel: East Indian (SVG)","description":"East Indian (Bengali) layout: square with diagonals + inner rotated square forming 12 sectors.","operationId":"render_wheel-vedic-east","x-quality":"green","x-source":"SVG wheel layout per Western convention: ASC on left, MC on top, zodiac counter-clockwise (Hand 1981, Tyl 1973, Brennan 2017). Custom renderers, no third-party chart library dependency.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WheelWestern"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/render/wheel-vedic-east \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/render/wheel-vedic-east', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/render/wheel-vedic-east',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('render/wheel-vedic-east', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"svg":{"type":"string","nullable":true},"format":{"type":"string","nullable":true},"byteLength":{"type":"number","nullable":true}}}}},"example":{"ok":true,"data":{"svg":"<svg ...>","format":"svg","byteLength":4977}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/render/cosmogram":{"post":{"tags":["Visualization"],"summary":"Cosmogram: Hamburg School 90° dial (SVG)","description":"Cosmobiology 90° dial. Plots planets at (longitude mod 90)° across 4 quadrants, Cardinal/Fixed/Mutable repeated.","operationId":"render_cosmogram","x-quality":"green","x-source":"Ebertin 1940 *Combination of Stellar Influences* + Witte 1928 *Rules for Planetary Pictures*.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WheelWestern"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/render/cosmogram \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/render/cosmogram', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/render/cosmogram',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('render/cosmogram', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"svg":{"type":"string","nullable":true},"format":{"type":"string","nullable":true},"byteLength":{"type":"number","nullable":true}}}}},"example":{"ok":true,"data":{"svg":"<svg ...>","format":"svg","byteLength":37979}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/render/eclipse-path":{"post":{"tags":["Visualization"],"summary":"Eclipse Path Map (SVG)","description":"Equirectangular world graticule with caller-supplied eclipse track. Renders centerline + shaded band of given degree-width.","operationId":"render_eclipse-path","x-quality":"green","x-source":"SVG wheel layout per Western convention: ASC on left, MC on top, zodiac counter-clockwise (Hand 1981, Tyl 1973, Brennan 2017). Custom renderers, no third-party chart library dependency.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EclipsePath"},"example":{"path":[{"latitude":40,"longitude":-100},{"latitude":35,"longitude":-90}],"bandWidthDeg":3,"title":"Eclipse 2026"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/render/eclipse-path \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"path\": [ { \"latitude\": 40, \"longitude\": -100 }, { \"latitude\": 35, \"longitude\": -90 } ], \"bandWidthDeg\": 3, \"title\": \"Eclipse 2026\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/render/eclipse-path', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"path\": [\n      {\n        \"latitude\": 40,\n        \"longitude\": -100\n      },\n      {\n        \"latitude\": 35,\n        \"longitude\": -90\n      }\n    ],\n    \"bandWidthDeg\": 3,\n    \"title\": \"Eclipse 2026\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/render/eclipse-path',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'path': [\n        {\n          'latitude': 40,\n          'longitude': -100\n        },\n        {\n          'latitude': 35,\n          'longitude': -90\n        }\n      ],\n      'bandWidthDeg': 3,\n      'title': \"Eclipse 2026\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('render/eclipse-path', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'path' => [[\n            'latitude' => 40,\n            'longitude' => -100,\n        ], [\n            'latitude' => 35,\n            'longitude' => -90,\n        ]],\n        'bandWidthDeg' => 3,\n        'title' => 'Eclipse 2026',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"svg":{"type":"string","nullable":true},"format":{"type":"string","nullable":true},"byteLength":{"type":"number","nullable":true}}}}},"example":{"ok":true,"data":{"svg":"<svg ...>","format":"svg","byteLength":4671}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/render/star-map":{"post":{"tags":["Visualization"],"summary":"Star Map (SVG)","description":"Stereographic projection of caller-supplied points (RA/Dec). Handles brightness magnitude scaling and labels.","operationId":"render_star-map","x-quality":"green","x-source":"SVG wheel layout per Western convention: ASC on left, MC on top, zodiac counter-clockwise (Hand 1981, Tyl 1973, Brennan 2017). Custom renderers, no third-party chart library dependency.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StarMap"},"example":{"points":[{"raHours":5.92,"decDeg":7.41,"magnitude":0.45,"name":"Betelgeuse"}],"title":"Orion"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/render/star-map \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"points\": [ { \"raHours\": 5.92, \"decDeg\": 7.41, \"magnitude\": 0.45, \"name\": \"Betelgeuse\" } ], \"title\": \"Orion\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/render/star-map', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"points\": [\n      {\n        \"raHours\": 5.92,\n        \"decDeg\": 7.41,\n        \"magnitude\": 0.45,\n        \"name\": \"Betelgeuse\"\n      }\n    ],\n    \"title\": \"Orion\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/render/star-map',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'points': [\n        {\n          'raHours': 5.92,\n          'decDeg': 7.41,\n          'magnitude': 0.45,\n          'name': \"Betelgeuse\"\n        }\n      ],\n      'title': \"Orion\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('render/star-map', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'points' => [[\n            'raHours' => 5.92,\n            'decDeg' => 7.41,\n            'magnitude' => 0.45,\n            'name' => 'Betelgeuse',\n        ]],\n        'title' => 'Orion',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"svg":{"type":"string","nullable":true},"format":{"type":"string","nullable":true},"byteLength":{"type":"number","nullable":true}}}}},"example":{"ok":true,"data":{"svg":"<svg ...>","format":"svg","byteLength":3689}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/chinese/true-solar-time":{"post":{"tags":["Chinese: Zodiac & Feng Shui"],"summary":"True solar time","description":"The clock corrected to the sun over the birth longitude, split into the meridian term and the equation of time. China runs one zone across sixty degrees, so a Kashgar birth reads nearly three hours from solar noon on a Beijing clock, which moves the hour pillar.","operationId":"chinese_true-solar-time","x-quality":"green","x-source":"60-jiazi cycle (canonical) + L. Skinner *Living Earth Manual* (1976) + Lillian Too compendium. Year and month boundaries are the exact Lichun and 節 instants computed from Swiss Ephemeris, not a fixed-date table.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChineseTrueSolarTimeInput"},"example":{"date":"1995-06-15","time":"09:20:00","timezoneOffset":8,"longitude":75.9}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/chinese/true-solar-time \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1995-06-15\", \"time\": \"09:20:00\", \"timezoneOffset\": 8, \"longitude\": 75.9 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/chinese/true-solar-time', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1995-06-15\",\n    \"time\": \"09:20:00\",\n    \"timezoneOffset\": 8,\n    \"longitude\": 75.9\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/chinese/true-solar-time',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1995-06-15\",\n      'time': \"09:20:00\",\n      'timezoneOffset': 8,\n      'longitude': 75.9\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('chinese/true-solar-time', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1995-06-15',\n        'time' => '09:20:00',\n        'timezoneOffset' => 8,\n        'longitude' => 75.9,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"input":{"type":"object","properties":{"date":{"type":"string","nullable":true},"time":{"type":"string","nullable":true},"timezoneOffset":{"type":"number","nullable":true},"longitude":{"type":"number","nullable":true}},"nullable":true},"clockTime":{"type":"string","nullable":true},"trueSolarTime":{"type":"string","nullable":true},"totalCorrectionMinutes":{"type":"number","nullable":true},"longitudeCorrectionMinutes":{"type":"number","nullable":true},"equationOfTimeMinutes":{"type":"number","nullable":true},"dayShift":{"type":"number","nullable":true},"date":{"type":"string","nullable":true},"hourBranchNote":{"type":"string","nullable":true},"methodology":{"type":"string","nullable":true},"note":{"type":"string","nullable":true},"source":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"input":{"date":"1995-06-15","time":"09:20:00","timezoneOffset":8,"longitude":75.9},"clockTime":"09:20:00","trueSolarTime":"06:23:20","totalCorrectionMinutes":-176.66,"longitudeCorrectionMinutes":-176.4,"equationOfTimeMinutes":-0.26,"dayShift":0,"date":"1995-06-15","hourBranchNote":"The double-hour is cut from the sun over the birth place, so this is the clock the hour pillar should be read from. A correction of an hour or more moves the branch; near midnight it moves the day pillar too.","methodology":"True solar time is the hour angle of the apparent Sun at the birth longitude, carried round by half a day. It decomposes into the meridian term, (longitude - 15 x timezoneOffset) x 4 minutes, and the equation of time, the Sun's own annual wobble of up to about sixteen minutes. Both are reported.","note":"timezoneOffset is the offset the clock was actually running on, which only the caller knows: a 1988 Beijing birth ran on UTC+9 under summer time, not UTC+8, and no arithmetic here can recover that from the date.","source":"Swiss Ephemeris apparent right ascension; equation of time verified against the published annual extrema"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/chinese/solar-terms":{"post":{"tags":["Chinese: Zodiac & Feng Shui"],"summary":"24 Solar Terms (節氣)","description":"The 24 solar terms of a Chinese solar year as exact instants, in UTC and Beijing time. Twelve of them open a BaZi pillar month; the other twelve decide where a leap month falls.","operationId":"chinese_solar-terms","x-quality":"green","x-source":"60-jiazi cycle (canonical) + L. Skinner *Living Earth Manual* (1976) + Lillian Too compendium. Year and month boundaries are the exact Lichun and 節 instants computed from Swiss Ephemeris, not a fixed-date table.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChineseSolarTermsInput"},"example":{"year":2026}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/chinese/solar-terms \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"year\": 2026 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/chinese/solar-terms', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"year\": 2026\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/chinese/solar-terms',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'year': 2026\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('chinese/solar-terms', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'year' => 2026,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"year":{"type":"number","nullable":true},"terms":{"type":"array","items":{"type":"object","properties":{"index":{"type":"number","nullable":true},"chinese":{"type":"string","nullable":true},"pinyin":{"type":"string","nullable":true},"english":{"type":"string","nullable":true},"sunLongitude":{"type":"number","nullable":true},"utc":{"type":"string","nullable":true},"beijing":{"type":"string","nullable":true},"opensPillarMonth":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true},"notes":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"year":2026,"terms":[{"index":0,"chinese":"立春","pinyin":"Lichun","english":"Start of Spring","sunLongitude":315,"utc":"2026-02-03T20:02:08Z","beijing":"2026-02-04T04:02:08+08:00","opensPillarMonth":true}],"notes":["Index 0 is Lichun, which opens the Chinese solar year; the sequence ends with Dahan in the following January."]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/chinese/lunar-date":{"post":{"tags":["Chinese: Zodiac & Feng Shui"],"summary":"Gregorian to Lunar Date","description":"Chinese lunar month and day for a Gregorian date, including leap-month detection, plus the Chinese New Year of that year.","operationId":"chinese_lunar-date","x-quality":"green","x-source":"60-jiazi cycle (canonical) + L. Skinner *Living Earth Manual* (1976) + Lillian Too compendium. Year and month boundaries are the exact Lichun and 節 instants computed from Swiss Ephemeris, not a fixed-date table.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChineseLunarDateInput"},"example":{"date":"2023-03-25"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/chinese/lunar-date \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"2023-03-25\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/chinese/lunar-date', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"2023-03-25\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/chinese/lunar-date',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"2023-03-25\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('chinese/lunar-date', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '2023-03-25',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"gregorianDate":{"type":"string","nullable":true},"lunar":{"type":"object","properties":{"month":{"type":"number","nullable":true},"isLeapMonth":{"type":"boolean","nullable":true},"day":{"type":"number","nullable":true},"monthStart":{"type":"string","nullable":true},"label":{"type":"string","nullable":true}},"nullable":true},"chineseNewYear":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"gregorianDate":"2023-03-25","lunar":{"month":2,"isLeapMonth":true,"day":4,"monthStart":"2023-03-22","label":"leap month 2, day 4"},"chineseNewYear":"2023-01-22"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/chinese/zodiac/animal":{"post":{"tags":["Chinese: Zodiac & Feng Shui"],"summary":"Chinese Zodiac Animal","description":"Animal sign of the birth year, bounded by the exact Lichun instant, plus the full pillar (stem + branch + element). `yearStart` and `yearEnd` are the two Lichun instants that bound the solar year, in UTC and Beijing time. Pass time + timezoneOffset for births on the boundary day.","operationId":"chinese_zodiac_animal","x-quality":"green","x-source":"60-jiazi cycle (canonical) + L. Skinner *Living Earth Manual* (1976) + Lillian Too compendium. Year and month boundaries are the exact Lichun and 節 instants computed from Swiss Ephemeris, not a fixed-date table.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChineseDateTimeInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/chinese/zodiac/animal \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/chinese/zodiac/animal', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/chinese/zodiac/animal',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('chinese/zodiac/animal', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"solarYear":{"type":"number","nullable":true},"animal":{"type":"string","nullable":true},"glyph":{"type":"string","nullable":true},"branch":{"type":"string","nullable":true},"stem":{"type":"string","nullable":true},"element":{"type":"object","properties":{"fixed":{"type":"string","nullable":true},"cycling":{"type":"string","nullable":true},"yin":{"type":"boolean","nullable":true}},"nullable":true},"pillar":{"type":"string","nullable":true},"yearStart":{"type":"object","properties":{"utc":{"type":"string","nullable":true},"beijing":{"type":"string","nullable":true}},"nullable":true},"yearEnd":{"type":"object","properties":{"utc":{"type":"string","nullable":true},"beijing":{"type":"string","nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"solarYear":1990,"animal":"Horse","glyph":"🐎","branch":"Wu","stem":"Geng","element":{"fixed":"Fire","cycling":"Metal","yin":false},"pillar":"Geng-Wu","yearStart":{"utc":"1990-02-04T02:14:00Z","beijing":"1990-02-04T10:14:00+08:00"},"yearEnd":{"utc":"1991-02-04T08:08:24Z","beijing":"1991-02-04T16:08:24+08:00"}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/chinese/zodiac/element":{"post":{"tags":["Chinese: Zodiac & Feng Shui"],"summary":"Chinese Element","description":"Fixed-branch element + cycling-stem element + yin/yang for given solar year.","operationId":"chinese_zodiac_element","x-quality":"green","x-source":"60-jiazi cycle (canonical) + L. Skinner *Living Earth Manual* (1976) + Lillian Too compendium. Year and month boundaries are the exact Lichun and 節 instants computed from Swiss Ephemeris, not a fixed-date table.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChineseDateInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/chinese/zodiac/element \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/chinese/zodiac/element', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/chinese/zodiac/element',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('chinese/zodiac/element', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"solarYear":{"type":"number","nullable":true},"fixedElement":{"type":"string","nullable":true},"cyclingElement":{"type":"string","nullable":true},"yin":{"type":"boolean","nullable":true},"description":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"solarYear":1990,"fixedElement":"Fire","cyclingElement":"Metal","yin":false,"description":"..."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/chinese/zodiac/inner-animal":{"post":{"tags":["Chinese: Zodiac & Feng Shui"],"summary":"Inner Animal (month branch)","description":"Month-branch animal: represents inner motivations and private self.","operationId":"chinese_zodiac_inner-animal","x-quality":"green","x-source":"60-jiazi cycle (canonical) + L. Skinner *Living Earth Manual* (1976) + Lillian Too compendium. Year and month boundaries are the exact Lichun and 節 instants computed from Swiss Ephemeris, not a fixed-date table.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChineseDateInput"},"example":{"date":"1990-06-15"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/chinese/zodiac/inner-animal \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-06-15\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/chinese/zodiac/inner-animal', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-06-15\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/chinese/zodiac/inner-animal',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-06-15\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('chinese/zodiac/inner-animal', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-06-15',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"innerAnimal":{"type":"string","nullable":true},"glyph":{"type":"string","nullable":true},"description":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"innerAnimal":"Wei","glyph":"🐐","description":"..."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/chinese/zodiac/secret-animal":{"post":{"tags":["Chinese: Zodiac & Feng Shui"],"summary":"Secret Animal (hour branch)","description":"Hour-of-birth branch animal: represents the deepest self. Requires birth time.","operationId":"chinese_zodiac_secret-animal","x-quality":"green","x-source":"60-jiazi cycle (canonical) + L. Skinner *Living Earth Manual* (1976) + Lillian Too compendium. Year and month boundaries are the exact Lichun and 節 instants computed from Swiss Ephemeris, not a fixed-date table.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChineseDateTimeInput"},"example":{"date":"1990-06-15","time":"14:30:00"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/chinese/zodiac/secret-animal \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-06-15\", \"time\": \"14:30:00\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/chinese/zodiac/secret-animal', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-06-15\",\n    \"time\": \"14:30:00\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/chinese/zodiac/secret-animal',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-06-15\",\n      'time': \"14:30:00\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('chinese/zodiac/secret-animal', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-06-15',\n        'time' => '14:30:00',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"secretAnimal":{"type":"string","nullable":true},"glyph":{"type":"string","nullable":true},"description":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"secretAnimal":"Wei","glyph":"🐐","description":"..."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/chinese/zodiac/compatibility":{"post":{"tags":["Chinese: Zodiac & Feng Shui"],"summary":"Animal Compatibility","description":"Pair compatibility score (0-100) using San He trine + Liu Chong conflict-pair canon.","operationId":"chinese_zodiac_compatibility","x-quality":"green","x-source":"60-jiazi cycle (canonical) + L. Skinner *Living Earth Manual* (1976) + Lillian Too compendium. Year and month boundaries are the exact Lichun and 節 instants computed from Swiss Ephemeris, not a fixed-date table.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChinesePairInput"},"example":{"person1":{"date":"1990-06-15"},"person2":{"date":"1985-03-22"}}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/chinese/zodiac/compatibility \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"person1\": { \"date\": \"1990-06-15\" }, \"person2\": { \"date\": \"1985-03-22\" } }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/chinese/zodiac/compatibility', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"person1\": {\n      \"date\": \"1990-06-15\"\n    },\n    \"person2\": {\n      \"date\": \"1985-03-22\"\n    }\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/chinese/zodiac/compatibility',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'person1': {\n        'date': \"1990-06-15\"\n      },\n      'person2': {\n        'date': \"1985-03-22\"\n      }\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('chinese/zodiac/compatibility', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'person1' => [\n            'date' => '1990-06-15',\n        ],\n        'person2' => [\n            'date' => '1985-03-22',\n        ],\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"person1":{"type":"object","properties":{"solarYear":{"type":"number","nullable":true},"animal":{"type":"string","nullable":true}},"nullable":true},"person2":{"type":"object","properties":{"solarYear":{"type":"number","nullable":true},"animal":{"type":"string","nullable":true}},"nullable":true},"compatibility":{"type":"object","properties":{"score":{"type":"number","nullable":true},"category":{"type":"string","nullable":true},"notes":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"person1":{"solarYear":1990,"animal":"Horse"},"person2":{"solarYear":1985,"animal":"Ox"},"compatibility":{"score":50,"category":"tense","notes":["Wide angular distance: needs intentional bridge-building."]}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/chinese/feng-shui/kua":{"post":{"tags":["Chinese: Zodiac & Feng Shui"],"summary":"Kua Number","description":"Personal Kua number from solar-year digit sum + gender. Maps to East/West group for direction work.","operationId":"chinese_feng-shui_kua","x-quality":"green","x-source":"60-jiazi cycle (canonical) + L. Skinner *Living Earth Manual* (1976) + Lillian Too compendium. Year and month boundaries are the exact Lichun and 節 instants computed from Swiss Ephemeris, not a fixed-date table.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChineseKuaInput"},"example":{"date":"1990-06-15","gender":"male"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/chinese/feng-shui/kua \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-06-15\", \"gender\": \"male\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/chinese/feng-shui/kua', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-06-15\",\n    \"gender\": \"male\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/chinese/feng-shui/kua',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-06-15\",\n      'gender': \"male\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('chinese/feng-shui/kua', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-06-15',\n        'gender' => 'male',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"solarYear":{"type":"number","nullable":true},"gender":{"type":"string","nullable":true},"kuaNumber":{"type":"number","nullable":true},"group":{"type":"string","nullable":true},"description":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"solarYear":1990,"gender":"male","kuaNumber":7,"group":"West","description":"..."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/chinese/feng-shui/lucky-directions":{"post":{"tags":["Chinese: Zodiac & Feng Shui"],"summary":"Lucky / Unlucky Directions","description":"Personal 4 lucky + 4 unlucky compass directions from Kua. Standard Pa Kua mapping.","operationId":"chinese_feng-shui_lucky-directions","x-quality":"green","x-source":"60-jiazi cycle (canonical) + L. Skinner *Living Earth Manual* (1976) + Lillian Too compendium. Year and month boundaries are the exact Lichun and 節 instants computed from Swiss Ephemeris, not a fixed-date table.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChineseKuaInput"},"example":{"date":"1990-06-15","gender":"male"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/chinese/feng-shui/lucky-directions \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-06-15\", \"gender\": \"male\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/chinese/feng-shui/lucky-directions', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-06-15\",\n    \"gender\": \"male\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/chinese/feng-shui/lucky-directions',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-06-15\",\n      'gender': \"male\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('chinese/feng-shui/lucky-directions', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-06-15',\n        'gender' => 'male',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"kuaNumber":{"type":"number","nullable":true},"group":{"type":"string","nullable":true},"lucky":{"type":"object","properties":{"sheng_chi":{"type":"object","properties":{"direction":{"type":"string","nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"tian_yi":{"type":"object","properties":{"direction":{"type":"string","nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"nien_yen":{"type":"object","properties":{"direction":{"type":"string","nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"fu_wei":{"type":"object","properties":{"direction":{"type":"string","nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"unlucky":{"type":"object","properties":{"ho_hai":{"type":"object","properties":{"direction":{"type":"string","nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"wu_kuei":{"type":"object","properties":{"direction":{"type":"string","nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"liu_sha":{"type":"object","properties":{"direction":{"type":"string","nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"chueh_ming":{"type":"object","properties":{"direction":{"type":"string","nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"kuaNumber":2,"group":"West","lucky":{"sheng_chi":{"direction":"NE","meaning":"Wealth, success, opportunities: best for desks, headboards."},"tian_yi":{"direction":"W","meaning":"Health, vitality, healing: good for bedrooms."},"nien_yen":{"direction":"NW","meaning":"Love, family harmony: good for entrances."},"fu_wei":{"direction":"SW","meaning":"Personal growth, peace: good for studies."}},"unlucky":{"ho_hai":{"direction":"E","meaning":"Mishaps, minor accidents."},"wu_kuei":{"direction":"SE","meaning":"Quarrels, gossip."},"liu_sha":{"direction":"S","meaning":"Six killings: serious losses."},"chueh_ming":{"direction":"N","meaning":"Total loss / endings: worst direction."}}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/chinese/feng-shui/bagua":{"post":{"tags":["Chinese: Zodiac & Feng Shui"],"summary":"Bagua Life Areas","description":"Eastern-school Bagua mapping of 9 life areas (career, knowledge, family, wealth, fame, relationships, children, helpful-people, health) onto compass sectors.","operationId":"chinese_feng-shui_bagua","x-quality":"green","x-source":"60-jiazi cycle (canonical) + L. Skinner *Living Earth Manual* (1976) + Lillian Too compendium. Year and month boundaries are the exact Lichun and 節 instants computed from Swiss Ephemeris, not a fixed-date table.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChineseKuaInput"},"example":{"date":"1990-06-15","gender":"male"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/chinese/feng-shui/bagua \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-06-15\", \"gender\": \"male\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/chinese/feng-shui/bagua', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-06-15\",\n    \"gender\": \"male\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/chinese/feng-shui/bagua',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-06-15\",\n      'gender': \"male\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('chinese/feng-shui/bagua', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-06-15',\n        'gender' => 'male',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"kuaNumber":{"type":"number","nullable":true},"group":{"type":"string","nullable":true},"bagua":{"type":"array","items":{"type":"object","properties":{"sector":{"type":"string","nullable":true},"lifeArea":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"colorTones":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"notes":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"kuaNumber":2,"group":"West","bagua":[{"sector":"N","lifeArea":"Career","element":"Water","colorTones":"Blue/Black"}],"notes":["Bagua map (Eastern / compass school): place each life area on the corresponding sector of your home."]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/chinese/feng-shui/flying-star":{"post":{"tags":["Chinese: Zodiac & Feng Shui"],"summary":"Flying Star natal chart (Xuan Kong Fei Xing)","description":"The nine-palace natal chart of a building: mountain star, period star and facing star per sector, the named arrangement (旺山旺水 and the other three), and the special patterns. Send the facing in degrees or as one of the 24 mountains, and the period directly or as the date the building was occupied. Neither is defaulted.","operationId":"chinese_feng-shui_flying-star","x-quality":"yellow","x-source":"Xuan Kong Fei Xing. The 24-mountain ring and the complete published set of 24 period-8 natal charts (Wikibooks Feng_Shui/Flying_Star_Feng_Shui/Period_8) pin the arithmetic; the Lo Shu flight path and the 20-year period cycle are definitional. Star and pair meanings are the common reading of the school, not a computed result, which is what the yellow marks.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChineseFlyingStarInput"},"example":{"period":8,"facing":180,"year":2026}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/chinese/feng-shui/flying-star \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"period\": 8, \"facing\": 180, \"year\": 2026 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/chinese/feng-shui/flying-star', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"period\": 8,\n    \"facing\": 180,\n    \"year\": 2026\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/chinese/feng-shui/flying-star',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'period': 8,\n      'facing': 180,\n      'year': 2026\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('chinese/feng-shui/flying-star', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'period' => 8,\n        'facing' => 180,\n        'year' => 2026,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"period":{"type":"object","properties":{"number":{"type":"number","nullable":true},"source":{"type":"string","nullable":true},"startYear":{"nullable":true},"endYear":{"nullable":true}},"nullable":true},"facing":{"type":"object","properties":{"degrees":{"type":"number","nullable":true},"mountain":{"type":"string","nullable":true},"chinese":{"type":"string","nullable":true},"pinyin":{"type":"string","nullable":true},"sector":{"type":"string","nullable":true},"polarity":{"type":"string","nullable":true}},"nullable":true},"sitting":{"type":"object","properties":{"mountain":{"type":"string","nullable":true},"chinese":{"type":"string","nullable":true},"pinyin":{"type":"string","nullable":true},"sector":{"type":"string","nullable":true},"degrees":{"type":"number","nullable":true}},"nullable":true},"palaces":{"type":"array","items":{"type":"object","properties":{"palace":{"type":"string","nullable":true},"sector":{"type":"string","nullable":true},"degrees":{"type":"string","nullable":true},"mountainStar":{"type":"object","properties":{"star":{"type":"number","nullable":true},"chinese":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"nature":{"type":"string","nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"periodStar":{"type":"object","properties":{"star":{"type":"number","nullable":true},"chinese":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"nature":{"type":"string","nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"facingStar":{"type":"object","properties":{"star":{"type":"number","nullable":true},"chinese":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"nature":{"type":"string","nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"annualStar":{"type":"object","properties":{"star":{"type":"number","nullable":true},"chinese":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"nature":{"type":"string","nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"pair":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"chartType":{"type":"object","properties":{"id":{"type":"string","nullable":true},"chinese":{"type":"string","nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"patterns":{"type":"array","items":{},"nullable":true},"flight":{"type":"object","properties":{"mountain":{"type":"object","properties":{"centre":{"type":"number","nullable":true},"direction":{"type":"string","nullable":true}},"nullable":true},"facing":{"type":"object","properties":{"centre":{"type":"number","nullable":true},"direction":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"annualYear":{"type":"number","nullable":true},"warnings":{"type":"array","items":{},"nullable":true},"notes":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"period":{"number":8,"source":"given","startYear":null,"endYear":null},"facing":{"degrees":180,"mountain":"S2","chinese":"午","pinyin":"Wu","sector":"S","polarity":"yin"},"sitting":{"mountain":"N2","chinese":"子","pinyin":"Zi","sector":"N","degrees":0},"palaces":[{"palace":"N","sector":"N","degrees":"337.5-22.5","mountainStar":{"star":9,"chinese":"九紫","name":"Purple Fire","element":"Fire","nature":"auspicious","meaning":"Future prosperity, celebration and multiplication. The ruling star of period 9."},"periodStar":{"star":4,"chinese":"四綠","name":"Green Wood","element":"Wood","nature":"mixed","meaning":"Study, writing and romance. Read as scholarly when timely and as scandal when not."},"facingStar":{"star":7,"chinese":"七赤","name":"Red Metal","element":"Metal","nature":"inauspicious","meaning":"Robbery, betrayal and cutting. Was timely in period 7 and is read as hostile now."},"annualStar":{"star":6,"chinese":"六白","name":"White Metal","element":"Metal","nature":"auspicious","meaning":"Authority, patronage and heaven luck. The retiring star of period 6."},"pair":"9-7"}],"chartType":{"id":"double-facing","chinese":"雙星到向","meaning":"Both stars gather in the facing palace: read as good for money, and as needing a mountain form at the back to support people."},"patterns":[],"flight":{"mountain":{"centre":4,"direction":"forward"},"facing":{"centre":3,"direction":"reverse"}},"annualYear":2026,"warnings":[],"notes":["The mountain star (山星) is read for people and health, the facing star (向星) for money and opportunity, and the period star (運星) for the era the building belongs to."]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/chinese/feng-shui/annual-stars":{"post":{"tags":["Chinese: Zodiac & Feng Shui"],"summary":"Annual flying stars and afflictions","description":"The nine annual stars for a solar year, plus Tai Sui, Sui Po, San Sha, the five yellow and the two black with the sectors they occupy. Optionally the monthly layer. The year turns at Li Chun, computed from the exact solar term.","operationId":"chinese_feng-shui_annual-stars","x-quality":"yellow","x-source":"Annual star sequence anchored on published almanacs (2023 is 4, 2024 is 3, 2025 is 2, 2026 is 1); Tai Sui at the year branch mountain with Sui Po opposite; San Sha by the four three-branch groups. Positions verified against 2026 almanacs; the advice is the tradition and is marked as such.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChineseAnnualStarsInput"},"example":{"year":2026}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/chinese/feng-shui/annual-stars \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"year\": 2026 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/chinese/feng-shui/annual-stars', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"year\": 2026\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/chinese/feng-shui/annual-stars',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'year': 2026\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('chinese/feng-shui/annual-stars', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'year' => 2026,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"solarYear":{"type":"number","nullable":true},"yearBranch":{"type":"string","nullable":true},"animal":{"type":"string","nullable":true},"centreStar":{"type":"object","properties":{"star":{"type":"number","nullable":true},"chinese":{"type":"string","nullable":true}},"nullable":true},"palaces":{"type":"array","items":{"type":"object","properties":{"palace":{"type":"string","nullable":true},"star":{"type":"number","nullable":true},"chinese":{"type":"string","nullable":true},"nature":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"afflictions":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","nullable":true},"chinese":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"mountains":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"sector":{"type":"string","nullable":true},"advice":{"type":"string","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"solarYear":2026,"yearBranch":"Wu","animal":"Horse","centreStar":{"star":1,"chinese":"一白"},"palaces":[{"palace":"S","star":5,"chinese":"五黃","nature":"inauspicious"}],"afflictions":[{"id":"tai-sui","chinese":"太歲","name":"Grand Duke Jupiter","mountains":["S2"],"sector":"S","advice":"..."}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/chinese/tong-shu":{"post":{"tags":["Chinese: Zodiac & Feng Shui"],"summary":"Tong Shu day: officer and mansion","description":"The almanac reading of one day: day pillar, the day officer (建除十二神) with what the register endorses and forbids, the 28 mansion with its quadrant and planet, and the animal the day clashes.","operationId":"chinese_tong-shu","x-quality":"yellow","x-source":"Officer rule pinned on a published worked example (December 2020, Rat month: 11 December Establish, with 8-10 December as Collect, Open and Close). Mansion cycle pinned on a Japanese almanac day-by-day sequence for August 2026 crossed with the mansion-weekday association. Both cycles reproduce exactly; the activity registers are editorial, and an activity the sources do not mention is reported as neutral rather than invented.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChineseTongShuInput"},"example":{"date":"2026-09-12"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/chinese/tong-shu \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"2026-09-12\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/chinese/tong-shu', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"2026-09-12\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/chinese/tong-shu',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"2026-09-12\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('chinese/tong-shu', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '2026-09-12',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"date":{"type":"string","nullable":true},"dayPillar":{"type":"object","properties":{"stem":{"type":"string","nullable":true},"branch":{"type":"string","nullable":true},"pillar":{"type":"string","nullable":true},"animal":{"type":"string","nullable":true}},"nullable":true},"monthBranch":{"type":"string","nullable":true},"solarYear":{"type":"number","nullable":true},"officer":{"type":"object","properties":{"index":{"type":"number","nullable":true},"chinese":{"type":"string","nullable":true},"pinyin":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"summary":{"type":"string","nullable":true},"suitable":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"unsuitable":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}},"nullable":true},"mansion":{"type":"object","properties":{"index":{"type":"number","nullable":true},"chinese":{"type":"string","nullable":true},"pinyin":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"quadrant":{"type":"string","nullable":true},"planet":{"type":"string","nullable":true},"weekday":{"type":"number","nullable":true}},"nullable":true},"clash":{"type":"object","properties":{"branch":{"type":"string","nullable":true},"animal":{"type":"string","nullable":true},"note":{"type":"string","nullable":true}},"nullable":true},"notes":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"date":"2026-09-12","dayPillar":{"stem":"Ji","branch":"Chou","pillar":"Ji-Chou","animal":"Ox"},"monthBranch":"You","solarYear":2026,"officer":{"index":4,"chinese":"定","pinyin":"Ding","name":"Stable","summary":"Settling. What is begun here is meant to last.","suitable":["marriage"],"unsuitable":["travel"]},"mansion":{"index":24,"chinese":"柳","pinyin":"Liu","name":"Willow","quadrant":"Vermilion Bird","planet":"Saturn","weekday":6},"clash":{"branch":"Wei","animal":"Goat","note":"A Goat person is traditionally advised to leave the day's major undertakings to somebody else."},"notes":["Which officer and which mansion govern the day is exact arithmetic, pinned against published almanacs. What the day is good for is a register copied from the tradition."]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/chinese/tong-shu/select":{"post":{"tags":["Chinese: Zodiac & Feng Shui"],"summary":"Tong Shu date selection","description":"Walk a date range and return the days the almanac endorses for one activity, each with the officer that decided it. Optionally drop the days that clash a person's animal. Range capped at 366 days and a longer one is refused, not truncated.","operationId":"chinese_tong-shu_select","x-quality":"yellow","x-source":"Same cycles as /chinese/tong-shu; this endpoint only walks days and filters. Selection is on the twelve officers, and the mansion is reported without filtering because its per-activity register varies between almanacs and is deliberately not encoded.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChineseTongShuSelectInput"},"example":{"from":"2026-09-01","to":"2026-12-31","activity":"marriage","avoidClashWith":"Rat"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/chinese/tong-shu/select \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"from\": \"2026-09-01\", \"to\": \"2026-12-31\", \"activity\": \"marriage\", \"avoidClashWith\": \"Rat\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/chinese/tong-shu/select', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"from\": \"2026-09-01\",\n    \"to\": \"2026-12-31\",\n    \"activity\": \"marriage\",\n    \"avoidClashWith\": \"Rat\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/chinese/tong-shu/select',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'from': \"2026-09-01\",\n      'to': \"2026-12-31\",\n      'activity': \"marriage\",\n      'avoidClashWith': \"Rat\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('chinese/tong-shu/select', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'from' => '2026-09-01',\n        'to' => '2026-12-31',\n        'activity' => 'marriage',\n        'avoidClashWith' => 'Rat',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"activity":{"type":"string","nullable":true},"scanned":{"type":"number","nullable":true},"matched":{"type":"number","nullable":true},"dropped":{"type":"object","properties":{"byRegister":{"type":"number","nullable":true},"byClash":{"type":"number","nullable":true}},"nullable":true},"days":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string","nullable":true},"verdict":{"type":"string","nullable":true},"dayPillar":{"type":"string","nullable":true},"officer":{"type":"object","properties":{"chinese":{"type":"string","nullable":true},"name":{"type":"string","nullable":true}},"nullable":true},"mansion":{"type":"object","properties":{"chinese":{"type":"string","nullable":true},"name":{"type":"string","nullable":true}},"nullable":true},"clashesWith":{"type":"string","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"activity":"marriage","scanned":122,"matched":24,"dropped":{"byRegister":88,"byClash":10},"days":[{"date":"2026-09-12","verdict":"suitable","dayPillar":"Ren-Wu","officer":{"chinese":"成","name":"Success"},"mansion":{"chinese":"井","name":"Well"},"clashesWith":"Rat"}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vastu/mandala":{"post":{"tags":["Vastu Shastra"],"summary":"Vastu Purusha Mandala (81 padas)","description":"The 9x9 mandala with all 45 deities, their pada counts and the cells each one holds, for Brihat Samhita or Mayamata. The two texts name four outer padas differently and share the cells out differently (3/2/1 against 6/2/1).","operationId":"vastu_mandala","x-quality":"yellow","x-source":"Brihat Samhita 53.42-50 (Iyer 1884): roster and square numbers; the cells of each 2- and 3-pada deity follow from the counts in 53.49-50, not from a printed diagram. Mayamata VII.34-41 gives counts only for its corner pairs, so those cells carry both names.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VastuMandalaInput"},"example":{"school":"brihat-samhita"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vastu/mandala \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"school\": \"brihat-samhita\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vastu/mandala', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"school\": \"brihat-samhita\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vastu/mandala',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'school': \"brihat-samhita\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vastu/mandala', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'school' => 'brihat-samhita',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"school":{"type":"string","nullable":true},"grid":{"type":"object","properties":{"size":{"type":"number","nullable":true},"orientation":{"type":"string","nullable":true}},"nullable":true},"devatas":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","nullable":true},"padas":{"type":"number","nullable":true},"ring":{"type":"string","nullable":true},"cells":{"type":"array","items":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"nullable":true}},"nullable":true},"nullable":true},"cells":{"type":"array","items":{"type":"object","properties":{"row":{"type":"number","nullable":true},"col":{"type":"number","nullable":true},"ring":{"type":"string","nullable":true},"devatas":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}},"nullable":true},"nullable":true},"brahmasthan":{"type":"array","items":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"nullable":true},"source":{"type":"string","nullable":true},"notes":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"school":"brihat-samhita","grid":{"size":9,"orientation":"row 0 is the north edge, col 0 the west edge; (0,8) is the north-east corner"},"devatas":[{"name":"Śikhin","padas":1,"ring":"outer","cells":[[0,8]]},{"name":"Jayanta","padas":2,"ring":"outer","cells":[[2,8],[2,7]]},{"name":"Brahmā","padas":9,"ring":"brahma","cells":[[3,3],[3,4],[3,5],[4,3],[4,4],[4,5],[5,3],[5,4],[5,5]]}],"cells":[{"row":0,"col":0,"ring":"outer","devatas":["Roga"]},{"row":0,"col":1,"ring":"outer","devatas":["Ahi"]}],"brahmasthan":[[3,3],[3,4]],"source":"Brihat Samhita, tr. N. Chidambaram Iyer (1884) 53.42-50","notes":["Brahma takes 9 padas, Aryaman, Vivasvat, Mitra and Prthvidhara 3 each, the 20 deities of the four corner groups 1 each, and the other 20 outer deities 2 each (53.49-50)."]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vastu/entrance":{"post":{"tags":["Vastu Shastra"],"summary":"Main door pada and its result","description":"Which of the 32 outer padas a main door sits in, its deity in both schools, and the result Brihat Samhita 53.72-75 gives for a door there. Send the pada (N3) or the wall and the door centre as a fraction of it; two ways of fitting 8 doors onto a 9-cell wall are offered, and a door near a pada edge is flagged.","operationId":"vastu_entrance","x-quality":"green","x-source":"Brihat Samhita 53.72-75 (Iyer 1884). The verdict is our reading of the stated effect: 7 auspicious, 2 mixed, 23 inauspicious.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VastuEntranceInput"},"example":{"side":"N","position":0.45}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vastu/entrance \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"side\": \"N\", \"position\": 0.45 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vastu/entrance', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"side\": \"N\",\n    \"position\": 0.45\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vastu/entrance',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'side': \"N\",\n      'position': 0.45\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vastu/entrance', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'side' => 'N',\n        'position' => 0.45,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"side":{"type":"string","nullable":true},"position":{"type":"number","nullable":true},"pada":{"type":"string","nullable":true},"devata":{"type":"string","nullable":true},"devataMayamata":{"type":"string","nullable":true},"effect":{"type":"string","nullable":true},"verdict":{"type":"string","nullable":true},"source":{"type":"string","nullable":true},"edgeDistance":{"type":"number","nullable":true},"method":{"type":"string","nullable":true},"warnings":{"type":"array","items":{},"nullable":true},"notes":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"side":"N","position":4,"pada":"N4","devata":"Bhallāṭa","devataMayamata":"Bhallāṭaka","effect":"Every virtue.","verdict":"auspicious","source":"Brihat Samhita, tr. N. Chidambaram Iyer (1884) 53.75","edgeDistance":0.05,"method":"eight-per-side","warnings":[],"notes":["The verdict is our classification of the effect the verse states. Brihat Samhita and Mayamata name a few padas differently; devataMayamata gives the second name."]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vastu/rooms":{"post":{"tags":["Vastu Shastra"],"summary":"Room placement and score","description":"Up to 40 rooms by direction from the centre of the house (or a bearing from true north), each judged ideal, acceptable, avoid or no-rule, with whether a verse or modern practice stands behind it. The 0-100 score is a published weighted mean; no classical text defines one. Room types with no citable rule (dining, balcony, garage, overhead tank) are refused rather than guessed.","operationId":"vastu_rooms","x-quality":"yellow","x-source":"Brihat Samhita 53.118-119 for kitchen, shrine, stores and water; every other rule is labelled modern practice. The score is our construct and its formula is returned.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VastuRoomsInput"},"example":{"rooms":[{"type":"kitchen","direction":"SE"},{"type":"master-bedroom","bearing":225},{"type":"toilet","direction":"NE"}]}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vastu/rooms \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"rooms\": [ { \"type\": \"kitchen\", \"direction\": \"SE\" }, { \"type\": \"master-bedroom\", \"bearing\": 225 }, { \"type\": \"toilet\", \"direction\": \"NE\" } ] }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vastu/rooms', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"rooms\": [\n      {\n        \"type\": \"kitchen\",\n        \"direction\": \"SE\"\n      },\n      {\n        \"type\": \"master-bedroom\",\n        \"bearing\": 225\n      },\n      {\n        \"type\": \"toilet\",\n        \"direction\": \"NE\"\n      }\n    ]\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vastu/rooms',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'rooms': [\n        {\n          'type': \"kitchen\",\n          'direction': \"SE\"\n        },\n        {\n          'type': \"master-bedroom\",\n          'bearing': 225\n        },\n        {\n          'type': \"toilet\",\n          'direction': \"NE\"\n        }\n      ]\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vastu/rooms', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'rooms' => [[\n            'type' => 'kitchen',\n            'direction' => 'SE',\n        ], [\n            'type' => 'master-bedroom',\n            'bearing' => 225,\n        ], [\n            'type' => 'toilet',\n            'direction' => 'NE',\n        ]],\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"rooms":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","nullable":true},"label":{"nullable":true},"placement":{"type":"string","nullable":true},"verdict":{"type":"string","nullable":true},"basis":{"type":"string","nullable":true},"ideal":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"source":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"score":{"type":"number","nullable":true},"scoring":{"type":"object","properties":{"points":{"type":"object","properties":{"ideal":{"type":"number","nullable":true},"acceptable":{"type":"number","nullable":true},"avoid":{"type":"number","nullable":true}},"nullable":true},"weights":{"type":"object","properties":{"classical":{"type":"number","nullable":true},"convention":{"type":"number","nullable":true}},"nullable":true},"formula":{"type":"string","nullable":true}},"nullable":true},"notes":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"rooms":[{"type":"kitchen","label":null,"placement":"SE","verdict":"ideal","basis":"classical","ideal":["SE"],"source":"Brihat Samhita, tr. N. Chidambaram Iyer (1884) 53.118: kitchen in the south-east. NW as second choice and N as avoided (fire against water) are modern practice"},{"type":"master-bedroom","label":null,"placement":"SW","verdict":"ideal","basis":"convention","ideal":["SW"],"source":"Modern practice; no verse places bedrooms"},{"type":"toilet","label":null,"placement":"NE","verdict":"avoid","basis":"convention","ideal":[],"source":"Modern practice. Writers agree on never NE and never the centre, and split on where it should go (NW and W against the MahaVastu SSW and WNW), so no direction is marked ideal"}],"score":75,"scoring":{"points":{"ideal":1,"acceptable":0.5,"avoid":0},"weights":{"classical":2,"convention":1},"formula":"round(100 * sum(weight * points) / sum(weight)) over rooms with a rule; null when none has one"},"notes":["No classical text defines a Vastu score. This one is a weighted mean, published here so it can be checked or recomputed."]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vastu/directions":{"post":{"tags":["Vastu Shastra"],"summary":"The eight directions","description":"Guardian deity, planet, element, the classical use, the result of a water body and of higher ground for each of the eight directions, each with its source. Elements have no verse and are marked as modern.","operationId":"vastu_directions","x-quality":"green","x-source":"Dikpalas from the Amarakosa; planets from Brhajjataka 2.5; uses, water and higher ground from Brihat Samhita 53.117-119 (Iyer 1884). Elements are convention.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VastuDirectionsInput"},"example":{}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vastu/directions \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{}'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vastu/directions', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({}),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vastu/directions',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vastu/directions', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"directions":{"type":"array","items":{"type":"object","properties":{"direction":{"type":"string","nullable":true},"degrees":{"type":"string","nullable":true},"dikpala":{"type":"string","nullable":true},"planet":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"water":{"type":"object","properties":{"effect":{"type":"string","nullable":true},"verdict":{"type":"string","nullable":true},"source":{"type":"string","nullable":true}},"nullable":true},"classicalUse":{"type":"string","nullable":true},"higherGround":{"nullable":true},"elementBasis":{"type":"string","nullable":true},"classicalUseSource":{"type":"string","nullable":true},"higherGroundSource":{"nullable":true}},"nullable":true},"nullable":true},"order":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"notes":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"directions":[{"direction":"NE","degrees":"22.5-67.5","dikpala":"Īśāna","planet":"Jupiter","element":"water","water":{"effect":"Sons.","verdict":"auspicious","source":"Brihat Samhita, tr. N. Chidambaram Iyer (1884) 53.119"},"classicalUse":"Shrine room.","higherGround":null,"elementBasis":"convention","classicalUseSource":"Brihat Samhita, tr. N. Chidambaram Iyer (1884) 53.118","higherGroundSource":null}],"order":["N","NE","E","SE","S","SW","W","NW"],"notes":["Dikpalas follow the Amarakosa; planets follow Brhajjataka 2.5, which gives the eight from the east: Sun, Venus, Mars, Rahu, Saturn, Moon, Mercury, Jupiter."]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/mayan/tzolkin":{"post":{"tags":["Mayan Calendars"],"summary":"Tzolkin Day Sign","description":"260-day sacred calendar. Returns 1-13 number + 20 day-name + element + direction + keyword.","operationId":"mayan_tzolkin","x-quality":"green","x-source":"Goodman-Martínez-Thompson correlation (Thompson 1935 + Lounsbury 1976). Anchor: 2012-12-21 = 13.0.0.0.0.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MayanDateOnlyInput"},"example":{"date":"1990-06-15"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/mayan/tzolkin \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-06-15\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/mayan/tzolkin', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-06-15\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/mayan/tzolkin',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-06-15\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('mayan/tzolkin', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-06-15',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"date":{"type":"string","nullable":true},"tzolkin":{"type":"object","properties":{"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"label":{"type":"string","nullable":true},"keyword":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"direction":{"type":"string","nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"date":"1990-06-15","tzolkin":{"number":8,"name":"Men","label":"8 Men","keyword":"eagle / vision","element":"Air","direction":"West"}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/mayan/haab":{"post":{"tags":["Mayan Calendars"],"summary":"Haab Civil Day","description":"365-day civil calendar = 18 months × 20 days + 5-day Wayeb. Identifies if date falls in unlucky Wayeb period.","operationId":"mayan_haab","x-quality":"green","x-source":"Goodman-Martínez-Thompson correlation (Thompson 1935 + Lounsbury 1976). Anchor: 2012-12-21 = 13.0.0.0.0.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MayanDateOnlyInput"},"example":{"date":"1990-06-15"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/mayan/haab \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-06-15\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/mayan/haab', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-06-15\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/mayan/haab',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-06-15\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('mayan/haab', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-06-15',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"haab":{"type":"object","properties":{"day":{"type":"number","nullable":true},"month":{"type":"string","nullable":true},"label":{"type":"string","nullable":true},"isWayeb":{"type":"boolean","nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"haab":{"day":8,"month":"Sotz","label":"8 Sotz","isWayeb":false}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/mayan/long-count":{"post":{"tags":["Mayan Calendars"],"summary":"Long Count","description":"Five-place positional notation: baktun.katun.tun.uinal.kin. Days since 4 Ahau 8 Cumku (3114 BC).","operationId":"mayan_long-count","x-quality":"green","x-source":"Goodman-Martínez-Thompson correlation (Thompson 1935 + Lounsbury 1976). Anchor: 2012-12-21 = 13.0.0.0.0.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MayanDateOnlyInput"},"example":{"date":"1990-06-15"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/mayan/long-count \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-06-15\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/mayan/long-count', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-06-15\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/mayan/long-count',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-06-15\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('mayan/long-count', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-06-15',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"longCount":{"type":"object","properties":{"baktun":{"type":"number","nullable":true},"katun":{"type":"number","nullable":true},"tun":{"type":"number","nullable":true},"uinal":{"type":"number","nullable":true},"kin":{"type":"number","nullable":true},"notation":{"type":"string","nullable":true},"daysSinceCreation":{"type":"number","nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"longCount":{"baktun":12,"katun":18,"tun":17,"uinal":2,"kin":15,"notation":"12.18.17.2.15","daysSinceCreation":1863775}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/mayan/calendar-round":{"post":{"tags":["Mayan Calendars"],"summary":"Calendar Round","description":"Combined Tzolkin + Haab: unique date label within the 52-year cycle (18,980 days).","operationId":"mayan_calendar-round","x-quality":"green","x-source":"Goodman-Martínez-Thompson correlation (Thompson 1935 + Lounsbury 1976). Anchor: 2012-12-21 = 13.0.0.0.0.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MayanDateOnlyInput"},"example":{"date":"1990-06-15"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/mayan/calendar-round \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-06-15\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/mayan/calendar-round', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-06-15\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/mayan/calendar-round',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-06-15\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('mayan/calendar-round', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-06-15',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"date":{"type":"string","nullable":true},"julianDay":{"type":"number","nullable":true},"calendarRound":{"type":"string","nullable":true},"tzolkin":{"type":"object","properties":{"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"label":{"type":"string","nullable":true}},"nullable":true},"haab":{"type":"object","properties":{"day":{"type":"number","nullable":true},"month":{"type":"string","nullable":true},"label":{"type":"string","nullable":true}},"nullable":true},"description":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"date":"1990-06-15","julianDay":2448058,"calendarRound":"8 Men 8 Sotz","tzolkin":{"number":8,"name":"Men","label":"8 Men"},"haab":{"day":8,"month":"Sotz","label":"8 Sotz"},"description":"52-year cycle: each combined Tzolkin + Haab date repeats every 18,980 days."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/mayan/lord-of-night":{"post":{"tags":["Mayan Calendars"],"summary":"Lord of the Night","description":"9-day cycle of underworld deities (G1-G9) governing the spiritual influence of each night.","operationId":"mayan_lord-of-night","x-quality":"green","x-source":"Goodman-Martínez-Thompson correlation (Thompson 1935 + Lounsbury 1976). Anchor: 2012-12-21 = 13.0.0.0.0.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MayanDateOnlyInput"},"example":{"date":"1990-06-15"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/mayan/lord-of-night \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-06-15\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/mayan/lord-of-night', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-06-15\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/mayan/lord-of-night',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-06-15\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('mayan/lord-of-night', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-06-15',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"lordOfNight":{"type":"object","properties":{"number":{"type":"number","nullable":true},"label":{"type":"string","nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"lordOfNight":{"number":1,"label":"G1"}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/mayan/full":{"post":{"tags":["Mayan Calendars"],"summary":"Full Mayan Date","description":"All four classical components in one call: Long Count + Tzolkin + Haab + Calendar Round + Lord of the Night.","operationId":"mayan_full","x-quality":"green","x-source":"Goodman-Martínez-Thompson correlation (Thompson 1935 + Lounsbury 1976). Anchor: 2012-12-21 = 13.0.0.0.0.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MayanDateOnlyInput"},"example":{"date":"1990-06-15"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/mayan/full \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-06-15\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/mayan/full', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-06-15\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/mayan/full',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-06-15\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('mayan/full', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-06-15',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"date":{"type":"string","nullable":true},"julianDay":{"type":"number","nullable":true},"longCount":{"type":"object","properties":{"baktun":{"type":"number","nullable":true},"katun":{"type":"number","nullable":true},"tun":{"type":"number","nullable":true},"uinal":{"type":"number","nullable":true},"kin":{"type":"number","nullable":true},"notation":{"type":"string","nullable":true}},"nullable":true},"tzolkin":{"type":"object","properties":{"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"nameIndex":{"type":"number","nullable":true},"label":{"type":"string","nullable":true},"keyword":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"direction":{"type":"string","nullable":true}},"nullable":true},"haab":{"type":"object","properties":{"day":{"type":"number","nullable":true},"month":{"type":"string","nullable":true},"monthIndex":{"type":"number","nullable":true},"label":{"type":"string","nullable":true}},"nullable":true},"calendarRound":{"type":"string","nullable":true},"lordOfNight":{"type":"object","properties":{"number":{"type":"number","nullable":true},"label":{"type":"string","nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"date":"1990-06-15","julianDay":2448058,"longCount":{"baktun":12,"katun":18,"tun":17,"uinal":2,"kin":15,"notation":"12.18.17.2.15"},"tzolkin":{"number":8,"name":"Men","nameIndex":14,"label":"8 Men","keyword":"eagle / vision","element":"Air","direction":"West"},"haab":{"day":8,"month":"Sotz","monthIndex":3,"label":"8 Sotz"},"calendarRound":"8 Men 8 Sotz","lordOfNight":{"number":1,"label":"G1"}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/mayan/compatibility":{"post":{"tags":["Mayan Calendars"],"summary":"Mayan Compatibility","description":"Pair compatibility from Tzolkin name + tone alignment plus elemental/directional affinity. Returns 0-100 score.","operationId":"mayan_compatibility","x-quality":"green","x-source":"Goodman-Martínez-Thompson correlation (Thompson 1935 + Lounsbury 1976). Anchor: 2012-12-21 = 13.0.0.0.0.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MayanPairInput"},"example":{"person1":{"date":"1990-06-15"},"person2":{"date":"1985-03-22"}}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/mayan/compatibility \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"person1\": { \"date\": \"1990-06-15\" }, \"person2\": { \"date\": \"1985-03-22\" } }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/mayan/compatibility', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"person1\": {\n      \"date\": \"1990-06-15\"\n    },\n    \"person2\": {\n      \"date\": \"1985-03-22\"\n    }\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/mayan/compatibility',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'person1': {\n        'date': \"1990-06-15\"\n      },\n      'person2': {\n        'date': \"1985-03-22\"\n      }\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('mayan/compatibility', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'person1' => [\n            'date' => '1990-06-15',\n        ],\n        'person2' => [\n            'date' => '1985-03-22',\n        ],\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"compatibility":{"type":"object","properties":{"score":{"type":"number","nullable":true},"category":{"type":"string","nullable":true},"notes":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"compatibility":{"score":80,"category":"tone","notes":["Same tone (Galactic number): synchronized rhythm."]}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/mayan/dreamspell":{"post":{"tags":["Mayan Calendars"],"summary":"Dreamspell (Argüelles 1990)","description":"Modern synchronometer reinterpretation by José Argüelles. Returns kin (1-260) + tone + seal. Distinct from traditional Tzolkin.","operationId":"mayan_dreamspell","x-quality":"yellow","x-source":"Argüelles 1990: modern interpretation, not traditional Mayan. Disclaimer in response.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MayanDateOnlyInput"},"example":{"date":"1990-06-15"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/mayan/dreamspell \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-06-15\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/mayan/dreamspell', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-06-15\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/mayan/dreamspell',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-06-15\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('mayan/dreamspell', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-06-15',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"dreamspell":{"type":"object","properties":{"kin":{"type":"number","nullable":true},"toneNumber":{"type":"number","nullable":true},"tone":{"type":"string","nullable":true},"sealIndex":{"type":"number","nullable":true},"seal":{"type":"string","nullable":true}},"nullable":true},"label":{"type":"string","nullable":true},"notes":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"dreamspell":{"kin":48,"toneNumber":9,"tone":"Solar","sealIndex":7,"seal":"Yellow Star"},"label":"Kin 48: Solar Yellow Star","notes":["..."]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/wellness/medical-astrology":{"post":{"tags":["Wellness"],"summary":"Medical Astrology (Body Rulership)","description":"Body parts ruled by sun-sign per traditional Melothesia (head→toe). Returns primary + secondary + vulnerabilities.","operationId":"wellness_medical-astrology","x-quality":"yellow","x-source":"Pelletier 1978 + Culpeper 1653 + Judy Hall *Crystal Bible*. Educational use only, not medical advice.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WellnessSignFromChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/wellness/medical-astrology \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/wellness/medical-astrology', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/wellness/medical-astrology',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('wellness/medical-astrology', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"sunSign":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"bodyRulership":{"type":"object","properties":{"primary":{"type":"string","nullable":true},"secondary":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"vulnerabilities":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}},"nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"sunSign":"Taurus","element":"Earth","bodyRulership":{"primary":"Neck, throat, vocal cords","secondary":["Thyroid"],"vulnerabilities":["Sore throat"]},"disclaimer":"Not medical advice: informational only. Consult a licensed health professional for any medical concern."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/wellness/diet":{"post":{"tags":["Wellness"],"summary":"Dietary Suggestions","description":"Element-based dietary focus: emphasize/avoid foods + cooking style.","operationId":"wellness_diet","x-quality":"yellow","x-source":"Pelletier 1978 + Culpeper 1653 + Judy Hall *Crystal Bible*. Educational use only, not medical advice.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WellnessSignFromChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/wellness/diet \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/wellness/diet', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/wellness/diet',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('wellness/diet', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"sunSign":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"diet":{"type":"object","properties":{"focus":{"type":"string","nullable":true},"emphasize":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"avoid":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"cookingStyle":{"type":"string","nullable":true}},"nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"sunSign":"Taurus","element":"Earth","diet":{"focus":"Light and stimulating to counteract sluggish digestion.","emphasize":["Bitter greens"],"avoid":["Heavy creamy sauces"],"cookingStyle":"Roasting + spices: break monotony of plain foods."},"disclaimer":"Not medical advice: informational only. Consult a licensed health professional for any medical concern."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/wellness/yoga":{"post":{"tags":["Wellness"],"summary":"Yoga Practice by Sign","description":"Sign-specific yoga focus + asanas + pranayama.","operationId":"wellness_yoga","x-quality":"yellow","x-source":"Pelletier 1978 + Culpeper 1653 + Judy Hall *Crystal Bible*. Educational use only, not medical advice.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WellnessSignFromChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/wellness/yoga \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/wellness/yoga', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/wellness/yoga',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('wellness/yoga', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"sunSign":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"yoga":{"type":"object","properties":{"focus":{"type":"string","nullable":true},"asanas":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"pranayama":{"type":"string","nullable":true}},"nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"sunSign":"Taurus","element":"Earth","yoga":{"focus":"Opening neck + throat","asanas":["Camel"],"pranayama":"Ujjayi (ocean breath)"},"disclaimer":"Not medical advice: informational only. Consult a licensed health professional for any medical concern."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/wellness/exercise":{"post":{"tags":["Wellness"],"summary":"Exercise Recommendations","description":"Element-based intensity + recommended/avoid activities.","operationId":"wellness_exercise","x-quality":"yellow","x-source":"Pelletier 1978 + Culpeper 1653 + Judy Hall *Crystal Bible*. Educational use only, not medical advice.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WellnessSignFromChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/wellness/exercise \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/wellness/exercise', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/wellness/exercise',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('wellness/exercise', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"sunSign":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"exercise":{"type":"object","properties":{"intensity":{"type":"string","nullable":true},"recommended":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"avoid":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}},"nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"sunSign":"Taurus","element":"Earth","exercise":{"intensity":"Steady endurance + strength building","recommended":["Hiking"],"avoid":["Frantic switching between activities"]},"disclaimer":"Not medical advice: informational only. Consult a licensed health professional for any medical concern."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/wellness/mental-health":{"post":{"tags":["Wellness"],"summary":"Mental-Health Profile","description":"Element-profile across luminaries + Mercury/Venus/Mars; identifies dominant element + strengths/vulnerabilities/coping.","operationId":"wellness_mental-health","x-quality":"yellow","x-source":"Pelletier 1978 + Culpeper 1653 + Judy Hall *Crystal Bible*. Educational use only, not medical advice.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WellnessSignFromChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/wellness/mental-health \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/wellness/mental-health', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/wellness/mental-health',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('wellness/mental-health', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"elementProfile":{"type":"object","properties":{"Fire":{"type":"number","nullable":true},"Earth":{"type":"number","nullable":true},"Air":{"type":"number","nullable":true},"Water":{"type":"number","nullable":true}},"nullable":true},"dominantElement":{"type":"string","nullable":true},"mentalProfile":{"type":"object","properties":{"strengths":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"vulnerabilities":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"coping":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}},"nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"elementProfile":{"Fire":1,"Earth":3,"Air":0,"Water":1},"dominantElement":"Earth","mentalProfile":{"strengths":["Resilience"],"vulnerabilities":["Depression"],"coping":["Movement variety"]},"disclaimer":"Not medical advice: informational only. Consult a licensed health professional for any medical concern. If you experience symptoms of mental distress, contact a qualified mental-health professional."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/wellness/sleep-cycles":{"post":{"tags":["Wellness"],"summary":"Moon-Phase Sleep Tips","description":"Sleep recommendations per moon phase. Pair with /sun-times to find current phase.","operationId":"wellness_sleep-cycles","x-quality":"yellow","x-source":"Pelletier 1978 + Culpeper 1653 + Judy Hall *Crystal Bible*. Educational use only, not medical advice.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WellnessDate"},"example":{"date":"1990-06-15"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/wellness/sleep-cycles \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-06-15\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/wellness/sleep-cycles', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-06-15\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/wellness/sleep-cycles',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-06-15\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('wellness/sleep-cycles', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-06-15',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"date":{"type":"string","nullable":true},"note":{"type":"string","nullable":true},"moonPhaseTips":{"type":"array","items":{"type":"object","properties":{"phase":{"type":"string","nullable":true},"tip":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"date":"1990-06-15","note":"Pair with /v1/sun-times or /v1/lunar-calendar to find the actual moon phase for your date.","moonPhaseTips":[{"phase":"New Moon","tip":"Deep rest. Earlier bedtime; intention-setting before sleep."}],"disclaimer":"Not medical advice: informational only. Consult a licensed health professional for any medical concern."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/wellness/herbs":{"post":{"tags":["Wellness"],"summary":"Herbs by Planetary Ruler","description":"Herbs ruled by sign's traditional planetary lord (Culpeper). Includes all 7 classical planets.","operationId":"wellness_herbs","x-quality":"yellow","x-source":"Pelletier 1978 + Culpeper 1653 + Judy Hall *Crystal Bible*. Educational use only, not medical advice.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WellnessSignFromChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/wellness/herbs \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/wellness/herbs', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/wellness/herbs',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('wellness/herbs', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"sunSign":{"type":"string","nullable":true},"traditionalRuler":{"type":"string","nullable":true},"herbsForRuler":{"type":"object","properties":{"herbs":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"uses":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}},"nullable":true},"allPlanetHerbs":{"type":"object","properties":{"Sun":{"type":"object","properties":{"herbs":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"uses":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}},"nullable":true},"Moon":{"type":"object","properties":{"herbs":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"uses":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}},"nullable":true},"Mercury":{"type":"object","properties":{"herbs":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"uses":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}},"nullable":true},"Venus":{"type":"object","properties":{"herbs":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"uses":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}},"nullable":true},"Mars":{"type":"object","properties":{"herbs":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"uses":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}},"nullable":true},"Jupiter":{"type":"object","properties":{"herbs":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"uses":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}},"nullable":true},"Saturn":{"type":"object","properties":{"herbs":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"uses":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}},"nullable":true}},"nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"sunSign":"Taurus","traditionalRuler":"Venus","herbsForRuler":{"herbs":["Rose"],"uses":["Skin"]},"allPlanetHerbs":{"Sun":{"herbs":["Rosemary"],"uses":["Vitality"]},"Moon":{"herbs":["Chamomile"],"uses":["Sleep"]},"Mercury":{"herbs":["Lavender"],"uses":["Mental clarity"]},"Venus":{"herbs":["Rose"],"uses":["Skin"]},"Mars":{"herbs":["Garlic"],"uses":["Circulation"]},"Jupiter":{"herbs":["Sage"],"uses":["Liver support"]},"Saturn":{"herbs":["Comfrey"],"uses":["Bones / connective tissue"]}},"disclaimer":"Not medical advice: informational only. Consult a licensed health professional for any medical concern. Many herbs interact with medications. Consult a licensed practitioner before use."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/wellness/crystals":{"post":{"tags":["Wellness"],"summary":"Healing Crystals by Sign","description":"Primary + supportive crystals + intentions per zodiac sign.","operationId":"wellness_crystals","x-quality":"yellow","x-source":"Pelletier 1978 + Culpeper 1653 + Judy Hall *Crystal Bible*. Educational use only, not medical advice.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WellnessSignFromChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/wellness/crystals \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/wellness/crystals', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/wellness/crystals',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('wellness/crystals', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"sunSign":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"crystals":{"type":"object","properties":{"primary":{"type":"string","nullable":true},"supportive":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"intentions":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}},"nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"sunSign":"Taurus","element":"Earth","crystals":{"primary":"Rose Quartz","supportive":["Emerald"],"intentions":["Self-worth"]},"disclaimer":"Crystal recommendations are educational/spiritual: not medical advice."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/wellness/cycle":{"post":{"tags":["Wellness"],"summary":"Wellness Cycle Milestones","description":"Age-based wellness milestones (Saturn return, Uranus opposition, hormonal shifts), nearby + full list.","operationId":"wellness_cycle","x-quality":"yellow","x-source":"Pelletier 1978 + Culpeper 1653 + Judy Hall *Crystal Bible*. Educational use only, not medical advice.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WellnessCycleInput"},"example":{"birthDate":"1990-06-15","targetDate":"2026-05-07"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/wellness/cycle \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"birthDate\": \"1990-06-15\", \"targetDate\": \"2026-05-07\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/wellness/cycle', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"birthDate\": \"1990-06-15\",\n    \"targetDate\": \"2026-05-07\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/wellness/cycle',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'birthDate': \"1990-06-15\",\n      'targetDate': \"2026-05-07\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('wellness/cycle', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'birthDate' => '1990-06-15',\n        'targetDate' => '2026-05-07',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"ageYears":{"type":"number","nullable":true},"nearbyMilestones":{"type":"array","items":{"type":"object","properties":{"age":{"type":"number","nullable":true},"theme":{"type":"string","nullable":true},"system":{"type":"string","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"ageYears":35,"nearbyMilestones":[{"age":35,"theme":"Metabolic shift...","system":"Metabolic"}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/wellness/biorhythm":{"post":{"tags":["Wellness"],"summary":"Biorhythm (JSON)","description":"Physical (23d), emotional (28d) and intellectual (33d) cycle values per day, plus the critical days where a cycle crosses zero. Data twin of POST /render/biorhythm.","operationId":"wellness_biorhythm","x-quality":"yellow","x-source":"Pelletier 1978 + Culpeper 1653 + Judy Hall *Crystal Bible*. Educational use only, not medical advice.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Biorhythm"},"example":{"birthDate":"1990-06-15","rangeStart":"2026-06-15","rangeEnd":"2026-06-21"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/wellness/biorhythm \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"birthDate\": \"1990-06-15\", \"rangeStart\": \"2026-06-15\", \"rangeEnd\": \"2026-06-21\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/wellness/biorhythm', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"birthDate\": \"1990-06-15\",\n    \"rangeStart\": \"2026-06-15\",\n    \"rangeEnd\": \"2026-06-21\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/wellness/biorhythm',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'birthDate': \"1990-06-15\",\n      'rangeStart': \"2026-06-15\",\n      'rangeEnd': \"2026-06-21\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('wellness/biorhythm', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'birthDate' => '1990-06-15',\n        'rangeStart' => '2026-06-15',\n        'rangeEnd' => '2026-06-21',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"birthDate":{"type":"string","nullable":true},"range":{"type":"object","properties":{"start":{"type":"string","nullable":true},"end":{"type":"string","nullable":true},"days":{"type":"number","nullable":true}},"nullable":true},"cycles":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","nullable":true},"periodDays":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"days":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string","nullable":true},"dayOfLife":{"type":"number","nullable":true},"physical":{"type":"number","nullable":true},"emotional":{"type":"number","nullable":true},"intellectual":{"type":"number","nullable":true},"critical":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}},"nullable":true},"nullable":true},"criticalDays":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string","nullable":true},"cycles":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}},"nullable":true},"nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"birthDate":"1990-06-15","range":{"start":"2026-06-15","end":"2026-06-21","days":7},"cycles":[{"name":"physical","periodDays":23}],"days":[{"date":"2026-06-16","dayOfLife":13150,"physical":-0.9977,"emotional":-0.7818,"intellectual":0.0951,"critical":["intellectual"]}],"criticalDays":[{"date":"2026-06-16","cycles":["intellectual"]}],"disclaimer":"Biorhythm cycles are a 19th-century numerological construct (Fliess 1897, Swoboda 1904) with no evidential support. Returned for entertainment and for parity with charting tools, not as a prediction."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/pet/birth-chart":{"post":{"tags":["Pet Astrology"],"summary":"Pet Birth Chart","description":"Full natal chart for the pet (sun, moon, ASC + planets) plus disclaimer.","operationId":"pet_birth-chart","x-quality":"yellow","x-source":"Generic adaptation of Western natal techniques for animal birth times. No canonical pet-astrology lineage; entertainment use only.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PetPetInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/pet/birth-chart \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/pet/birth-chart', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/pet/birth-chart',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('pet/birth-chart', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"sunSign":{"type":"string","nullable":true},"moonSign":{"type":"string","nullable":true},"ascendant":{"type":"string","nullable":true},"planets":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","nullable":true},"longitude":{"type":"number","nullable":true},"sign":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"sunSign":"Taurus","moonSign":"Capricorn","ascendant":"Virgo","planets":[{"name":"Sun","longitude":54.37601980167181,"sign":"Taurus"}],"disclaimer":"Pet astrology is for entertainment only: not a substitute for veterinary care or behavioral training."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/pet/sun-sign-meaning":{"post":{"tags":["Pet Astrology"],"summary":"Pet Sun-Sign Meaning","description":"Personality + temperament + best-suited household.","operationId":"pet_sun-sign-meaning","x-quality":"yellow","x-source":"Generic adaptation of Western natal techniques for animal birth times. No canonical pet-astrology lineage; entertainment use only.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PetPetInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/pet/sun-sign-meaning \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/pet/sun-sign-meaning', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/pet/sun-sign-meaning',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('pet/sun-sign-meaning', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"sunSign":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"personality":{"type":"object","properties":{"temperament":{"type":"string","nullable":true},"quirks":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"bestSuited":{"type":"string","nullable":true}},"nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"sunSign":"Taurus","element":"Earth","personality":{"temperament":"Calm, food-motivated, stubborn","quirks":["Loves treats"],"bestSuited":"Quiet homes with consistent schedules"},"disclaimer":"Pet astrology is for entertainment only: not a substitute for veterinary care or behavioral training."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/pet/personality":{"post":{"tags":["Pet Astrology"],"summary":"Pet Personality Profile","description":"Full personality breakdown.","operationId":"pet_personality","x-quality":"yellow","x-source":"Generic adaptation of Western natal techniques for animal birth times. No canonical pet-astrology lineage; entertainment use only.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PetPetInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/pet/personality \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/pet/personality', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/pet/personality',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('pet/personality', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"sunSign":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"temperament":{"type":"string","nullable":true},"quirks":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"bestSuited":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"sunSign":"Taurus","element":"Earth","temperament":"Calm, food-motivated, stubborn","quirks":["Loves treats"],"bestSuited":"Quiet homes with consistent schedules","disclaimer":"Pet astrology is for entertainment only: not a substitute for veterinary care or behavioral training."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/pet/temperament":{"post":{"tags":["Pet Astrology"],"summary":"Pet Temperament","description":"Short temperament-only summary.","operationId":"pet_temperament","x-quality":"yellow","x-source":"Generic adaptation of Western natal techniques for animal birth times. No canonical pet-astrology lineage; entertainment use only.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PetPetInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/pet/temperament \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/pet/temperament', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/pet/temperament',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('pet/temperament', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"sunSign":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"temperament":{"type":"string","nullable":true},"quirks":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"sunSign":"Taurus","element":"Earth","temperament":"Calm, food-motivated, stubborn","quirks":["Loves treats"],"disclaimer":"Pet astrology is for entertainment only: not a substitute for veterinary care or behavioral training."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/pet/training-style":{"post":{"tags":["Pet Astrology"],"summary":"Training Style","description":"Preferred training style + 3 tips.","operationId":"pet_training-style","x-quality":"yellow","x-source":"Generic adaptation of Western natal techniques for animal birth times. No canonical pet-astrology lineage; entertainment use only.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PetPetInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/pet/training-style \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/pet/training-style', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/pet/training-style',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('pet/training-style', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"sunSign":{"type":"string","nullable":true},"training":{"type":"object","properties":{"style":{"type":"string","nullable":true},"tips":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}},"nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"sunSign":"Taurus","training":{"style":"Food-reward repetition","tips":["Treats are gold"]},"disclaimer":"Pet astrology is for entertainment only: not a substitute for veterinary care or behavioral training."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/pet/diet-by-sign":{"post":{"tags":["Pet Astrology"],"summary":"Diet by Sign","description":"Element-based dietary focus.","operationId":"pet_diet-by-sign","x-quality":"yellow","x-source":"Generic adaptation of Western natal techniques for animal birth times. No canonical pet-astrology lineage; entertainment use only.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PetPetInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/pet/diet-by-sign \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/pet/diet-by-sign', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/pet/diet-by-sign',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('pet/diet-by-sign', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"sunSign":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"diet":{"type":"object","properties":{"focus":{"type":"string","nullable":true},"tips":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}},"nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"sunSign":"Taurus","element":"Earth","diet":{"focus":"Steady whole-food meals","tips":["Whole grains"]},"disclaimer":"Pet astrology is for entertainment only: not a substitute for veterinary care or behavioral training."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/pet/grooming-by-element":{"post":{"tags":["Pet Astrology"],"summary":"Grooming by Element","description":"Grooming focus + frequency by element.","operationId":"pet_grooming-by-element","x-quality":"yellow","x-source":"Generic adaptation of Western natal techniques for animal birth times. No canonical pet-astrology lineage; entertainment use only.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PetPetInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/pet/grooming-by-element \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/pet/grooming-by-element', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/pet/grooming-by-element',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('pet/grooming-by-element', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"grooming":{"type":"object","properties":{"focus":{"type":"string","nullable":true},"freq":{"type":"string","nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"grooming":{"focus":"...","freq":"..."}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/pet/exercise-needs":{"post":{"tags":["Pet Astrology"],"summary":"Exercise Needs","description":"Element-based daily exercise minutes + recommended activities.","operationId":"pet_exercise-needs","x-quality":"yellow","x-source":"Generic adaptation of Western natal techniques for animal birth times. No canonical pet-astrology lineage; entertainment use only.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PetPetInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/pet/exercise-needs \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/pet/exercise-needs', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/pet/exercise-needs',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('pet/exercise-needs', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"sunSign":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"exercise":{"type":"object","properties":{"intensity":{"type":"string","nullable":true},"minDailyMinutes":{"type":"number","nullable":true},"activities":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}},"nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"sunSign":"Taurus","element":"Earth","exercise":{"intensity":"Moderate","minDailyMinutes":60,"activities":["Long walks"]},"disclaimer":"Pet astrology is for entertainment only: not a substitute for veterinary care or behavioral training."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/pet/communication-style":{"post":{"tags":["Pet Astrology"],"summary":"Communication Style","description":"How best to communicate with this pet.","operationId":"pet_communication-style","x-quality":"yellow","x-source":"Generic adaptation of Western natal techniques for animal birth times. No canonical pet-astrology lineage; entertainment use only.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PetPetInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/pet/communication-style \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/pet/communication-style', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/pet/communication-style',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('pet/communication-style', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"communication":{"type":"object","properties":{"style":{"type":"string","nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"communication":{"style":"..."}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/pet/play-style":{"post":{"tags":["Pet Astrology"],"summary":"Play Style + Toys","description":"Preferred play and toy types.","operationId":"pet_play-style","x-quality":"yellow","x-source":"Generic adaptation of Western natal techniques for animal birth times. No canonical pet-astrology lineage; entertainment use only.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PetPetInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/pet/play-style \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/pet/play-style', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/pet/play-style',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('pet/play-style', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"sunSign":{"type":"string","nullable":true},"play":{"type":"object","properties":{"style":{"type":"string","nullable":true},"toys":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}},"nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"sunSign":"Taurus","play":{"style":"Comfort + toys to chew on","toys":["Plush toys"]},"disclaimer":"Pet astrology is for entertainment only: not a substitute for veterinary care or behavioral training."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/pet/health-tips":{"post":{"tags":["Pet Astrology"],"summary":"Health Watch-Outs","description":"Sign-specific health vulnerabilities. NOT veterinary advice.","operationId":"pet_health-tips","x-quality":"yellow","x-source":"Generic adaptation of Western natal techniques for animal birth times. No canonical pet-astrology lineage; entertainment use only.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PetPetInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/pet/health-tips \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/pet/health-tips', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/pet/health-tips',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('pet/health-tips', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"sunSign":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"healthTips":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"sunSign":"Taurus","element":"Earth","healthTips":["Watch for thyroid issues"],"disclaimer":"Pet astrology is for entertainment only: not a substitute for veterinary care or behavioral training. Consult a veterinarian for any health concern."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/pet/best-names":{"post":{"tags":["Pet Astrology"],"summary":"Best Names by Sign","description":"Sign-aligned name suggestions; optional gender filter.","operationId":"pet_best-names","x-quality":"yellow","x-source":"Generic adaptation of Western natal techniques for animal birth times. No canonical pet-astrology lineage; entertainment use only.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PetNameInput"},"example":{"date":"2020-06-15","time":"12:00:00","timezoneOffset":0,"latitude":40,"longitude":-74,"gender":"feminine"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/pet/best-names \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"2020-06-15\", \"time\": \"12:00:00\", \"timezoneOffset\": 0, \"latitude\": 40, \"longitude\": -74, \"gender\": \"feminine\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/pet/best-names', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"2020-06-15\",\n    \"time\": \"12:00:00\",\n    \"timezoneOffset\": 0,\n    \"latitude\": 40,\n    \"longitude\": -74,\n    \"gender\": \"feminine\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/pet/best-names',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"2020-06-15\",\n      'time': \"12:00:00\",\n      'timezoneOffset': 0,\n      'latitude': 40,\n      'longitude': -74,\n      'gender': \"feminine\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('pet/best-names', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '2020-06-15',\n        'time' => '12:00:00',\n        'timezoneOffset' => 0,\n        'latitude' => 40,\n        'longitude' => -74,\n        'gender' => 'feminine',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"sunSign":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"names":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"sunSign":"Gemini","element":"Air","names":["Coco"],"disclaimer":"Pet astrology is for entertainment only: not a substitute for veterinary care or behavioral training."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/pet/lucky-day":{"post":{"tags":["Pet Astrology"],"summary":"Lucky Days","description":"Days of week traditionally aligned with the sign.","operationId":"pet_lucky-day","x-quality":"yellow","x-source":"Generic adaptation of Western natal techniques for animal birth times. No canonical pet-astrology lineage; entertainment use only.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PetPetInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/pet/lucky-day \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/pet/lucky-day', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/pet/lucky-day',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('pet/lucky-day', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"luckyDays":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"luckyDays":["Friday"]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/pet/owner-pet-compatibility":{"post":{"tags":["Pet Astrology"],"summary":"Owner-Pet Compatibility","description":"Compatibility score (0-100) based on element + sign distance.","operationId":"pet_owner-pet-compatibility","x-quality":"yellow","x-source":"Generic adaptation of Western natal techniques for animal birth times. No canonical pet-astrology lineage; entertainment use only.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PetPairInput"},"example":{"owner":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52},"pet":{"date":"2020-06-15","time":"12:00:00","timezoneOffset":0,"latitude":40,"longitude":-74}}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/pet/owner-pet-compatibility \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"owner\": { \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }, \"pet\": { \"date\": \"2020-06-15\", \"time\": \"12:00:00\", \"timezoneOffset\": 0, \"latitude\": 40, \"longitude\": -74 } }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/pet/owner-pet-compatibility', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"owner\": {\n      \"date\": \"1990-05-15\",\n      \"time\": \"15:30:00\",\n      \"timezone\": \"Europe/Kyiv\",\n      \"latitude\": 50.45,\n      \"longitude\": 30.52\n    },\n    \"pet\": {\n      \"date\": \"2020-06-15\",\n      \"time\": \"12:00:00\",\n      \"timezoneOffset\": 0,\n      \"latitude\": 40,\n      \"longitude\": -74\n    }\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/pet/owner-pet-compatibility',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'owner': {\n        'date': \"1990-05-15\",\n        'time': \"15:30:00\",\n        'timezone': \"Europe/Kyiv\",\n        'latitude': 50.45,\n        'longitude': 30.52\n      },\n      'pet': {\n        'date': \"2020-06-15\",\n        'time': \"12:00:00\",\n        'timezoneOffset': 0,\n        'latitude': 40,\n        'longitude': -74\n      }\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('pet/owner-pet-compatibility', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'owner' => [\n            'date' => '1990-05-15',\n            'time' => '15:30:00',\n            'timezone' => 'Europe/Kyiv',\n            'latitude' => 50.45,\n            'longitude' => 30.52,\n        ],\n        'pet' => [\n            'date' => '2020-06-15',\n            'time' => '12:00:00',\n            'timezoneOffset' => 0,\n            'latitude' => 40,\n            'longitude' => -74,\n        ],\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"compatibility":{"type":"object","properties":{"score":{"type":"number","nullable":true},"category":{"type":"string","nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"compatibility":{"score":65,"category":"good"}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/business/founder-personality":{"post":{"tags":["Business Astrology"],"summary":"Founder Personality","description":"Founder type + strengths/weaknesses + ideal industry.","operationId":"business_founder-personality","x-quality":"yellow","x-source":"Founding-chart electional method per Charles E. O. Carter \"An Encyclopaedia of Psychological Astrology\" 1924 + Robert Hand \"Horoscope Symbols\" 1981.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BusinessBusinessInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/business/founder-personality \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/business/founder-personality', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/business/founder-personality',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('business/founder-personality', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"sunSign":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"profile":{"type":"object","properties":{"type":{"type":"string","nullable":true},"strengths":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"weaknesses":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"idealIndustry":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}},"nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"sunSign":"Taurus","element":"Earth","profile":{"type":"Steady builder","strengths":["Reliability"],"weaknesses":["Stubbornness"],"idealIndustry":["Finance"]},"disclaimer":"Business astrology is for strategic ideation only: not legal, tax, or investment advice."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/business/leadership-style":{"post":{"tags":["Business Astrology"],"summary":"Leadership Style","description":"Concise leadership archetype + key strengths.","operationId":"business_leadership-style","x-quality":"yellow","x-source":"Founding-chart electional method per Charles E. O. Carter \"An Encyclopaedia of Psychological Astrology\" 1924 + Robert Hand \"Horoscope Symbols\" 1981.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BusinessBusinessInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/business/leadership-style \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/business/leadership-style', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/business/leadership-style',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('business/leadership-style', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"sunSign":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"leadership":{"type":"string","nullable":true},"strengths":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"sunSign":"Taurus","element":"Earth","leadership":"Steady builder","strengths":["Reliability"],"disclaimer":"Business astrology is for strategic ideation only: not legal, tax, or investment advice."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/business/ideal-industry":{"post":{"tags":["Business Astrology"],"summary":"Ideal Industries","description":"Industries best suited to this founder profile.","operationId":"business_ideal-industry","x-quality":"yellow","x-source":"Founding-chart electional method per Charles E. O. Carter \"An Encyclopaedia of Psychological Astrology\" 1924 + Robert Hand \"Horoscope Symbols\" 1981.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BusinessBusinessInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/business/ideal-industry \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/business/ideal-industry', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/business/ideal-industry',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('business/ideal-industry', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"sunSign":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"industries":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"sunSign":"Taurus","element":"Earth","industries":["Finance"],"disclaimer":"Business astrology is for strategic ideation only: not legal, tax, or investment advice."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/business/founding-chart":{"post":{"tags":["Business Astrology"],"summary":"Founding-Day Chart","description":"Treat the proposed founding date as a chart; returns sun/moon/ASC + theme.","operationId":"business_founding-chart","x-quality":"yellow","x-source":"Founding-chart electional method per Charles E. O. Carter \"An Encyclopaedia of Psychological Astrology\" 1924 + Robert Hand \"Horoscope Symbols\" 1981.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BusinessBusinessInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/business/founding-chart \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/business/founding-chart', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/business/founding-chart',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('business/founding-chart', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"sunSign":{"type":"string","nullable":true},"moonSign":{"type":"string","nullable":true},"ascendant":{"type":"string","nullable":true},"foundingTheme":{"type":"object","properties":{"theme":{"type":"string","nullable":true},"bestFor":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}},"nullable":true},"planets":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","nullable":true},"sign":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"sunSign":"Taurus","moonSign":"Capricorn","ascendant":"Virgo","foundingTheme":{"theme":"Steady value","bestFor":["Banking"]},"planets":[{"name":"Sun","sign":"Taurus"}],"disclaimer":"Business astrology is for strategic ideation only: not legal, tax, or investment advice."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/business/electional-day":{"post":{"tags":["Business Astrology"],"summary":"Electional-Day Suitability","description":"Suitability of a proposed launch date for the venture type.","operationId":"business_electional-day","x-quality":"yellow","x-source":"Founding-chart electional method per Charles E. O. Carter \"An Encyclopaedia of Psychological Astrology\" 1924 + Robert Hand \"Horoscope Symbols\" 1981.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BusinessBusinessInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/business/electional-day \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/business/electional-day', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/business/electional-day',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('business/electional-day', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"proposedDate":{"type":"string","nullable":true},"sunSign":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"suitability":{"type":"object","properties":{"theme":{"type":"string","nullable":true},"bestFor":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}},"nullable":true},"notes":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"proposedDate":"1990-05-15","sunSign":"Taurus","element":"Earth","suitability":{"theme":"Steady value","bestFor":["Banking"]},"notes":["Pair with /v1/horary or /v1/electional for full electional analysis."],"disclaimer":"Business astrology is for strategic ideation only: not legal, tax, or investment advice."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/business/name-suggestions":{"post":{"tags":["Business Astrology"],"summary":"Name Suggestions","description":"Naming hints (syllable structure, palette, semantic field) by sign.","operationId":"business_name-suggestions","x-quality":"yellow","x-source":"Founding-chart electional method per Charles E. O. Carter \"An Encyclopaedia of Psychological Astrology\" 1924 + Robert Hand \"Horoscope Symbols\" 1981.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BusinessBusinessInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/business/name-suggestions \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/business/name-suggestions', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/business/name-suggestions',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('business/name-suggestions', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"sunSign":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"nameHints":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"sunSign":"Taurus","element":"Earth","nameHints":["Earth-toned"],"disclaimer":"Business astrology is for strategic ideation only: not legal, tax, or investment advice."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/business/team-compatibility":{"post":{"tags":["Business Astrology"],"summary":"Team Compatibility","description":"Founder × partner compatibility score.","operationId":"business_team-compatibility","x-quality":"yellow","x-source":"Founding-chart electional method per Charles E. O. Carter \"An Encyclopaedia of Psychological Astrology\" 1924 + Robert Hand \"Horoscope Symbols\" 1981.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamCompatibility"},"example":{"founder":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52},"partner":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/business/team-compatibility \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"founder\": { \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }, \"partner\": { \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 } }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/business/team-compatibility', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"founder\": {\n      \"date\": \"1990-05-15\",\n      \"time\": \"15:30:00\",\n      \"timezone\": \"Europe/Kyiv\",\n      \"latitude\": 50.45,\n      \"longitude\": 30.52\n    },\n    \"partner\": {\n      \"date\": \"1990-05-15\",\n      \"time\": \"15:30:00\",\n      \"timezone\": \"Europe/Kyiv\",\n      \"latitude\": 50.45,\n      \"longitude\": 30.52\n    }\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/business/team-compatibility',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'founder': {\n        'date': \"1990-05-15\",\n        'time': \"15:30:00\",\n        'timezone': \"Europe/Kyiv\",\n        'latitude': 50.45,\n        'longitude': 30.52\n      },\n      'partner': {\n        'date': \"1990-05-15\",\n        'time': \"15:30:00\",\n        'timezone': \"Europe/Kyiv\",\n        'latitude': 50.45,\n        'longitude': 30.52\n      }\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('business/team-compatibility', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'founder' => [\n            'date' => '1990-05-15',\n            'time' => '15:30:00',\n            'timezone' => 'Europe/Kyiv',\n            'latitude' => 50.45,\n            'longitude' => 30.52,\n        ],\n        'partner' => [\n            'date' => '1990-05-15',\n            'time' => '15:30:00',\n            'timezone' => 'Europe/Kyiv',\n            'latitude' => 50.45,\n            'longitude' => 30.52,\n        ],\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"compatibility":{"type":"object","properties":{"score":{"type":"number","nullable":true},"category":{"type":"string","nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"compatibility":{"score":80,"category":"aligned"}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/business/customer-archetype":{"post":{"tags":["Business Astrology"],"summary":"Customer Archetype","description":"Native customer persona that resonates with the founder's sun-sign brand voice.","operationId":"business_customer-archetype","x-quality":"yellow","x-source":"Founding-chart electional method per Charles E. O. Carter \"An Encyclopaedia of Psychological Astrology\" 1924 + Robert Hand \"Horoscope Symbols\" 1981.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BusinessBusinessInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/business/customer-archetype \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/business/customer-archetype', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/business/customer-archetype',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('business/customer-archetype', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"founderSign":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"targetArchetype":{"type":"string","nullable":true},"targetTraits":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"note":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"founderSign":"Taurus","element":"Earth","targetArchetype":"Steady builder","targetTraits":["Reliability"],"note":"Founder's sun-sign archetype indicates the customer persona that natively resonates with their brand voice.","disclaimer":"Business astrology is for strategic ideation only: not legal, tax, or investment advice."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/business/marketing-style":{"post":{"tags":["Business Astrology"],"summary":"Marketing Style","description":"Element-based marketing voice and campaign style.","operationId":"business_marketing-style","x-quality":"yellow","x-source":"Founding-chart electional method per Charles E. O. Carter \"An Encyclopaedia of Psychological Astrology\" 1924 + Robert Hand \"Horoscope Symbols\" 1981.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BusinessBusinessInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/business/marketing-style \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/business/marketing-style', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/business/marketing-style',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('business/marketing-style', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"style":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"style":"..."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/business/risk-profile":{"post":{"tags":["Business Astrology"],"summary":"Risk Profile","description":"Element-based risk tolerance + recommended safeguards.","operationId":"business_risk-profile","x-quality":"yellow","x-source":"Founding-chart electional method per Charles E. O. Carter \"An Encyclopaedia of Psychological Astrology\" 1924 + Robert Hand \"Horoscope Symbols\" 1981.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BusinessBusinessInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/business/risk-profile \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/business/risk-profile', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/business/risk-profile',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('business/risk-profile', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"riskProfile":{"type":"object","properties":{"tolerance":{"type":"string","nullable":true},"recommendation":{"type":"string","nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"riskProfile":{"tolerance":"...","recommendation":"..."}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/business/ideal-partner-sign":{"post":{"tags":["Business Astrology"],"summary":"Ideal Partner Signs","description":"Trine elemental partners with natural synergy.","operationId":"business_ideal-partner-sign","x-quality":"yellow","x-source":"Founding-chart electional method per Charles E. O. Carter \"An Encyclopaedia of Psychological Astrology\" 1924 + Robert Hand \"Horoscope Symbols\" 1981.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BusinessBusinessInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/business/ideal-partner-sign \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/business/ideal-partner-sign', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/business/ideal-partner-sign',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('business/ideal-partner-sign', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"idealPartnerSigns":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"idealPartnerSigns":["Virgo","Capricorn"]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/business/expansion-timing":{"post":{"tags":["Business Astrology"],"summary":"Expansion Timing","description":"High-level expansion guidance; pair with /transits for actual windows.","operationId":"business_expansion-timing","x-quality":"yellow","x-source":"Founding-chart electional method per Charles E. O. Carter \"An Encyclopaedia of Psychological Astrology\" 1924 + Robert Hand \"Horoscope Symbols\" 1981.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BusinessBusinessInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/business/expansion-timing \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/business/expansion-timing', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/business/expansion-timing',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('business/expansion-timing', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"sunSign":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"note":{"type":"string","nullable":true},"generalGuidance":{"type":"object","properties":{"theme":{"type":"string","nullable":true},"bestFor":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}},"nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"sunSign":"Taurus","element":"Earth","note":"For specific timing windows pair with /v1/transits, /v1/solar-return, /v1/jupiter-return.","generalGuidance":{"theme":"Steady value","bestFor":["Banking"]},"disclaimer":"Business astrology is for strategic ideation only: not legal, tax, or investment advice."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/financial/investor-archetype":{"post":{"tags":["Financial Astrology"],"summary":"Investor Archetype","description":"Investor type + bias + strength + pitfall by sign.","operationId":"financial_investor-archetype","x-quality":"yellow","x-source":"Mundane astrology applied to markets per Norman Lansdale, McWhirter \"Astrology Theory of Stock Market Forecasting\" 1937. STRONG legal disclaimer.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinancialFinancialInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/financial/investor-archetype \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/financial/investor-archetype', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/financial/investor-archetype',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('financial/investor-archetype', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"archetype":{"type":"object","properties":{"investorType":{"type":"string","nullable":true},"bias":{"type":"string","nullable":true},"strength":{"type":"string","nullable":true},"pitfall":{"type":"string","nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"archetype":{"investorType":"...","bias":"...","strength":"...","pitfall":"..."}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/financial/risk-tolerance":{"post":{"tags":["Financial Astrology"],"summary":"Risk Tolerance","description":"Element-based risk tolerance + suggested allocation buckets.","operationId":"financial_risk-tolerance","x-quality":"yellow","x-source":"Mundane astrology applied to markets per Norman Lansdale, McWhirter \"Astrology Theory of Stock Market Forecasting\" 1937. STRONG legal disclaimer.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinancialFinancialInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/financial/risk-tolerance \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/financial/risk-tolerance', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/financial/risk-tolerance',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('financial/risk-tolerance', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"riskTolerance":{"type":"object","properties":{"level":{"type":"string","nullable":true},"allocation":{"type":"string","nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"riskTolerance":{"level":"Low","allocation":"60-70% equities..."}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/financial/spending-style":{"post":{"tags":["Financial Astrology"],"summary":"Spending Style","description":"Sign-specific spending pattern.","operationId":"financial_spending-style","x-quality":"yellow","x-source":"Mundane astrology applied to markets per Norman Lansdale, McWhirter \"Astrology Theory of Stock Market Forecasting\" 1937. STRONG legal disclaimer.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinancialFinancialInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/financial/spending-style \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/financial/spending-style', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/financial/spending-style',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('financial/spending-style', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"spendingStyle":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"spendingStyle":"..."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/financial/savings-tips":{"post":{"tags":["Financial Astrology"],"summary":"Savings Tips","description":"Element-based saving recommendations.","operationId":"financial_savings-tips","x-quality":"yellow","x-source":"Mundane astrology applied to markets per Norman Lansdale, McWhirter \"Astrology Theory of Stock Market Forecasting\" 1937. STRONG legal disclaimer.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinancialFinancialInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/financial/savings-tips \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/financial/savings-tips', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/financial/savings-tips',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('financial/savings-tips', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"sunSign":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"savingsTips":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"sunSign":"Taurus","element":"Earth","savingsTips":["You're a natural: focus on growth not just preservation"],"disclaimer":"⚠️ NOT INVESTMENT ADVICE. Financial astrology is entertainment / heuristic only. Consult a licensed financial advisor before any trading or investment decision."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/financial/career-money-style":{"post":{"tags":["Financial Astrology"],"summary":"Career Money Style","description":"Income / earning archetype by sign.","operationId":"financial_career-money-style","x-quality":"yellow","x-source":"Mundane astrology applied to markets per Norman Lansdale, McWhirter \"Astrology Theory of Stock Market Forecasting\" 1937. STRONG legal disclaimer.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinancialFinancialInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/financial/career-money-style \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/financial/career-money-style', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/financial/career-money-style',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('financial/career-money-style', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"careerMoneyStyle":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"careerMoneyStyle":"..."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/financial/wealth-house":{"post":{"tags":["Financial Astrology"],"summary":"2nd & 8th House","description":"Personal money (2nd) and shared resources (8th) house cusps + signs.","operationId":"financial_wealth-house","x-quality":"yellow","x-source":"Mundane astrology applied to markets per Norman Lansdale, McWhirter \"Astrology Theory of Stock Market Forecasting\" 1937. STRONG legal disclaimer.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinancialFinancialInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/financial/wealth-house \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/financial/wealth-house', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/financial/wealth-house',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('financial/wealth-house', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"house2":{"type":"object","properties":{"cusp":{"type":"number","nullable":true},"sign":{"type":"string","nullable":true},"theme":{"type":"string","nullable":true}},"nullable":true},"house8":{"type":"object","properties":{"cusp":{"type":"number","nullable":true},"sign":{"type":"string","nullable":true},"theme":{"type":"string","nullable":true}},"nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"house2":{"cusp":192.86501417031306,"sign":"Libra","theme":"Personal earnings, possessions, self-worth"},"house8":{"cusp":12.865014170313088,"sign":"Aries","theme":"Shared resources, inheritance, debt, transformation"},"disclaimer":"⚠️ NOT INVESTMENT ADVICE. Financial astrology is entertainment / heuristic only. Consult a licensed financial advisor before any trading or investment decision."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/financial/lucky-numbers":{"post":{"tags":["Financial Astrology"],"summary":"Lucky Numbers","description":"Gematria-style number set per sign.","operationId":"financial_lucky-numbers","x-quality":"yellow","x-source":"Mundane astrology applied to markets per Norman Lansdale, McWhirter \"Astrology Theory of Stock Market Forecasting\" 1937. STRONG legal disclaimer.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinancialFinancialInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/financial/lucky-numbers \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/financial/lucky-numbers', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/financial/lucky-numbers',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('financial/lucky-numbers', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"luckyNumbers":{"type":"array","items":{"type":"number","nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"luckyNumbers":[2,6,11]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/financial/lucky-day":{"post":{"tags":["Financial Astrology"],"summary":"Lucky Day of Week","description":"Days traditionally aligned with the sign.","operationId":"financial_lucky-day","x-quality":"yellow","x-source":"Mundane astrology applied to markets per Norman Lansdale, McWhirter \"Astrology Theory of Stock Market Forecasting\" 1937. STRONG legal disclaimer.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinancialFinancialInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/financial/lucky-day \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/financial/lucky-day', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/financial/lucky-day',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('financial/lucky-day', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"luckyDays":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"luckyDays":["Friday"]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/financial/market-timing":{"post":{"tags":["Financial Astrology"],"summary":"Market-Timing Caution Windows","description":"Generic caution windows (Mercury Rx, eclipses, Mars Rx, major macro aspects).","operationId":"financial_market-timing","x-quality":"yellow","x-source":"Mundane astrology applied to markets per Norman Lansdale, McWhirter \"Astrology Theory of Stock Market Forecasting\" 1937. STRONG legal disclaimer.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinancialDate"},"example":{"date":"2026-05-07"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/financial/market-timing \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"2026-05-07\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/financial/market-timing', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"2026-05-07\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/financial/market-timing',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"2026-05-07\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('financial/market-timing', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '2026-05-07',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"date":{"type":"string","nullable":true},"note":{"type":"string","nullable":true},"cautionWindows":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"date":"2026-05-07","note":"Pair with /v1/retrograde, /v1/eclipses, /v1/ingresses, /v1/lunar-calendar for actual transit windows. Mercury retrograde, Mars retrograde, eclipses, and major ingresses are commonly cited as caution windows in financial astrology.","cautionWindows":["Mercury retrograde (~3 weeks × 3 / yr): communication / contract risks"],"disclaimer":"⚠️ NOT INVESTMENT ADVICE. Financial astrology is entertainment / heuristic only. Consult a licensed financial advisor before any trading or investment decision."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/financial/wealth-cycle":{"post":{"tags":["Financial Astrology"],"summary":"Wealth Cycle (long)","description":"Long-cycle archetype tied to Jupiter (~12y) and Saturn (~29y) returns.","operationId":"financial_wealth-cycle","x-quality":"yellow","x-source":"Mundane astrology applied to markets per Norman Lansdale, McWhirter \"Astrology Theory of Stock Market Forecasting\" 1937. STRONG legal disclaimer.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinancialFinancialInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/financial/wealth-cycle \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/financial/wealth-cycle', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/financial/wealth-cycle',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('financial/wealth-cycle', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"sunSign":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"note":{"type":"string","nullable":true},"archetype":{"type":"object","properties":{"investorType":{"type":"string","nullable":true},"bias":{"type":"string","nullable":true},"strength":{"type":"string","nullable":true},"pitfall":{"type":"string","nullable":true}},"nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"sunSign":"Taurus","element":"Earth","note":"Long-term wealth cycles tied to Jupiter (~12 yr expansion) and Saturn (~29 yr restructuring) returns. Pair with /v1/jupiter-return and /v1/saturn-return for personal timing.","archetype":{"investorType":"Value / dividend","bias":"Conservative, hold-long","strength":"Patience for compounding","pitfall":"Slow to cut losers"},"disclaimer":"⚠️ NOT INVESTMENT ADVICE. Financial astrology is entertainment / heuristic only. Consult a licensed financial advisor before any trading or investment decision."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/bazi/year-pillar":{"post":{"tags":["BaZi (Four Pillars)"],"summary":"Year Pillar","description":"Year stem + branch + animal + element with yin/yang.","operationId":"bazi_year-pillar","x-quality":"green","x-source":"60-jiazi cycle (canonical) + L. Skinner *Living Earth Manual* + canonical 60-jiazi day count. Day pillar anchored to 1990-01-01 = Bing-Yin (index 2), checkable against any published date. Hour pillar via 五鼠遁 (Five-Rats-Escape) day-stem→hour-stem table.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaziDateInput"},"example":{"date":"1990-06-15"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/bazi/year-pillar \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-06-15\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/bazi/year-pillar', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-06-15\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/bazi/year-pillar',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-06-15\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('bazi/year-pillar', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-06-15',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"yearPillar":{"type":"object","properties":{"stem":{"type":"string","nullable":true},"branch":{"type":"string","nullable":true},"pillar":{"type":"string","nullable":true},"animal":{"type":"string","nullable":true},"stemElement":{"type":"string","nullable":true},"branchElement":{"type":"string","nullable":true},"yin":{"type":"boolean","nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"yearPillar":{"stem":"Geng","branch":"Wu","pillar":"Geng-Wu","animal":"Horse","stemElement":"Metal","branchElement":"Fire","yin":false}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/bazi/month-pillar":{"post":{"tags":["BaZi (Four Pillars)"],"summary":"Month Pillar","description":"Month stem + branch from solar-term boundaries.","operationId":"bazi_month-pillar","x-quality":"green","x-source":"60-jiazi cycle (canonical) + L. Skinner *Living Earth Manual* + canonical 60-jiazi day count. Day pillar anchored to 1990-01-01 = Bing-Yin (index 2), checkable against any published date. Hour pillar via 五鼠遁 (Five-Rats-Escape) day-stem→hour-stem table.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaziDateInput"},"example":{"date":"1990-06-15"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/bazi/month-pillar \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-06-15\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/bazi/month-pillar', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-06-15\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/bazi/month-pillar',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-06-15\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('bazi/month-pillar', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-06-15',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"monthPillar":{"type":"object","properties":{"stem":{"type":"string","nullable":true},"branch":{"type":"string","nullable":true},"pillar":{"type":"string","nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"monthPillar":{"stem":"Ren","branch":"Wu","pillar":"Ren-Wu"}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/bazi/four-pillars":{"post":{"tags":["BaZi (Four Pillars)"],"summary":"Four Pillars (full)","description":"All four pillars: year, month, day, hour. Day pillar uses the canonical 60-jiazi cycle (anchor 1990-01-01 = Bing-Yin). Pass `time` to compute the hour pillar; day and hour roll at 23:00 local, year and month at the exact Lichun and 節 instants.","operationId":"bazi_four-pillars","x-quality":"green","x-source":"60-jiazi cycle (canonical) + L. Skinner *Living Earth Manual* + canonical 60-jiazi day count. Day pillar anchored to 1990-01-01 = Bing-Yin (index 2), checkable against any published date. Hour pillar via 五鼠遁 (Five-Rats-Escape) day-stem→hour-stem table.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaziFourPillarsInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/bazi/four-pillars \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/bazi/four-pillars', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/bazi/four-pillars',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('bazi/four-pillars', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"solarYear":{"type":"number","nullable":true},"yearPillar":{"type":"object","properties":{"stem":{"type":"string","nullable":true},"branch":{"type":"string","nullable":true},"pillar":{"type":"string","nullable":true},"animal":{"type":"string","nullable":true},"stemElement":{"type":"string","nullable":true},"branchElement":{"type":"string","nullable":true}},"nullable":true},"monthPillar":{"type":"object","properties":{"stem":{"type":"string","nullable":true},"branch":{"type":"string","nullable":true},"pillar":{"type":"string","nullable":true},"animal":{"type":"string","nullable":true},"stemElement":{"type":"string","nullable":true},"branchElement":{"type":"string","nullable":true}},"nullable":true},"dayPillar":{"type":"object","properties":{"stem":{"type":"string","nullable":true},"branch":{"type":"string","nullable":true},"pillar":{"type":"string","nullable":true},"animal":{"type":"string","nullable":true},"stemElement":{"type":"string","nullable":true},"branchElement":{"type":"string","nullable":true},"yin":{"type":"boolean","nullable":true}},"nullable":true},"hourPillar":{"type":"object","properties":{"stem":{"type":"string","nullable":true},"branch":{"type":"string","nullable":true},"pillar":{"type":"string","nullable":true},"animal":{"type":"string","nullable":true},"stemElement":{"type":"string","nullable":true},"branchElement":{"type":"string","nullable":true},"yin":{"type":"boolean","nullable":true}},"nullable":true},"notes":{"type":"array","items":{},"nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"solarYear":1990,"yearPillar":{"stem":"Geng","branch":"Wu","pillar":"Geng-Wu","animal":"Horse","stemElement":"Metal","branchElement":"Fire"},"monthPillar":{"stem":"Xin","branch":"Si","pillar":"Xin-Si","animal":"Snake","stemElement":"Metal","branchElement":"Fire"},"dayPillar":{"stem":"Geng","branch":"Chen","pillar":"Geng-Chen","animal":"Dragon","stemElement":"Metal","branchElement":"Earth","yin":false},"hourPillar":{"stem":"Jia","branch":"Shen","pillar":"Jia-Shen","animal":"Monkey","stemElement":"Wood","branchElement":"Metal","yin":false},"notes":[],"disclaimer":"BaZi pillars use the canonical 60-jiazi cycle, anchored at 1990-01-01 = Bing-Yin. Year and month boundaries are the exact Lichun and 節 instants from the ephemeris, stated in China Standard Time; pass time and timezoneOffset for births near a boundary. Day and hour follow the birthplace clock, with the day rolling at 23:00 local."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/bazi/chart":{"post":{"tags":["BaZi (Four Pillars)"],"summary":"Full BaZi chart","description":"The four pillars with everything the classical apparatus reads off them in one call: hidden stems, na yin, the twelve stages of the day master, element balance over all eight characters, the strength verdict, symbolic stars from both reference pillars, and the branch and stem interactions. Localised by language. Pass longitude with trueSolarTime true to cut the double-hour from the sun over the birth place; the correction reaches the day and hour only, never the year and month, which turn on world instants.","operationId":"bazi_chart","x-quality":"green","x-source":"60-jiazi cycle (canonical) + L. Skinner *Living Earth Manual* + canonical 60-jiazi day count. Day pillar anchored to 1990-01-01 = Bing-Yin (index 2), checkable against any published date. Hour pillar via 五鼠遁 (Five-Rats-Escape) day-stem→hour-stem table.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaziChartInput"},"example":{"date":"1990-05-15","time":"14:30:00","timezoneOffset":8}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/bazi/chart \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"14:30:00\", \"timezoneOffset\": 8 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/bazi/chart', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"14:30:00\",\n    \"timezoneOffset\": 8\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/bazi/chart',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"14:30:00\",\n      'timezoneOffset': 8\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('bazi/chart', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '14:30:00',\n        'timezoneOffset' => 8,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"solarYear":{"type":"number","nullable":true},"pillars":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","nullable":true},"stem":{"type":"string","nullable":true},"branch":{"type":"string","nullable":true},"pillar":{"type":"string","nullable":true},"animal":{"type":"string","nullable":true},"animalName":{"type":"string","nullable":true},"stemElement":{"type":"string","nullable":true},"stemElementName":{"type":"string","nullable":true},"hiddenStems":{"type":"array","items":{"type":"object","properties":{"stem":{"type":"string","nullable":true},"stemIndex":{"type":"number","nullable":true},"element":{"type":"string","nullable":true},"yin":{"type":"boolean","nullable":true},"role":{"type":"string","nullable":true},"weight":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"naYin":{"type":"object","properties":{"chinese":{"type":"string","nullable":true},"pinyin":{"type":"string","nullable":true},"english":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"jiaziIndex":{"type":"number","nullable":true},"elementName":{"type":"string","nullable":true}},"nullable":true},"dayMasterStage":{"type":"object","properties":{"stage":{"type":"string","nullable":true},"chinese":{"type":"string","nullable":true},"name":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"nullable":true},"dayMaster":{"type":"object","properties":{"stem":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"elementName":{"type":"string","nullable":true},"polarity":{"type":"string","nullable":true}},"nullable":true},"elementBalance":{"type":"object","properties":{"visible":{"type":"object","properties":{"Wood":{"type":"number","nullable":true},"Fire":{"type":"number","nullable":true},"Earth":{"type":"number","nullable":true},"Metal":{"type":"number","nullable":true},"Water":{"type":"number","nullable":true}},"nullable":true},"withHiddenStems":{"type":"object","properties":{"Wood":{"type":"number","nullable":true},"Fire":{"type":"number","nullable":true},"Earth":{"type":"number","nullable":true},"Metal":{"type":"number","nullable":true},"Water":{"type":"number","nullable":true}},"nullable":true},"weighted":{"type":"object","properties":{"Wood":{"type":"number","nullable":true},"Fire":{"type":"number","nullable":true},"Earth":{"type":"number","nullable":true},"Metal":{"type":"number","nullable":true},"Water":{"type":"number","nullable":true}},"nullable":true},"dominantElement":{"type":"string","nullable":true},"missingElements":{"type":"array","items":{},"nullable":true},"weighting":{"type":"string","nullable":true},"dominantElementName":{"type":"string","nullable":true},"missingElementNames":{"type":"array","items":{},"nullable":true}},"nullable":true},"strength":{"type":"object","properties":{"framework":{"type":"string","nullable":true},"supportScore":{"type":"number","nullable":true},"drainScore":{"type":"number","nullable":true},"supportRatio":{"type":"number","nullable":true},"verdict":{"type":"string","nullable":true},"hasSeason":{"type":"boolean","nullable":true},"hasRoot":{"type":"boolean","nullable":true},"hasAllies":{"type":"boolean","nullable":true},"favourableElements":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"unfavourableElements":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"caveat":{"type":"string","nullable":true}},"nullable":true},"symbolicStars":{"type":"object","properties":{"byYearPillar":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string","nullable":true},"chinese":{"type":"string","nullable":true},"pinyin":{"type":"string","nullable":true},"english":{"type":"string","nullable":true},"pillars":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true},"schoolNote":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"byDayPillar":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string","nullable":true},"chinese":{"type":"string","nullable":true},"pinyin":{"type":"string","nullable":true},"english":{"type":"string","nullable":true},"pillars":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"nullable":true}},"nullable":true},"interactions":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","nullable":true},"chinese":{"type":"string","nullable":true},"english":{"type":"string","nullable":true},"pillars":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"members":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"producesElement":{"type":"string","nullable":true},"schoolNote":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"stageSchool":{"type":"string","nullable":true},"language":{"type":"string","nullable":true},"notes":{"type":"array","items":{},"nullable":true},"methodology":{"type":"string","nullable":true},"source":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"solarYear":1990,"pillars":[{"name":"year","stem":"Geng","branch":"Wu","pillar":"Geng-Wu","animal":"Horse","animalName":"Кінь","stemElement":"Metal","stemElementName":"Метал","hiddenStems":[{"stem":"Ding","stemIndex":3,"element":"Fire","yin":true,"role":"principal","weight":0.7},{"stem":"Ji","stemIndex":5,"element":"Earth","yin":true,"role":"middle","weight":0.3}],"naYin":{"chinese":"路旁土","pinyin":"Lu Pang Tu","english":"Roadside Earth","element":"Earth","jiaziIndex":6,"elementName":"Земля"},"dayMasterStage":{"stage":"bath","chinese":"沐浴","name":"Обмивання"}},{"name":"month","stem":"Xin","branch":"Si","pillar":"Xin-Si","animal":"Snake","animalName":"Змія","stemElement":"Metal","stemElementName":"Метал","hiddenStems":[{"stem":"Bing","stemIndex":2,"element":"Fire","yin":false,"role":"principal","weight":0.6},{"stem":"Geng","stemIndex":6,"element":"Metal","yin":false,"role":"middle","weight":0.3},{"stem":"Wu","stemIndex":4,"element":"Earth","yin":false,"role":"residual","weight":0.1}],"naYin":{"chinese":"白蠟金","pinyin":"Bai La Jin","english":"White Wax Metal","element":"Metal","jiaziIndex":17,"elementName":"Метал"},"dayMasterStage":{"stage":"growth","chinese":"長生","name":"Зростання"}},{"name":"day","stem":"Geng","branch":"Chen","pillar":"Geng-Chen","animal":"Dragon","animalName":"Дракон","stemElement":"Metal","stemElementName":"Метал","hiddenStems":[{"stem":"Wu","stemIndex":4,"element":"Earth","yin":false,"role":"principal","weight":0.6},{"stem":"Yi","stemIndex":1,"element":"Wood","yin":true,"role":"residual","weight":0.3},{"stem":"Gui","stemIndex":9,"element":"Water","yin":true,"role":"middle","weight":0.1}],"naYin":{"chinese":"白蠟金","pinyin":"Bai La Jin","english":"White Wax Metal","element":"Metal","jiaziIndex":16,"elementName":"Метал"},"dayMasterStage":{"stage":"nurture","chinese":"養","name":"Виношування"}},{"name":"hour","stem":"Gui","branch":"Wei","pillar":"Gui-Wei","animal":"Goat","animalName":"Коза","stemElement":"Water","stemElementName":"Вода","hiddenStems":[{"stem":"Ji","stemIndex":5,"element":"Earth","yin":true,"role":"principal","weight":0.6},{"stem":"Ding","stemIndex":3,"element":"Fire","yin":true,"role":"residual","weight":0.3},{"stem":"Yi","stemIndex":1,"element":"Wood","yin":true,"role":"middle","weight":0.1}],"naYin":{"chinese":"楊柳木","pinyin":"Yang Liu Mu","english":"Willow Wood","element":"Wood","jiaziIndex":19,"elementName":"Дерево"},"dayMasterStage":{"stage":"cap","chinese":"冠帶","name":"Повноліття"}}],"dayMaster":{"stem":"Geng","element":"Metal","elementName":"Метал","polarity":"Ян"},"elementBalance":{"visible":{"Wood":0,"Fire":2,"Earth":2,"Metal":3,"Water":1},"withHiddenStems":{"Wood":2,"Fire":3,"Earth":4,"Metal":4,"Water":2},"weighted":{"Wood":0.4,"Fire":1.6,"Earth":1.6,"Metal":3.3,"Water":1.1},"dominantElement":"Metal","missingElements":[],"weighting":"Each branch contributes one character split among the stems it shelters: 1.0 alone, 0.7/0.3 for two, 0.6/0.3/0.1 for three (本气/中气/余气). The membership is canonical; the split is a stated convention, and the day-count 人元司令 scheme distributes the same characters differently.","dominantElementName":"Метал","missingElementNames":[]},"strength":{"framework":"扶抑 support-and-suppress","supportScore":3.9,"drainScore":3.1,"supportRatio":0.557,"verdict":"strong","hasSeason":false,"hasRoot":true,"hasAllies":true,"favourableElements":["Water","Wood","Fire"],"unfavourableElements":["Earth","Metal"],"caveat":"One framework of several, and the thresholds are ours. 扶抑 weighs support against drain; 調候, 通關, 病藥 and 專旺 read the same chart by other rules and can reach the opposite verdict, and a chart near the boundary is exactly where they part. Two limits worth stating plainly: the ratio counts the month branch exactly like the other three, where the tradition weighs the month above all, and the 0.55 / 0.45 cut points are a convention of this API rather than a canonical rule. The three classical criteria are reported unweighted beside the ratio, so a reader who weighs the month can reach their own verdict from the same inputs."},"symbolicStars":{"byYearPillar":[{"key":"nobleman","chinese":"天乙貴人","pinyin":"Tian Yi Gui Ren","english":"Heavenly Nobleman","pillars":["hour"],"meaning":"help arriving from outside, the patron and the timely intervention","schoolNote":"The 三命通會 reading for 庚 (甲戊庚牛羊). 淵海子平 puts the 庚 nobleman at 午 and 寅 instead; that reading is reported separately."},{"key":"noblemanAlt","chinese":"天乙貴人","pinyin":"Tian Yi Gui Ren","english":"Heavenly Nobleman (淵海子平 reading)","pillars":["year"],"meaning":"help arriving from outside, the patron and the timely intervention","schoolNote":"The 淵海子平 and 星平會海 reading for 庚 (庚辛逢馬虎). The 三命通會 reading is reported under `nobleman`."}],"byDayPillar":[{"key":"canopy","chinese":"華蓋","pinyin":"Hua Gai","english":"Canopy","pillars":["day"],"meaning":"solitude and study, the scholar and the recluse"},{"key":"nobleman","chinese":"天乙貴人","pinyin":"Tian Yi Gui Ren","english":"Heavenly Nobleman","pillars":["hour"],"meaning":"help arriving from outside, the patron and the timely intervention","schoolNote":"The 三命通會 reading for 庚 (甲戊庚牛羊). 淵海子平 puts the 庚 nobleman at 午 and 寅 instead; that reading is reported separately."},{"key":"noblemanAlt","chinese":"天乙貴人","pinyin":"Tian Yi Gui Ren","english":"Heavenly Nobleman (淵海子平 reading)","pillars":["year"],"meaning":"help arriving from outside, the patron and the timely intervention","schoolNote":"The 淵海子平 and 星平會海 reading for 庚 (庚辛逢馬虎). The 三命通會 reading is reported under `nobleman`."}]},"interactions":[{"type":"sixHarmony","chinese":"六合","english":"Six Harmony","pillars":["year","hour"],"members":["Wu","Wei"],"producesElement":"Earth","schoolNote":"The Wu-Wei harmony is given as Earth here; other transmissions read it as the sun-and-moon pair and assign no element."}],"stageSchool":"classical","language":"uk","notes":[],"methodology":"The four pillars with everything the classical apparatus reads off them: hidden stems, na yin, the twelve stages of the day master, the element balance over all eight characters, the 扶抑 strength verdict, the symbolic stars from both reference pillars, and the branch and stem interactions. Where a transmission splits, both readings ship and the split is named at the field.","source":"淵海子平, 三命通會, 子平真詮: all public domain","disclaimer":"BaZi pillars use the canonical 60-jiazi cycle, anchored at 1990-01-01 = Bing-Yin. Year and month boundaries are the exact Lichun and 節 instants from the ephemeris, stated in China Standard Time; pass time and timezoneOffset for births near a boundary. Day and hour follow the birthplace clock, with the day rolling at 23:00 local."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/bazi/hidden-stems":{"post":{"tags":["BaZi (Four Pillars)"],"summary":"Hidden stems (Cang Gan)","description":"The one to three stems each branch shelters, with role and weight. This is where most of a chart's elements live: a chart with no visible Water can still be soaked in it. On the four storage branches the middle role belongs to the stored element, not to the second in the list.","operationId":"bazi_hidden-stems","x-quality":"green","x-source":"60-jiazi cycle (canonical) + L. Skinner *Living Earth Manual* + canonical 60-jiazi day count. Day pillar anchored to 1990-01-01 = Bing-Yin (index 2), checkable against any published date. Hour pillar via 五鼠遁 (Five-Rats-Escape) day-stem→hour-stem table.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaziChartInput"},"example":{"date":"1990-05-15","time":"14:30:00","timezoneOffset":8}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/bazi/hidden-stems \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"14:30:00\", \"timezoneOffset\": 8 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/bazi/hidden-stems', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"14:30:00\",\n    \"timezoneOffset\": 8\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/bazi/hidden-stems',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"14:30:00\",\n      'timezoneOffset': 8\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('bazi/hidden-stems', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '14:30:00',\n        'timezoneOffset' => 8,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"solarYear":{"type":"number","nullable":true},"pillars":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","nullable":true},"stem":{"type":"string","nullable":true},"branch":{"type":"string","nullable":true},"pillar":{"type":"string","nullable":true},"hiddenStems":{"type":"array","items":{"type":"object","properties":{"stem":{"type":"string","nullable":true},"stemIndex":{"type":"number","nullable":true},"element":{"type":"string","nullable":true},"yin":{"type":"boolean","nullable":true},"role":{"type":"string","nullable":true},"weight":{"type":"number","nullable":true},"elementName":{"type":"string","nullable":true},"polarity":{"type":"string","nullable":true}},"nullable":true},"nullable":true}},"nullable":true},"nullable":true},"weighting":{"type":"string","nullable":true},"notes":{"type":"array","items":{},"nullable":true},"methodology":{"type":"string","nullable":true},"source":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"solarYear":1990,"pillars":[{"name":"year","stem":"Geng","branch":"Wu","pillar":"Geng-Wu","hiddenStems":[{"stem":"Ding","stemIndex":3,"element":"Fire","yin":true,"role":"principal","weight":0.7,"elementName":"Вогонь","polarity":"Інь"},{"stem":"Ji","stemIndex":5,"element":"Earth","yin":true,"role":"middle","weight":0.3,"elementName":"Земля","polarity":"Інь"}]},{"name":"month","stem":"Xin","branch":"Si","pillar":"Xin-Si","hiddenStems":[{"stem":"Bing","stemIndex":2,"element":"Fire","yin":false,"role":"principal","weight":0.6,"elementName":"Вогонь","polarity":"Ян"},{"stem":"Geng","stemIndex":6,"element":"Metal","yin":false,"role":"middle","weight":0.3,"elementName":"Метал","polarity":"Ян"},{"stem":"Wu","stemIndex":4,"element":"Earth","yin":false,"role":"residual","weight":0.1,"elementName":"Земля","polarity":"Ян"}]},{"name":"day","stem":"Geng","branch":"Chen","pillar":"Geng-Chen","hiddenStems":[{"stem":"Wu","stemIndex":4,"element":"Earth","yin":false,"role":"principal","weight":0.6,"elementName":"Земля","polarity":"Ян"},{"stem":"Yi","stemIndex":1,"element":"Wood","yin":true,"role":"residual","weight":0.3,"elementName":"Дерево","polarity":"Інь"},{"stem":"Gui","stemIndex":9,"element":"Water","yin":true,"role":"middle","weight":0.1,"elementName":"Вода","polarity":"Інь"}]},{"name":"hour","stem":"Gui","branch":"Wei","pillar":"Gui-Wei","hiddenStems":[{"stem":"Ji","stemIndex":5,"element":"Earth","yin":true,"role":"principal","weight":0.6,"elementName":"Земля","polarity":"Інь"},{"stem":"Ding","stemIndex":3,"element":"Fire","yin":true,"role":"residual","weight":0.3,"elementName":"Вогонь","polarity":"Інь"},{"stem":"Yi","stemIndex":1,"element":"Wood","yin":true,"role":"middle","weight":0.1,"elementName":"Дерево","polarity":"Інь"}]}],"weighting":"Each branch contributes one character split among the stems it shelters: 1.0 alone, 0.7/0.3 for two, 0.6/0.3/0.1 for three (本气/中气/余气). The membership is canonical; the split is a stated convention, and the day-count 人元司令 scheme distributes the same characters differently.","notes":[],"methodology":"地支藏干. Each branch shelters one to three stems: 本气 the principal, 中气 the middle, 余气 the residual. A chart with no visible Water can still be soaked in it, which is why an element count over the eight visible characters alone is not a balance.","source":"淵海子平 (Song) + 三命通會 (Wan Minying, Ming), public domain","disclaimer":"BaZi pillars use the canonical 60-jiazi cycle, anchored at 1990-01-01 = Bing-Yin. Year and month boundaries are the exact Lichun and 節 instants from the ephemeris, stated in China Standard Time; pass time and timezoneOffset for births near a boundary. Day and hour follow the birthplace clock, with the day rolling at 23:00 local."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/bazi/na-yin":{"post":{"tags":["BaZi (Four Pillars)"],"summary":"Na Yin sound-element","description":"The sound-element of each pillar. The sixty jiazi collapse into thirty names, two consecutive pillars to a name; the year pillar na yin is what popular readings mean by \"your element\", and it is not the day master.","operationId":"bazi_na-yin","x-quality":"green","x-source":"60-jiazi cycle (canonical) + L. Skinner *Living Earth Manual* + canonical 60-jiazi day count. Day pillar anchored to 1990-01-01 = Bing-Yin (index 2), checkable against any published date. Hour pillar via 五鼠遁 (Five-Rats-Escape) day-stem→hour-stem table.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaziChartInput"},"example":{"date":"1990-05-15","time":"14:30:00","timezoneOffset":8}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/bazi/na-yin \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"14:30:00\", \"timezoneOffset\": 8 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/bazi/na-yin', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"14:30:00\",\n    \"timezoneOffset\": 8\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/bazi/na-yin',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"14:30:00\",\n      'timezoneOffset': 8\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('bazi/na-yin', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '14:30:00',\n        'timezoneOffset' => 8,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"solarYear":{"type":"number","nullable":true},"pillars":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","nullable":true},"stem":{"type":"string","nullable":true},"branch":{"type":"string","nullable":true},"pillar":{"type":"string","nullable":true},"naYin":{"type":"object","properties":{"chinese":{"type":"string","nullable":true},"pinyin":{"type":"string","nullable":true},"english":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"jiaziIndex":{"type":"number","nullable":true},"elementName":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"nullable":true},"notes":{"type":"array","items":{},"nullable":true},"methodology":{"type":"string","nullable":true},"source":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"solarYear":1990,"pillars":[{"name":"year","stem":"Geng","branch":"Wu","pillar":"Geng-Wu","naYin":{"chinese":"路旁土","pinyin":"Lu Pang Tu","english":"Roadside Earth","element":"Earth","jiaziIndex":6,"elementName":"Земля"}},{"name":"month","stem":"Xin","branch":"Si","pillar":"Xin-Si","naYin":{"chinese":"白蠟金","pinyin":"Bai La Jin","english":"White Wax Metal","element":"Metal","jiaziIndex":17,"elementName":"Метал"}},{"name":"day","stem":"Geng","branch":"Chen","pillar":"Geng-Chen","naYin":{"chinese":"白蠟金","pinyin":"Bai La Jin","english":"White Wax Metal","element":"Metal","jiaziIndex":16,"elementName":"Метал"}},{"name":"hour","stem":"Gui","branch":"Wei","pillar":"Gui-Wei","naYin":{"chinese":"楊柳木","pinyin":"Yang Liu Mu","english":"Willow Wood","element":"Wood","jiaziIndex":19,"elementName":"Дерево"}}],"notes":[],"methodology":"六十甲子納音. The sixty pillars collapse into thirty sound-elements, two consecutive pillars to a name. The year pillar's na yin is the one popular readings mean by \"your element\", and it is not the day master.","source":"The standard 納音 table, public domain","disclaimer":"BaZi pillars use the canonical 60-jiazi cycle, anchored at 1990-01-01 = Bing-Yin. Year and month boundaries are the exact Lichun and 節 instants from the ephemeris, stated in China Standard Time; pass time and timezoneOffset for births near a boundary. Day and hour follow the birthplace clock, with the day rolling at 23:00 local."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/bazi/life-stages":{"post":{"tags":["BaZi (Four Pillars)"],"summary":"Twelve life stages","description":"A stem read against each branch as a life cycle, from Chang Sheng through Di Wang to Jue. The day master through the chart; pass includeFullTable for the ten-by-twelve reference table. stageSchool picks the classical yin-reverse rule or the unified one.","operationId":"bazi_life-stages","x-quality":"green","x-source":"60-jiazi cycle (canonical) + L. Skinner *Living Earth Manual* + canonical 60-jiazi day count. Day pillar anchored to 1990-01-01 = Bing-Yin (index 2), checkable against any published date. Hour pillar via 五鼠遁 (Five-Rats-Escape) day-stem→hour-stem table.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaziChartInput"},"example":{"date":"1990-05-15","time":"14:30:00","timezoneOffset":8}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/bazi/life-stages \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"14:30:00\", \"timezoneOffset\": 8 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/bazi/life-stages', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"14:30:00\",\n    \"timezoneOffset\": 8\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/bazi/life-stages',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"14:30:00\",\n      'timezoneOffset': 8\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('bazi/life-stages', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '14:30:00',\n        'timezoneOffset' => 8,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"solarYear":{"type":"number","nullable":true},"school":{"type":"string","nullable":true},"dayMaster":{"type":"object","properties":{"stem":{"type":"string","nullable":true},"element":{"type":"string","nullable":true}},"nullable":true},"dayMasterThroughChart":{"type":"array","items":{"type":"object","properties":{"pillar":{"type":"string","nullable":true},"branch":{"type":"string","nullable":true},"stage":{"type":"string","nullable":true},"chinese":{"type":"string","nullable":true},"name":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"schoolNote":{"type":"string","nullable":true},"notes":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"methodology":{"type":"string","nullable":true},"source":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"solarYear":1990,"school":"classical","dayMaster":{"stem":"Geng","element":"Metal"},"dayMasterThroughChart":[{"pillar":"year","branch":"Wu","stage":"bath","chinese":"沐浴","name":"Обмивання"},{"pillar":"month","branch":"Si","stage":"growth","chinese":"長生","name":"Зростання"},{"pillar":"day","branch":"Chen","stage":"nurture","chinese":"養","name":"Виношування"},{"pillar":"hour","branch":"Wei","stage":"cap","chinese":"冠帶","name":"Повноліття"}],"schoolNote":"Classical 陽順陰逆: yang stems run forward through the cycle, yin stems backward. Pass stageSchool=unified for 陰陽同生同死, where a yin stem runs with its yang partner.","notes":["Pass includeFullTable: true for the whole ten-by-twelve table of every stem in every branch."],"methodology":"十二長生. A stem read against each branch as a life cycle, from 長生 through 帝旺 to 絕 and back through 胎 and 養. The starting branch per stem is settled; the direction for yin stems is not, so both ship.","source":"三命通會 (Wan Minying, Ming), public domain","disclaimer":"BaZi pillars use the canonical 60-jiazi cycle, anchored at 1990-01-01 = Bing-Yin. Year and month boundaries are the exact Lichun and 節 instants from the ephemeris, stated in China Standard Time; pass time and timezoneOffset for births near a boundary. Day and hour follow the birthplace clock, with the day rolling at 23:00 local."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/bazi/symbolic-stars":{"post":{"tags":["BaZi (Four Pillars)"],"summary":"Symbolic stars (Shen Sha)","description":"Peach Blossom, Travelling Horse, Canopy, Heavenly Nobleman, Blade and Void, computed from BOTH the year and the day reference pillar because the transmissions disagree about which one the rules read from. Where two transmissions place a star differently, both placements ship and each names the other.","operationId":"bazi_symbolic-stars","x-quality":"green","x-source":"60-jiazi cycle (canonical) + L. Skinner *Living Earth Manual* + canonical 60-jiazi day count. Day pillar anchored to 1990-01-01 = Bing-Yin (index 2), checkable against any published date. Hour pillar via 五鼠遁 (Five-Rats-Escape) day-stem→hour-stem table.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaziChartInput"},"example":{"date":"1990-05-15","time":"14:30:00","timezoneOffset":8}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/bazi/symbolic-stars \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"14:30:00\", \"timezoneOffset\": 8 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/bazi/symbolic-stars', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"14:30:00\",\n    \"timezoneOffset\": 8\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/bazi/symbolic-stars',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"14:30:00\",\n      'timezoneOffset': 8\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('bazi/symbolic-stars', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '14:30:00',\n        'timezoneOffset' => 8,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"solarYear":{"type":"number","nullable":true},"pillars":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","nullable":true},"stem":{"type":"string","nullable":true},"branch":{"type":"string","nullable":true},"pillar":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"byYearPillar":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string","nullable":true},"chinese":{"type":"string","nullable":true},"pinyin":{"type":"string","nullable":true},"english":{"type":"string","nullable":true},"pillars":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true},"schoolNote":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"byDayPillar":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string","nullable":true},"chinese":{"type":"string","nullable":true},"pinyin":{"type":"string","nullable":true},"english":{"type":"string","nullable":true},"pillars":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"referenceNote":{"type":"string","nullable":true},"notes":{"type":"array","items":{},"nullable":true},"methodology":{"type":"string","nullable":true},"source":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"solarYear":1990,"pillars":[{"name":"year","stem":"Geng","branch":"Wu","pillar":"Geng-Wu"},{"name":"month","stem":"Xin","branch":"Si","pillar":"Xin-Si"},{"name":"day","stem":"Geng","branch":"Chen","pillar":"Geng-Chen"},{"name":"hour","stem":"Gui","branch":"Wei","pillar":"Gui-Wei"}],"byYearPillar":[{"key":"nobleman","chinese":"天乙貴人","pinyin":"Tian Yi Gui Ren","english":"Heavenly Nobleman","pillars":["hour"],"meaning":"help arriving from outside, the patron and the timely intervention","schoolNote":"The 三命通會 reading for 庚 (甲戊庚牛羊). 淵海子平 puts the 庚 nobleman at 午 and 寅 instead; that reading is reported separately."},{"key":"noblemanAlt","chinese":"天乙貴人","pinyin":"Tian Yi Gui Ren","english":"Heavenly Nobleman (淵海子平 reading)","pillars":["year"],"meaning":"help arriving from outside, the patron and the timely intervention","schoolNote":"The 淵海子平 and 星平會海 reading for 庚 (庚辛逢馬虎). The 三命通會 reading is reported under `nobleman`."}],"byDayPillar":[{"key":"canopy","chinese":"華蓋","pinyin":"Hua Gai","english":"Canopy","pillars":["day"],"meaning":"solitude and study, the scholar and the recluse"},{"key":"nobleman","chinese":"天乙貴人","pinyin":"Tian Yi Gui Ren","english":"Heavenly Nobleman","pillars":["hour"],"meaning":"help arriving from outside, the patron and the timely intervention","schoolNote":"The 三命通會 reading for 庚 (甲戊庚牛羊). 淵海子平 puts the 庚 nobleman at 午 and 寅 instead; that reading is reported separately."},{"key":"noblemanAlt","chinese":"天乙貴人","pinyin":"Tian Yi Gui Ren","english":"Heavenly Nobleman (淵海子平 reading)","pillars":["year"],"meaning":"help arriving from outside, the patron and the timely intervention","schoolNote":"The 淵海子平 and 星平會海 reading for 庚 (庚辛逢馬虎). The 三命通會 reading is reported under `nobleman`."}],"referenceNote":"Star rules key off a reference pillar. The older transmission reads from the year, later practice from the day, and the two disagree often enough that picking one silently would be a school choice disguised as a result.","notes":[],"methodology":"神煞. Only the six stars every transmission carries with the same rule are implemented: 桃花, 驛馬, 華蓋, 天乙貴人, 羊刃 and 空亡. The full register runs to hundreds of entries, most of them local to one almanac, and those are deliberately absent rather than guessed.","source":"三命通會 (Wan Minying, Ming), public domain","disclaimer":"BaZi pillars use the canonical 60-jiazi cycle, anchored at 1990-01-01 = Bing-Yin. Year and month boundaries are the exact Lichun and 節 instants from the ephemeris, stated in China Standard Time; pass time and timezoneOffset for births near a boundary. Day and hour follow the birthplace clock, with the day rolling at 23:00 local."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/bazi/interactions":{"post":{"tags":["BaZi (Four Pillars)"],"summary":"Branch and stem interactions","description":"Stem combinations, six harmonies, full and half trines, clashes, harms, punishments and self-punishments present in the chart, with the pillars involved and the element a combination produces.","operationId":"bazi_interactions","x-quality":"green","x-source":"60-jiazi cycle (canonical) + L. Skinner *Living Earth Manual* + canonical 60-jiazi day count. Day pillar anchored to 1990-01-01 = Bing-Yin (index 2), checkable against any published date. Hour pillar via 五鼠遁 (Five-Rats-Escape) day-stem→hour-stem table.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaziChartInput"},"example":{"date":"1990-05-15","time":"14:30:00","timezoneOffset":8}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/bazi/interactions \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"14:30:00\", \"timezoneOffset\": 8 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/bazi/interactions', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"14:30:00\",\n    \"timezoneOffset\": 8\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/bazi/interactions',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"14:30:00\",\n      'timezoneOffset': 8\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('bazi/interactions', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '14:30:00',\n        'timezoneOffset' => 8,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"solarYear":{"type":"number","nullable":true},"pillars":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","nullable":true},"stem":{"type":"string","nullable":true},"branch":{"type":"string","nullable":true},"pillar":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"interactions":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","nullable":true},"chinese":{"type":"string","nullable":true},"english":{"type":"string","nullable":true},"pillars":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"members":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"producesElement":{"type":"string","nullable":true},"schoolNote":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"notes":{"type":"array","items":{},"nullable":true},"methodology":{"type":"string","nullable":true},"source":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"solarYear":1990,"pillars":[{"name":"year","stem":"Geng","branch":"Wu","pillar":"Geng-Wu"},{"name":"month","stem":"Xin","branch":"Si","pillar":"Xin-Si"},{"name":"day","stem":"Geng","branch":"Chen","pillar":"Geng-Chen"},{"name":"hour","stem":"Gui","branch":"Wei","pillar":"Gui-Wei"}],"interactions":[{"type":"sixHarmony","chinese":"六合","english":"Six Harmony","pillars":["year","hour"],"members":["Wu","Wei"],"producesElement":"Earth","schoolNote":"The Wu-Wei harmony is given as Earth here; other transmissions read it as the sun-and-moon pair and assign no element."}],"notes":[],"methodology":"天干五合, 六合, 三合 and 半合, 六沖, 六害, 三刑 and 自刑. Most of these are arithmetic rather than tables: a six harmony is a pair of branch indices summing to one, a harm sums to seven, a clash is a distance of six. Only the punishments need a table, because they are not a relation on the indices.","source":"淵海子平 (Song), public domain","disclaimer":"BaZi pillars use the canonical 60-jiazi cycle, anchored at 1990-01-01 = Bing-Yin. Year and month boundaries are the exact Lichun and 節 instants from the ephemeris, stated in China Standard Time; pass time and timezoneOffset for births near a boundary. Day and hour follow the birthplace clock, with the day rolling at 23:00 local."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/bazi/strength":{"post":{"tags":["BaZi (Four Pillars)"],"summary":"Day-master strength","description":"The support-and-suppress reading over the weighted hidden-stem count, with the three classical criteria (season, root, allies) reported unweighted and the favourable elements that follow. The caveat names both limits: the month is counted like any other branch, and the cut points are this API's convention.","operationId":"bazi_strength","x-quality":"green","x-source":"60-jiazi cycle (canonical) + L. Skinner *Living Earth Manual* + canonical 60-jiazi day count. Day pillar anchored to 1990-01-01 = Bing-Yin (index 2), checkable against any published date. Hour pillar via 五鼠遁 (Five-Rats-Escape) day-stem→hour-stem table.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaziChartInput"},"example":{"date":"1990-05-15","time":"14:30:00","timezoneOffset":8}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/bazi/strength \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"14:30:00\", \"timezoneOffset\": 8 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/bazi/strength', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"14:30:00\",\n    \"timezoneOffset\": 8\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/bazi/strength',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"14:30:00\",\n      'timezoneOffset': 8\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('bazi/strength', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '14:30:00',\n        'timezoneOffset' => 8,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"solarYear":{"type":"number","nullable":true},"pillars":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","nullable":true},"stem":{"type":"string","nullable":true},"branch":{"type":"string","nullable":true},"pillar":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"dayMaster":{"type":"object","properties":{"stem":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"elementName":{"type":"string","nullable":true},"polarity":{"type":"string","nullable":true}},"nullable":true},"strength":{"type":"object","properties":{"framework":{"type":"string","nullable":true},"supportScore":{"type":"number","nullable":true},"drainScore":{"type":"number","nullable":true},"supportRatio":{"type":"number","nullable":true},"verdict":{"type":"string","nullable":true},"hasSeason":{"type":"boolean","nullable":true},"hasRoot":{"type":"boolean","nullable":true},"hasAllies":{"type":"boolean","nullable":true},"favourableElements":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"unfavourableElements":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"caveat":{"type":"string","nullable":true},"favourableElementNames":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"unfavourableElementNames":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}},"nullable":true},"notes":{"type":"array","items":{},"nullable":true},"methodology":{"type":"string","nullable":true},"source":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"solarYear":1990,"pillars":[{"name":"year","stem":"Geng","branch":"Wu","pillar":"Geng-Wu"},{"name":"month","stem":"Xin","branch":"Si","pillar":"Xin-Si"},{"name":"day","stem":"Geng","branch":"Chen","pillar":"Geng-Chen"},{"name":"hour","stem":"Gui","branch":"Wei","pillar":"Gui-Wei"}],"dayMaster":{"stem":"Geng","element":"Metal","elementName":"Метал","polarity":"Ян"},"strength":{"framework":"扶抑 support-and-suppress","supportScore":3.9,"drainScore":3.1,"supportRatio":0.557,"verdict":"strong","hasSeason":false,"hasRoot":true,"hasAllies":true,"favourableElements":["Water","Wood","Fire"],"unfavourableElements":["Earth","Metal"],"caveat":"One framework of several, and the thresholds are ours. 扶抑 weighs support against drain; 調候, 通關, 病藥 and 專旺 read the same chart by other rules and can reach the opposite verdict, and a chart near the boundary is exactly where they part. Two limits worth stating plainly: the ratio counts the month branch exactly like the other three, where the tradition weighs the month above all, and the 0.55 / 0.45 cut points are a convention of this API rather than a canonical rule. The three classical criteria are reported unweighted beside the ratio, so a reader who weighs the month can reach their own verdict from the same inputs.","favourableElementNames":["Вода","Дерево","Вогонь"],"unfavourableElementNames":["Земля","Метал"]},"notes":[],"methodology":"扶抑 support-and-suppress over the weighted hidden-stem count. Everything producing or sharing the day master supports it; everything else drains it. The three classical criteria (得令 season, 得地 root, 得勢 allies) are reported unweighted beside the ratio so a reader can apply their own weighting.","source":"子平真詮 (Shen Xiaozhan, Qing), public domain","disclaimer":"BaZi pillars use the canonical 60-jiazi cycle, anchored at 1990-01-01 = Bing-Yin. Year and month boundaries are the exact Lichun and 節 instants from the ephemeris, stated in China Standard Time; pass time and timezoneOffset for births near a boundary. Day and hour follow the birthplace clock, with the day rolling at 23:00 local."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/bazi/day-master":{"post":{"tags":["BaZi (Four Pillars)"],"summary":"Day Master","description":"Day stem element + yin/yang polarity + canonical archetype description. The \"self\" character in BaZi from which all other pillars are interpreted.","operationId":"bazi_day-master","x-quality":"green","x-source":"60-jiazi cycle (canonical) + L. Skinner *Living Earth Manual* + canonical 60-jiazi day count. Day pillar anchored to 1990-01-01 = Bing-Yin (index 2), checkable against any published date. Hour pillar via 五鼠遁 (Five-Rats-Escape) day-stem→hour-stem table.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaziBirthInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/bazi/day-master \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/bazi/day-master', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/bazi/day-master',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('bazi/day-master', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"dayMaster":{"type":"object","properties":{"stem":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"yin":{"type":"boolean","nullable":true},"polarityName":{"type":"string","nullable":true}},"nullable":true},"dayPillar":{"type":"object","properties":{"stem":{"type":"string","nullable":true},"branch":{"type":"string","nullable":true},"pillar":{"type":"string","nullable":true},"animal":{"type":"string","nullable":true},"stemElement":{"type":"string","nullable":true},"branchElement":{"type":"string","nullable":true},"yin":{"type":"boolean","nullable":true}},"nullable":true},"interpretation":{"type":"object","properties":{"summary":{"type":"string","nullable":true},"archetype":{"type":"string","nullable":true}},"nullable":true},"notes":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"dayMaster":{"stem":"Geng","element":"Metal","yin":false,"polarityName":"Yang Metal"},"dayPillar":{"stem":"Geng","branch":"Chen","pillar":"Geng-Chen","animal":"Dragon","stemElement":"Metal","branchElement":"Earth","yin":false},"interpretation":{"summary":"Yang Metal day master: Geng.","archetype":"Geng (Yang Metal): sword / iron; decisive, direct, strong-willed."},"notes":["Day master is the day stem: the core \"self\" character in BaZi. All other pillars relate to it."],"disclaimer":"BaZi pillars use the canonical 60-jiazi cycle, anchored at 1990-01-01 = Bing-Yin. Year and month boundaries are the exact Lichun and 節 instants from the ephemeris, stated in China Standard Time; pass time and timezoneOffset for births near a boundary. Day and hour follow the birthplace clock, with the day rolling at 23:00 local."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/bazi/element-balance":{"post":{"tags":["BaZi (Four Pillars)"],"summary":"5-Element Balance","description":"Element balance across the whole chart. The `balance` object opens the branches and counts all eight characters three ways: visible, with every hidden stem, and weighted so the total stays at eight. The top-level elementCounts, dominantElement and missingElements are DEPRECATED (year and month only, four characters, branches unopened) and keep answering unchanged until 2027-09-08; the response carries RFC 8594 Deprecation and Sunset headers.","operationId":"bazi_element-balance","x-quality":"green","x-source":"60-jiazi cycle (canonical) + L. Skinner *Living Earth Manual* + canonical 60-jiazi day count. Day pillar anchored to 1990-01-01 = Bing-Yin (index 2), checkable against any published date. Hour pillar via 五鼠遁 (Five-Rats-Escape) day-stem→hour-stem table.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaziChartInput"},"example":{"date":"1990-05-15","time":"14:30:00","timezoneOffset":8}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/bazi/element-balance \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"14:30:00\", \"timezoneOffset\": 8 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/bazi/element-balance', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"14:30:00\",\n    \"timezoneOffset\": 8\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/bazi/element-balance',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"14:30:00\",\n      'timezoneOffset': 8\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('bazi/element-balance', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '14:30:00',\n        'timezoneOffset' => 8,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"solarYear":{"type":"number","nullable":true},"pillars":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","nullable":true},"stem":{"type":"string","nullable":true},"branch":{"type":"string","nullable":true},"pillar":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"elementCounts":{"type":"object","properties":{"Wood":{"type":"number","nullable":true},"Fire":{"type":"number","nullable":true},"Earth":{"type":"number","nullable":true},"Metal":{"type":"number","nullable":true},"Water":{"type":"number","nullable":true}},"nullable":true},"dominantElement":{"type":"string","nullable":true},"missingElements":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"balance":{"type":"object","properties":{"scope":{"type":"string","nullable":true},"visible":{"type":"object","properties":{"Wood":{"type":"number","nullable":true},"Fire":{"type":"number","nullable":true},"Earth":{"type":"number","nullable":true},"Metal":{"type":"number","nullable":true},"Water":{"type":"number","nullable":true}},"nullable":true},"withHiddenStems":{"type":"object","properties":{"Wood":{"type":"number","nullable":true},"Fire":{"type":"number","nullable":true},"Earth":{"type":"number","nullable":true},"Metal":{"type":"number","nullable":true},"Water":{"type":"number","nullable":true}},"nullable":true},"weighted":{"type":"object","properties":{"Wood":{"type":"number","nullable":true},"Fire":{"type":"number","nullable":true},"Earth":{"type":"number","nullable":true},"Metal":{"type":"number","nullable":true},"Water":{"type":"number","nullable":true}},"nullable":true},"weighting":{"type":"string","nullable":true},"dominantElement":{"type":"string","nullable":true},"dominantElementName":{"type":"string","nullable":true},"missingElements":{"type":"array","items":{},"nullable":true},"missingElementNames":{"type":"array","items":{},"nullable":true},"hiddenStems":{"type":"array","items":{"type":"object","properties":{"pillar":{"type":"string","nullable":true},"branch":{"type":"string","nullable":true},"stems":{"type":"array","items":{"type":"object","properties":{"stem":{"type":"string","nullable":true},"stemIndex":{"type":"number","nullable":true},"element":{"type":"string","nullable":true},"yin":{"type":"boolean","nullable":true},"role":{"type":"string","nullable":true},"weight":{"type":"number","nullable":true}},"nullable":true},"nullable":true}},"nullable":true},"nullable":true}},"nullable":true},"deprecations":{"type":"array","items":{"type":"object","properties":{"fields":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"since":{"type":"string","nullable":true},"sunset":{"type":"string","nullable":true},"successor":{"type":"string","nullable":true},"reason":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"notes":{"type":"array","items":{},"nullable":true},"methodology":{"type":"string","nullable":true},"source":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"solarYear":1990,"pillars":[{"name":"year","stem":"Geng","branch":"Wu","pillar":"Geng-Wu"},{"name":"month","stem":"Xin","branch":"Si","pillar":"Xin-Si"},{"name":"day","stem":"Geng","branch":"Chen","pillar":"Geng-Chen"},{"name":"hour","stem":"Gui","branch":"Wei","pillar":"Gui-Wei"}],"elementCounts":{"Wood":0,"Fire":2,"Earth":0,"Metal":2,"Water":0},"dominantElement":"Fire","missingElements":["Wood","Earth","Water"],"balance":{"scope":"eight characters","visible":{"Wood":0,"Fire":2,"Earth":2,"Metal":3,"Water":1},"withHiddenStems":{"Wood":2,"Fire":3,"Earth":4,"Metal":4,"Water":2},"weighted":{"Wood":0.4,"Fire":1.6,"Earth":1.6,"Metal":3.3,"Water":1.1},"weighting":"Each branch contributes one character split among the stems it shelters: 1.0 alone, 0.7/0.3 for two, 0.6/0.3/0.1 for three (本气/中气/余气). The membership is canonical; the split is a stated convention, and the day-count 人元司令 scheme distributes the same characters differently.","dominantElement":"Metal","dominantElementName":"Метал","missingElements":[],"missingElementNames":[],"hiddenStems":[{"pillar":"year","branch":"Wu","stems":[{"stem":"Ding","stemIndex":3,"element":"Fire","yin":true,"role":"principal","weight":0.7},{"stem":"Ji","stemIndex":5,"element":"Earth","yin":true,"role":"middle","weight":0.3}]},{"pillar":"month","branch":"Si","stems":[{"stem":"Bing","stemIndex":2,"element":"Fire","yin":false,"role":"principal","weight":0.6},{"stem":"Geng","stemIndex":6,"element":"Metal","yin":false,"role":"middle","weight":0.3},{"stem":"Wu","stemIndex":4,"element":"Earth","yin":false,"role":"residual","weight":0.1}]},{"pillar":"day","branch":"Chen","stems":[{"stem":"Wu","stemIndex":4,"element":"Earth","yin":false,"role":"principal","weight":0.6},{"stem":"Yi","stemIndex":1,"element":"Wood","yin":true,"role":"residual","weight":0.3},{"stem":"Gui","stemIndex":9,"element":"Water","yin":true,"role":"middle","weight":0.1}]},{"pillar":"hour","branch":"Wei","stems":[{"stem":"Ji","stemIndex":5,"element":"Earth","yin":true,"role":"principal","weight":0.6},{"stem":"Ding","stemIndex":3,"element":"Fire","yin":true,"role":"residual","weight":0.3},{"stem":"Yi","stemIndex":1,"element":"Wood","yin":true,"role":"middle","weight":0.1}]}]},"deprecations":[{"fields":["elementCounts","dominantElement","missingElements"],"since":"2026-09-08","sunset":"2027-09-08","successor":"balance","reason":"They count the year and month pillars only, four of the eight characters, and never open the branches, so an element sheltered as a hidden stem is reported absent. `balance` counts the whole chart. The old fields keep answering unchanged until the sunset date."}],"notes":[],"methodology":"Under `balance`: all eight characters with the branches opened. `visible` counts the four stems plus each branch's principal hidden stem, the classic count of eight. `withHiddenStems` counts every sheltered stem whole. `weighted` splits each branch among the stems it shelters, so the total stays at eight. An element is called missing only when the weighted count reaches zero.","source":"地支藏干 per 淵海子平 and 三命通會, public domain","disclaimer":"BaZi pillars use the canonical 60-jiazi cycle, anchored at 1990-01-01 = Bing-Yin. Year and month boundaries are the exact Lichun and 節 instants from the ephemeris, stated in China Standard Time; pass time and timezoneOffset for births near a boundary. Day and hour follow the birthplace clock, with the day rolling at 23:00 local."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/bazi/yearly":{"post":{"tags":["BaZi (Four Pillars)"],"summary":"Yearly Forecast","description":"Compares target year pillar against natal day master + natal year branch. Returns element-flow relation (companion / mother / output / control / wealth) per Sheng-Ke cycle, branch clashes (六冲), and trine support (三合).","operationId":"bazi_yearly","x-quality":"green","x-source":"60-jiazi cycle (canonical) + L. Skinner *Living Earth Manual* + canonical 60-jiazi day count. Day pillar anchored to 1990-01-01 = Bing-Yin (index 2), checkable against any published date. Hour pillar via 五鼠遁 (Five-Rats-Escape) day-stem→hour-stem table.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaziYearlyInput"},"example":{"natalDate":"1990-05-15","targetYear":2027}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/bazi/yearly \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"natalDate\": \"1990-05-15\", \"targetYear\": 2027 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/bazi/yearly', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"natalDate\": \"1990-05-15\",\n    \"targetYear\": 2027\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/bazi/yearly',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'natalDate': \"1990-05-15\",\n      'targetYear': 2027\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('bazi/yearly', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'natalDate' => '1990-05-15',\n        'targetYear' => 2027,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"natalDayMaster":{"type":"object","properties":{"stem":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"yin":{"type":"boolean","nullable":true}},"nullable":true},"targetYear":{"type":"number","nullable":true},"targetPillar":{"type":"object","properties":{"stem":{"type":"string","nullable":true},"branch":{"type":"string","nullable":true},"pillar":{"type":"string","nullable":true},"animal":{"type":"string","nullable":true}},"nullable":true},"elementFlow":{"type":"object","properties":{"stem":{"type":"object","properties":{"element":{"type":"string","nullable":true},"relation":{"type":"string","nullable":true},"flavor":{"type":"string","nullable":true}},"nullable":true},"branch":{"type":"object","properties":{"element":{"type":"string","nullable":true},"relation":{"type":"string","nullable":true},"flavor":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"branchInteractions":{"type":"object","properties":{"clashes":{"type":"array","items":{},"nullable":true},"trineSupport":{"type":"array","items":{},"nullable":true}},"nullable":true},"notes":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"natalDayMaster":{"stem":"Geng","element":"Metal","yin":false},"targetYear":2027,"targetPillar":{"stem":"Ding","branch":"Wei","pillar":"Ding-Wei","animal":"Goat"},"elementFlow":{"stem":{"element":"Fire","relation":"control","flavor":"control / officer (官杀): pressure or authority year"},"branch":{"element":"Earth","relation":"mother","flavor":"mother / supporting (印): nurturing year"}},"branchInteractions":{"clashes":[],"trineSupport":[]},"notes":["Element flow uses the standard 五行生克 (Sheng-Ke) cycle relative to natal day master."],"disclaimer":"BaZi pillars use the canonical 60-jiazi cycle, anchored at 1990-01-01 = Bing-Yin. Year and month boundaries are the exact Lichun and 節 instants from the ephemeris, stated in China Standard Time; pass time and timezoneOffset for births near a boundary. Day and hour follow the birthplace clock, with the day rolling at 23:00 local."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/bazi/monthly":{"post":{"tags":["BaZi (Four Pillars)"],"summary":"Monthly Forecast","description":"Same Sheng-Ke + branch-clash analysis as yearly, but applied to a specific calendar month. Month branch resolved via mid-month jieqi.","operationId":"bazi_monthly","x-quality":"green","x-source":"60-jiazi cycle (canonical) + L. Skinner *Living Earth Manual* + canonical 60-jiazi day count. Day pillar anchored to 1990-01-01 = Bing-Yin (index 2), checkable against any published date. Hour pillar via 五鼠遁 (Five-Rats-Escape) day-stem→hour-stem table.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaziMonthlyInput"},"example":{"natalDate":"1990-05-15","targetYear":2026,"targetMonth":6}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/bazi/monthly \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"natalDate\": \"1990-05-15\", \"targetYear\": 2026, \"targetMonth\": 6 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/bazi/monthly', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"natalDate\": \"1990-05-15\",\n    \"targetYear\": 2026,\n    \"targetMonth\": 6\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/bazi/monthly',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'natalDate': \"1990-05-15\",\n      'targetYear': 2026,\n      'targetMonth': 6\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('bazi/monthly', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'natalDate' => '1990-05-15',\n        'targetYear' => 2026,\n        'targetMonth' => 6,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"natalDayMaster":{"type":"object","properties":{"stem":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"yin":{"type":"boolean","nullable":true}},"nullable":true},"targetYear":{"type":"number","nullable":true},"targetMonth":{"type":"number","nullable":true},"targetPillar":{"type":"object","properties":{"stem":{"type":"string","nullable":true},"branch":{"type":"string","nullable":true},"pillar":{"type":"string","nullable":true},"animal":{"type":"string","nullable":true}},"nullable":true},"elementFlow":{"type":"object","properties":{"stem":{"type":"object","properties":{"element":{"type":"string","nullable":true},"relation":{"type":"string","nullable":true},"flavor":{"type":"string","nullable":true}},"nullable":true},"branch":{"type":"object","properties":{"element":{"type":"string","nullable":true},"relation":{"type":"string","nullable":true},"flavor":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"branchInteractions":{"type":"object","properties":{"clashes":{"type":"array","items":{},"nullable":true}},"nullable":true},"notes":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"natalDayMaster":{"stem":"Geng","element":"Metal","yin":false},"targetYear":2026,"targetMonth":6,"targetPillar":{"stem":"Jia","branch":"Wu","pillar":"Jia-Wu","animal":"Horse"},"elementFlow":{"stem":{"element":"Wood","relation":"wealth","flavor":"wealth (财): material gain or expense year"},"branch":{"element":"Fire","relation":"control","flavor":"control / officer (官杀): pressure or authority year"}},"branchInteractions":{"clashes":[]},"notes":["Month branch determined by jieqi at mid-month (~15th). For exact day boundaries, pair with /v1/sun-times."],"disclaimer":"BaZi pillars use the canonical 60-jiazi cycle, anchored at 1990-01-01 = Bing-Yin. Year and month boundaries are the exact Lichun and 節 instants from the ephemeris, stated in China Standard Time; pass time and timezoneOffset for births near a boundary. Day and hour follow the birthplace clock, with the day rolling at 23:00 local."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/bazi/year-pillar-decade":{"post":{"tags":["BaZi (Four Pillars)"],"summary":"Year Pillars × 10","description":"10 consecutive year pillars from a given starting year.","operationId":"bazi_year-pillar-decade","x-quality":"green","x-source":"60-jiazi cycle (canonical) + L. Skinner *Living Earth Manual* + canonical 60-jiazi day count. Day pillar anchored to 1990-01-01 = Bing-Yin (index 2), checkable against any published date. Hour pillar via 五鼠遁 (Five-Rats-Escape) day-stem→hour-stem table.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaziDecade"},"example":{"startYear":1990}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/bazi/year-pillar-decade \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"startYear\": 1990 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/bazi/year-pillar-decade', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"startYear\": 1990\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/bazi/year-pillar-decade',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'startYear': 1990\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('bazi/year-pillar-decade', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'startYear' => 1990,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"startYear":{"type":"number","nullable":true},"decade":{"type":"array","items":{"type":"object","properties":{"solarYear":{"type":"number","nullable":true},"pillar":{"type":"string","nullable":true},"animal":{"type":"string","nullable":true},"element":{"type":"object","properties":{"fixed":{"type":"string","nullable":true},"cycling":{"type":"string","nullable":true},"yin":{"type":"boolean","nullable":true}},"nullable":true}},"nullable":true},"nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"startYear":1990,"decade":[{"solarYear":1990,"pillar":"Geng-Wu","animal":"Horse","element":{"fixed":"Fire","cycling":"Metal","yin":false}}],"disclaimer":"BaZi pillars use the canonical 60-jiazi cycle, anchored at 1990-01-01 = Bing-Yin. Year and month boundaries are the exact Lichun and 節 instants from the ephemeris, stated in China Standard Time; pass time and timezoneOffset for births near a boundary. Day and hour follow the birthplace clock, with the day rolling at 23:00 local."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/bazi/hour-pillar":{"post":{"tags":["BaZi (Four Pillars)"],"summary":"Hour Pillar","description":"Hour pillar via 五鼠遁 (Five-Rats-Escape) day-stem → hour-stem table. The Zi hour opens the day at 23:00 local time.","operationId":"bazi_hour-pillar","x-quality":"green","x-source":"Canonical 60-jiazi cycle + 五鼠遁 traditional table.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaziHourInput"},"example":{"date":"1990-06-15","time":"14:30:00","timezoneOffset":3}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/bazi/hour-pillar \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-06-15\", \"time\": \"14:30:00\", \"timezoneOffset\": 3 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/bazi/hour-pillar', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-06-15\",\n    \"time\": \"14:30:00\",\n    \"timezoneOffset\": 3\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/bazi/hour-pillar',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-06-15\",\n      'time': \"14:30:00\",\n      'timezoneOffset': 3\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('bazi/hour-pillar', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-06-15',\n        'time' => '14:30:00',\n        'timezoneOffset' => 3,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"date":{"type":"string","nullable":true},"time":{"type":"string","nullable":true},"timezoneOffset":{"type":"number","nullable":true},"localHour":{"type":"number","nullable":true},"cstHour":{"type":"number","nullable":true},"dayPillar":{"type":"object","properties":{"stem":{"type":"string","nullable":true},"branch":{"type":"string","nullable":true},"pillar":{"type":"string","nullable":true}},"nullable":true},"hourPillar":{"type":"object","properties":{"stem":{"type":"string","nullable":true},"branch":{"type":"string","nullable":true},"pillar":{"type":"string","nullable":true},"animal":{"type":"string","nullable":true},"stemElement":{"type":"string","nullable":true},"branchElement":{"type":"string","nullable":true},"yin":{"type":"boolean","nullable":true}},"nullable":true},"methodology":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"date":"1990-06-15","time":"15:30:00","timezoneOffset":4,"localHour":14,"cstHour":19,"dayPillar":{"stem":"Xin","branch":"Hai","pillar":"Xin-Hai"},"hourPillar":{"stem":"Yi","branch":"Wei","pillar":"Yi-Wei","animal":"Goat","stemElement":"Wood","branchElement":"Earth","yin":true},"methodology":"五鼠遁 (Five-Rats-Escape) day-stem → hour-stem table. Hour zero (Zi 子) covers 23:00–00:59 local time, and the day pillar rolls with it.","disclaimer":"BaZi pillars use the canonical 60-jiazi cycle, anchored at 1990-01-01 = Bing-Yin. Year and month boundaries are the exact Lichun and 節 instants from the ephemeris, stated in China Standard Time; pass time and timezoneOffset for births near a boundary. Day and hour follow the birthplace clock, with the day rolling at 23:00 local."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/bazi/ten-gods":{"post":{"tags":["BaZi (Four Pillars)"],"summary":"Ten Gods (Shi Shen)","description":"Ten Gods classification per day master. Bi Jian/Jie Cai (peer), Shi Shen/Shang Guan (output), Pian Cai/Zheng Cai (wealth), Qi Sha/Zheng Guan (officer), Pian Yin/Zheng Yin (resource).","operationId":"bazi_ten-gods","x-quality":"green","x-source":"Yuan Hai Tzu-Ping (袁海子平) Song dynasty + Tao Bing-Fang \"Ziping Zhenquan\" Qing dynasty (PD).","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaziTenGodsInput"},"example":{"date":"1990-06-15"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/bazi/ten-gods \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-06-15\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/bazi/ten-gods', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-06-15\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/bazi/ten-gods',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-06-15\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('bazi/ten-gods', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-06-15',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"date":{"type":"string","nullable":true},"dayMaster":{"type":"object","properties":{"stem":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"yin":{"type":"boolean","nullable":true}},"nullable":true},"tenGods":{"type":"array","items":{"type":"object","properties":{"stem":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"yin":{"type":"boolean","nullable":true},"relationship":{"type":"object","properties":{"name":{"type":"string","nullable":true},"chinese":{"type":"string","nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"nullable":true},"methodology":{"type":"string","nullable":true},"source":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"date":"1990-06-15","dayMaster":{"stem":"Xin","element":"Metal","yin":true},"tenGods":[{"stem":"Jia","element":"Wood","yin":false,"relationship":{"name":"Direct Wealth","chinese":"正财 Zheng Cai","meaning":"steady income, salary, stable assets"}}],"methodology":"Shi Shen (十神) Ten Gods classification per day master. Same-element = peer (Bi Jian/Jie Cai), produced = output (Shi Shen/Shang Guan), controlled = wealth (Pian Cai/Zheng Cai), controls DM = officer (Qi Sha/Zheng Guan), produces DM = resource (Pian Yin/Zheng Yin).","source":"Yuan Hai Tzu-Ping (袁海子平) Song dynasty + Tao Bing-Fang \"Ziping Zhenquan\" Qing dynasty (PD)","disclaimer":"BaZi pillars use the canonical 60-jiazi cycle, anchored at 1990-01-01 = Bing-Yin. Year and month boundaries are the exact Lichun and 節 instants from the ephemeris, stated in China Standard Time; pass time and timezoneOffset for births near a boundary. Day and hour follow the birthplace clock, with the day rolling at 23:00 local."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/bazi/luck-pillars":{"post":{"tags":["BaZi (Four Pillars)"],"summary":"Luck Pillars (Da Yun)","description":"10-year luck pillars sequence. Direction by gender + year-stem polarity per Ziping canon.","operationId":"bazi_luck-pillars","x-quality":"green","x-source":"Tao Bing-Fang \"Ziping Zhenquan\" + Wei Qian-Li \"San Ming Tong Hui\" Ming dynasty (PD).","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaziLuckPillarsInput"},"example":{"date":"1990-06-15","gender":"male","count":8}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/bazi/luck-pillars \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-06-15\", \"gender\": \"male\", \"count\": 8 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/bazi/luck-pillars', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-06-15\",\n    \"gender\": \"male\",\n    \"count\": 8\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/bazi/luck-pillars',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-06-15\",\n      'gender': \"male\",\n      'count': 8\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('bazi/luck-pillars', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-06-15',\n        'gender' => 'male',\n        'count' => 8,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"date":{"type":"string","nullable":true},"gender":{"type":"string","nullable":true},"direction":{"type":"string","nullable":true},"count":{"type":"number","nullable":true},"startAge":{"type":"object","properties":{"years":{"type":"number","nullable":true},"months":{"type":"number","nullable":true}},"nullable":true},"startReference":{"type":"object","properties":{"term":{"type":"string","nullable":true},"pinyin":{"type":"string","nullable":true},"beijing":{"type":"string","nullable":true},"days":{"type":"number","nullable":true}},"nullable":true},"luckPillars":{"type":"array","items":{"type":"object","properties":{"pillar":{"type":"string","nullable":true},"stem":{"type":"string","nullable":true},"branch":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"ageStart":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"methodology":{"type":"string","nullable":true},"source":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"date":"1990-06-15","gender":"male","direction":"forward","count":8,"startAge":{"years":7,"months":5},"startReference":{"term":"小暑","pinyin":"Xiaoshu","beijing":"1990-07-07T17:00:28+08:00","days":22.2087},"luckPillars":[{"pillar":"Gui-Wei","stem":"Gui","branch":"Wei","element":"Water","ageStart":7}],"methodology":"Da Yun (大运) 10-year luck pillars: sequential pillars from natal month, direction by gender + year-stem polarity per Ziping canon. Start age (起運) counts the distance to the bounding 節 at three days per year of life, so each day is four months.","source":"Tao Bing-Fang \"Ziping Zhenquan\" + Wei Qian-Li \"San Ming Tong Hui\" (Ming dynasty PD)","disclaimer":"BaZi pillars use the canonical 60-jiazi cycle, anchored at 1990-01-01 = Bing-Yin. Year and month boundaries are the exact Lichun and 節 instants from the ephemeris, stated in China Standard Time; pass time and timezoneOffset for births near a boundary. Day and hour follow the birthplace clock, with the day rolling at 23:00 local."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/ziwei/twelve-palaces":{"post":{"tags":["Zi Wei Dou Shu (Purple Star)"],"summary":"12 Palaces","description":"All 12 palaces with English/pinyin/Chinese names + theme + rules.","operationId":"ziwei_twelve-palaces","x-quality":"green","x-source":"中洲派 初階講義 安星口訣 for every placement rule, read alongside the 紫微斗數全書 line, with the 王亭之 corpus for the 四化 default. POST /ziwei/chart places the stars from the lunar date and the birth hour: soul and body palaces, the five-element class, all 14 main stars, the auxiliaries, the twelve life stages, the decade limits and the 四化. Pinned to three published charts. The remaining /ziwei/* paths are reference glossaries and say so in a computed:false field; /ziwei/full-chart is deprecated in favour of /ziwei/chart, sunset 2027-11-26.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ZiweiDateInput"},"example":{"date":"1990-06-15"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/ziwei/twelve-palaces \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-06-15\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/ziwei/twelve-palaces', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-06-15\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/ziwei/twelve-palaces',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-06-15\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('ziwei/twelve-palaces', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-06-15',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"solarYear":{"type":"number","nullable":true},"animal":{"type":"string","nullable":true},"palaces":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string","nullable":true},"english":{"type":"string","nullable":true},"pinyin":{"type":"string","nullable":true},"chinese":{"type":"string","nullable":true},"theme":{"type":"string","nullable":true},"rules":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"governingAnimal":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"solarYear":1990,"animal":"Horse","palaces":[{"key":"destiny","english":"Destiny / Life","pinyin":"Ming","chinese":"命宫","theme":"Life path, character, overall fortune","rules":["Personality essence"],"governingAnimal":"Horse"}],"disclaimer":"Zi Wei Dou Shu reference tables. Palace meanings and the 14 main stars here are static and do not vary with the birth date; only solarYear and animal derive from it. Star placement lives on POST /v1/ziwei/chart, which computes the soul and body palaces, the five-element class and every star from the lunar date and the birth hour. Where schools disagree we follow 中州派 (Zhongzhou, the Wang Tingzhi corpus); this is stated up front so results are comparable against the calculators built on the same tables."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/ziwei/chart":{"post":{"tags":["Zi Wei Dou Shu (Purple Star)"],"summary":"Full Chart (computed)","description":"Real star placement: soul and body palaces, the five-element class, all 14 main stars plus auxiliaries, the twelve stages, the 12 decade limits and the 四化 marked on the stars that carry them.","operationId":"ziwei_chart","x-quality":"green","x-source":"中洲派 初階講義 安星口訣 for every placement rule, read alongside the 紫微斗數全書 line, with the 王亭之 corpus for the 四化 default. POST /ziwei/chart places the stars from the lunar date and the birth hour: soul and body palaces, the five-element class, all 14 main stars, the auxiliaries, the twelve life stages, the decade limits and the 四化. Pinned to three published charts. The remaining /ziwei/* paths are reference glossaries and say so in a computed:false field; /ziwei/full-chart is deprecated in favour of /ziwei/chart, sunset 2027-11-26.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ZiweiChartInput"},"example":{"date":"2000-08-16","time":"04:00:00","gender":"male"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/ziwei/chart \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"2000-08-16\", \"time\": \"04:00:00\", \"gender\": \"male\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/ziwei/chart', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"2000-08-16\",\n    \"time\": \"04:00:00\",\n    \"gender\": \"male\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/ziwei/chart',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"2000-08-16\",\n      'time': \"04:00:00\",\n      'gender': \"male\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('ziwei/chart', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '2000-08-16',\n        'time' => '04:00:00',\n        'gender' => 'male',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"lunar":{"type":"object","properties":{"month":{"type":"number","nullable":true},"isLeapMonth":{"type":"boolean","nullable":true},"day":{"type":"number","nullable":true},"monthStart":{"type":"string","nullable":true}},"nullable":true},"fiveElementClass":{"type":"object","properties":{"key":{"type":"string","nullable":true},"chinese":{"type":"string","nullable":true},"value":{"type":"number","nullable":true}},"nullable":true},"soulPalace":{"type":"object","properties":{"index":{"type":"number","nullable":true},"branch":{"type":"string","nullable":true}},"nullable":true},"ziwei":{"type":"object","properties":{"index":{"type":"number","nullable":true},"branch":{"type":"string","nullable":true}},"nullable":true},"palaces":{"type":"array","items":{"type":"object","properties":{"branch":{"type":"string","nullable":true},"palace":{"type":"string","nullable":true},"pillar":{"type":"string","nullable":true},"majorStars":{"type":"array","items":{"type":"object","properties":{"chinese":{"type":"string","nullable":true},"name":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"lifeStage":{"type":"object","properties":{"chinese":{"type":"string","nullable":true},"name":{"type":"string","nullable":true}},"nullable":true},"decade":{"type":"object","properties":{"index":{"type":"number","nullable":true},"fromAge":{"type":"number","nullable":true},"toAge":{"type":"number","nullable":true}},"nullable":true}},"nullable":true},"nullable":true},"computed":{"type":"boolean","nullable":true}}}}},"example":{"ok":true,"data":{"lunar":{"month":7,"isLeapMonth":false,"day":17,"monthStart":"2000-07-31"},"fiveElementClass":{"key":"wood3","chinese":"木三局","value":3},"soulPalace":{"index":4,"branch":"Wu"},"ziwei":{"index":4,"branch":"Wu"},"palaces":[{"branch":"Wu","palace":"destiny","pillar":"Ren-Wu","majorStars":[{"chinese":"紫微","name":"Purple Star"}],"lifeStage":{"chinese":"死","name":"Death"},"decade":{"index":0,"fromAge":3,"toAge":12}}],"computed":true}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/ziwei/four-transformations":{"post":{"tags":["Zi Wei Dou Shu (Purple Star)"],"summary":"Four Transformations (四化)","description":"The four stars activated by the birth year stem: 化禄 fortune, 化权 authority, 化科 repute, 化忌 obstruction. The one part of Zi Wei computable without star placement. Seven stems are agreed across traditions; for the three that are not (戊 庚 壬) every school reading ships in schoolVariants, and `school` switches the headline answer.","operationId":"ziwei_four-transformations","x-quality":"green","x-source":"中洲派 初階講義 安星口訣 for every placement rule, read alongside the 紫微斗數全書 line, with the 王亭之 corpus for the 四化 default. POST /ziwei/chart places the stars from the lunar date and the birth hour: soul and body palaces, the five-element class, all 14 main stars, the auxiliaries, the twelve life stages, the decade limits and the 四化. Pinned to three published charts. The remaining /ziwei/* paths are reference glossaries and say so in a computed:false field; /ziwei/full-chart is deprecated in favour of /ziwei/chart, sunset 2027-11-26.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ZiweiSihuaInput"},"example":{"date":"1990-06-15","school":"zhongzhou"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/ziwei/four-transformations \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-06-15\", \"school\": \"zhongzhou\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/ziwei/four-transformations', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-06-15\",\n    \"school\": \"zhongzhou\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/ziwei/four-transformations',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-06-15\",\n      'school': \"zhongzhou\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('ziwei/four-transformations', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-06-15',\n        'school' => 'zhongzhou',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"solarYear":{"type":"number","nullable":true},"yearStem":{"type":"object","properties":{"pinyin":{"type":"string","nullable":true},"chinese":{"type":"string","nullable":true}},"nullable":true},"school":{"type":"object","properties":{"key":{"type":"string","nullable":true},"chinese":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"note":{"type":"string","nullable":true}},"nullable":true},"disputed":{"type":"boolean","nullable":true},"transformations":{"type":"array","items":{"type":"object","properties":{"kind":{"type":"string","nullable":true},"chinese":{"type":"string","nullable":true},"pinyin":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"theme":{"type":"string","nullable":true},"star":{"type":"object","properties":{"chinese":{"type":"string","nullable":true},"name":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"nullable":true},"schoolVariants":{"type":"object","properties":{"zhongzhou":{"type":"object","properties":{"lu":{"type":"object","properties":{"chinese":{"type":"string","nullable":true},"name":{"type":"string","nullable":true}},"nullable":true},"quan":{"type":"object","properties":{"chinese":{"type":"string","nullable":true},"name":{"type":"string","nullable":true}},"nullable":true},"ke":{"type":"object","properties":{"chinese":{"type":"string","nullable":true},"name":{"type":"string","nullable":true}},"nullable":true},"ji":{"type":"object","properties":{"chinese":{"type":"string","nullable":true},"name":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"quanji":{"type":"object","properties":{"lu":{"type":"object","properties":{"chinese":{"type":"string","nullable":true},"name":{"type":"string","nullable":true}},"nullable":true},"quan":{"type":"object","properties":{"chinese":{"type":"string","nullable":true},"name":{"type":"string","nullable":true}},"nullable":true},"ke":{"type":"object","properties":{"chinese":{"type":"string","nullable":true},"name":{"type":"string","nullable":true}},"nullable":true},"ji":{"type":"object","properties":{"chinese":{"type":"string","nullable":true},"name":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"quanshu":{"type":"object","properties":{"lu":{"type":"object","properties":{"chinese":{"type":"string","nullable":true},"name":{"type":"string","nullable":true}},"nullable":true},"quan":{"type":"object","properties":{"chinese":{"type":"string","nullable":true},"name":{"type":"string","nullable":true}},"nullable":true},"ke":{"type":"object","properties":{"chinese":{"type":"string","nullable":true},"name":{"type":"string","nullable":true}},"nullable":true},"ji":{"type":"object","properties":{"chinese":{"type":"string","nullable":true},"name":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"beipai":{"type":"object","properties":{"lu":{"type":"object","properties":{"chinese":{"type":"string","nullable":true},"name":{"type":"string","nullable":true}},"nullable":true},"quan":{"type":"object","properties":{"chinese":{"type":"string","nullable":true},"name":{"type":"string","nullable":true}},"nullable":true},"ke":{"type":"object","properties":{"chinese":{"type":"string","nullable":true},"name":{"type":"string","nullable":true}},"nullable":true},"ji":{"type":"object","properties":{"chinese":{"type":"string","nullable":true},"name":{"type":"string","nullable":true}},"nullable":true}},"nullable":true}},"nullable":true},"notes":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"solarYear":1990,"yearStem":{"pinyin":"geng","chinese":"庚"},"school":{"key":"zhongzhou","chinese":"中州派","name":"Zhongzhou (Wang Tingzhi corpus)","note":"Holds that 左辅 and 右弼 take no part in the transformations, substituting 太阳 for 戊 and 天府 for 庚. The school AstroWay follows by default."},"disputed":true,"transformations":[{"kind":"lu","chinese":"化禄","pinyin":"Hua Lu","name":"Fortune","theme":"Supply, opportunity, the thing that comes easily","star":{"chinese":"太阳","name":"Sun"}}],"schoolVariants":{"zhongzhou":{"lu":{"chinese":"太阳","name":"Sun"},"quan":{"chinese":"武曲","name":"Martial Melody"},"ke":{"chinese":"天府","name":"Heavenly Treasury"},"ji":{"chinese":"天同","name":"Heavenly Unity"}},"quanji":{"lu":{"chinese":"太阳","name":"Sun"},"quan":{"chinese":"武曲","name":"Martial Melody"},"ke":{"chinese":"太阴","name":"Moon"},"ji":{"chinese":"天同","name":"Heavenly Unity"}},"quanshu":{"lu":{"chinese":"太阳","name":"Sun"},"quan":{"chinese":"武曲","name":"Martial Melody"},"ke":{"chinese":"天同","name":"Heavenly Unity"},"ji":{"chinese":"太阴","name":"Moon"}},"beipai":{"lu":{"chinese":"太阳","name":"Sun"},"quan":{"chinese":"武曲","name":"Martial Melody"},"ke":{"chinese":"天同","name":"Heavenly Unity"},"ji":{"chinese":"天相","name":"Heavenly Aide"}}},"notes":["Stem 庚 is one of the three the schools do not agree on. Every reading is in schoolVariants; the top-level answer follows 中州派."]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/ziwei/main-stars":{"post":{"tags":["Zi Wei Dou Shu (Purple Star)"],"summary":"14 Main Stars","description":"The 14 main stars in canonical order (Zi Wei series, then Tian Fu series) with theme/archetype. Reference table: does not vary with the date.","operationId":"ziwei_main-stars","x-quality":"green","x-source":"中洲派 初階講義 安星口訣 for every placement rule, read alongside the 紫微斗數全書 line, with the 王亭之 corpus for the 四化 default. POST /ziwei/chart places the stars from the lunar date and the birth hour: soul and body palaces, the five-element class, all 14 main stars, the auxiliaries, the twelve life stages, the decade limits and the 四化. Pinned to three published charts. The remaining /ziwei/* paths are reference glossaries and say so in a computed:false field; /ziwei/full-chart is deprecated in favour of /ziwei/chart, sunset 2027-11-26.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ZiweiDateInput"},"example":{"date":"1990-06-15"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/ziwei/main-stars \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-06-15\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/ziwei/main-stars', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-06-15\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/ziwei/main-stars',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-06-15\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('ziwei/main-stars', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-06-15',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"fourteenMainStars":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","nullable":true},"pinyin":{"type":"string","nullable":true},"chinese":{"type":"string","nullable":true},"series":{"type":"string","nullable":true},"theme":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"fourteenMainStars":[{"name":"Purple Star","pinyin":"Zi Wei","chinese":"紫微","series":"Zi Wei","theme":"Emperor: leadership, dignity, command"}],"disclaimer":"Zi Wei Dou Shu reference tables. Palace meanings and the 14 main stars here are static and do not vary with the birth date; only solarYear and animal derive from it. Star placement lives on POST /v1/ziwei/chart, which computes the soul and body palaces, the five-element class and every star from the lunar date and the birth hour. Where schools disagree we follow 中州派 (Zhongzhou, the Wang Tingzhi corpus); this is stated up front so results are comparable against the calculators built on the same tables."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/ziwei/full-chart":{"post":{"tags":["Zi Wei Dou Shu (Purple Star)"],"summary":"Full Chart (deprecated)","description":"Deprecated 2026-09-08, sunset 2027-11-26. Year pillar + animal + a 12-palace overview, identical for every birth date. Use POST /ziwei/chart, which actually places the stars.","operationId":"ziwei_full-chart","x-quality":"green","x-source":"中洲派 初階講義 安星口訣 for every placement rule, read alongside the 紫微斗數全書 line, with the 王亭之 corpus for the 四化 default. POST /ziwei/chart places the stars from the lunar date and the birth hour: soul and body palaces, the five-element class, all 14 main stars, the auxiliaries, the twelve life stages, the decade limits and the 四化. Pinned to three published charts. The remaining /ziwei/* paths are reference glossaries and say so in a computed:false field; /ziwei/full-chart is deprecated in favour of /ziwei/chart, sunset 2027-11-26.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ZiweiDateInput"},"example":{"date":"1990-06-15"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/ziwei/full-chart \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-06-15\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/ziwei/full-chart', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-06-15\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/ziwei/full-chart',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-06-15\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('ziwei/full-chart', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-06-15',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"solarYear":{"type":"number","nullable":true},"animal":{"type":"string","nullable":true},"yearPillar":{"type":"string","nullable":true},"palaces":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string","nullable":true},"english":{"type":"string","nullable":true},"theme":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"notes":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"solarYear":1990,"animal":"Horse","yearPillar":"Geng-Wu","palaces":[{"key":"destiny","english":"Destiny / Life","theme":"Life path, character, overall fortune"}],"notes":["Palace meanings are provided for orientation. Star placement lives on POST /v1/ziwei/chart."],"disclaimer":"Zi Wei Dou Shu reference tables. Palace meanings and the 14 main stars here are static and do not vary with the birth date; only solarYear and animal derive from it. Star placement lives on POST /v1/ziwei/chart, which computes the soul and body palaces, the five-element class and every star from the lunar date and the birth hour. Where schools disagree we follow 中州派 (Zhongzhou, the Wang Tingzhi corpus); this is stated up front so results are comparable against the calculators built on the same tables."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/ziwei/palace-destiny":{"post":{"tags":["Zi Wei Dou Shu (Purple Star)"],"summary":"Destiny Palace (Ming)","description":"Life path, character, soul mission.","operationId":"ziwei_palace-destiny","x-quality":"green","x-source":"中洲派 初階講義 安星口訣 for every placement rule, read alongside the 紫微斗數全書 line, with the 王亭之 corpus for the 四化 default. POST /ziwei/chart places the stars from the lunar date and the birth hour: soul and body palaces, the five-element class, all 14 main stars, the auxiliaries, the twelve life stages, the decade limits and the 四化. Pinned to three published charts. The remaining /ziwei/* paths are reference glossaries and say so in a computed:false field; /ziwei/full-chart is deprecated in favour of /ziwei/chart, sunset 2027-11-26.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ZiweiDateInput"},"example":{"date":"1990-06-15"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/ziwei/palace-destiny \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-06-15\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/ziwei/palace-destiny', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-06-15\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/ziwei/palace-destiny',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-06-15\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('ziwei/palace-destiny', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-06-15',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"solarYear":{"type":"number","nullable":true},"animal":{"type":"string","nullable":true},"palace":{"type":"object","properties":{"key":{"type":"string","nullable":true},"english":{"type":"string","nullable":true},"pinyin":{"type":"string","nullable":true},"chinese":{"type":"string","nullable":true},"theme":{"type":"string","nullable":true},"rules":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}},"nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"solarYear":1990,"animal":"Horse","palace":{"key":"destiny","english":"Destiny / Life","pinyin":"Ming","chinese":"命宫","theme":"Life path, character, overall fortune","rules":["Personality essence"]},"disclaimer":"Zi Wei Dou Shu reference tables. Palace meanings and the 14 main stars here are static and do not vary with the birth date; only solarYear and animal derive from it. Star placement lives on POST /v1/ziwei/chart, which computes the soul and body palaces, the five-element class and every star from the lunar date and the birth hour. Where schools disagree we follow 中州派 (Zhongzhou, the Wang Tingzhi corpus); this is stated up front so results are comparable against the calculators built on the same tables."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/ziwei/palace-siblings":{"post":{"tags":["Zi Wei Dou Shu (Purple Star)"],"summary":"Siblings Palace (Xiongdi)","description":"Brothers, sisters, peer relationships.","operationId":"ziwei_palace-siblings","x-quality":"green","x-source":"中洲派 初階講義 安星口訣 for every placement rule, read alongside the 紫微斗數全書 line, with the 王亭之 corpus for the 四化 default. POST /ziwei/chart places the stars from the lunar date and the birth hour: soul and body palaces, the five-element class, all 14 main stars, the auxiliaries, the twelve life stages, the decade limits and the 四化. Pinned to three published charts. The remaining /ziwei/* paths are reference glossaries and say so in a computed:false field; /ziwei/full-chart is deprecated in favour of /ziwei/chart, sunset 2027-11-26.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ZiweiDateInput"},"example":{"date":"1990-06-15"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/ziwei/palace-siblings \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-06-15\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/ziwei/palace-siblings', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-06-15\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/ziwei/palace-siblings',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-06-15\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('ziwei/palace-siblings', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-06-15',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"solarYear":{"type":"number","nullable":true},"animal":{"type":"string","nullable":true},"palace":{"type":"object","properties":{"key":{"type":"string","nullable":true},"english":{"type":"string","nullable":true},"pinyin":{"type":"string","nullable":true},"chinese":{"type":"string","nullable":true},"theme":{"type":"string","nullable":true},"rules":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}},"nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"solarYear":1990,"animal":"Horse","palace":{"key":"siblings","english":"Siblings","pinyin":"Xiongdi","chinese":"兄弟宫","theme":"Brothers, sisters, close peers","rules":["Sibling bonds"]},"disclaimer":"Zi Wei Dou Shu reference tables. Palace meanings and the 14 main stars here are static and do not vary with the birth date; only solarYear and animal derive from it. Star placement lives on POST /v1/ziwei/chart, which computes the soul and body palaces, the five-element class and every star from the lunar date and the birth hour. Where schools disagree we follow 中州派 (Zhongzhou, the Wang Tingzhi corpus); this is stated up front so results are comparable against the calculators built on the same tables."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/ziwei/palace-spouse":{"post":{"tags":["Zi Wei Dou Shu (Purple Star)"],"summary":"Spouse Palace (Fuqi)","description":"Marriage partner, romantic union.","operationId":"ziwei_palace-spouse","x-quality":"green","x-source":"中洲派 初階講義 安星口訣 for every placement rule, read alongside the 紫微斗數全書 line, with the 王亭之 corpus for the 四化 default. POST /ziwei/chart places the stars from the lunar date and the birth hour: soul and body palaces, the five-element class, all 14 main stars, the auxiliaries, the twelve life stages, the decade limits and the 四化. Pinned to three published charts. The remaining /ziwei/* paths are reference glossaries and say so in a computed:false field; /ziwei/full-chart is deprecated in favour of /ziwei/chart, sunset 2027-11-26.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ZiweiDateInput"},"example":{"date":"1990-06-15"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/ziwei/palace-spouse \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-06-15\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/ziwei/palace-spouse', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-06-15\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/ziwei/palace-spouse',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-06-15\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('ziwei/palace-spouse', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-06-15',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"solarYear":{"type":"number","nullable":true},"animal":{"type":"string","nullable":true},"palace":{"type":"object","properties":{"key":{"type":"string","nullable":true},"english":{"type":"string","nullable":true},"pinyin":{"type":"string","nullable":true},"chinese":{"type":"string","nullable":true},"theme":{"type":"string","nullable":true},"rules":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}},"nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"solarYear":1990,"animal":"Horse","palace":{"key":"spouse","english":"Spouse / Marriage","pinyin":"Fuqi","chinese":"夫妻宫","theme":"Marriage partner, romantic union","rules":["Spouse personality"]},"disclaimer":"Zi Wei Dou Shu reference tables. Palace meanings and the 14 main stars here are static and do not vary with the birth date; only solarYear and animal derive from it. Star placement lives on POST /v1/ziwei/chart, which computes the soul and body palaces, the five-element class and every star from the lunar date and the birth hour. Where schools disagree we follow 中州派 (Zhongzhou, the Wang Tingzhi corpus); this is stated up front so results are comparable against the calculators built on the same tables."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/ziwei/palace-children":{"post":{"tags":["Zi Wei Dou Shu (Purple Star)"],"summary":"Children Palace (Zinu)","description":"Children, fertility, juniors.","operationId":"ziwei_palace-children","x-quality":"green","x-source":"中洲派 初階講義 安星口訣 for every placement rule, read alongside the 紫微斗數全書 line, with the 王亭之 corpus for the 四化 default. POST /ziwei/chart places the stars from the lunar date and the birth hour: soul and body palaces, the five-element class, all 14 main stars, the auxiliaries, the twelve life stages, the decade limits and the 四化. Pinned to three published charts. The remaining /ziwei/* paths are reference glossaries and say so in a computed:false field; /ziwei/full-chart is deprecated in favour of /ziwei/chart, sunset 2027-11-26.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ZiweiDateInput"},"example":{"date":"1990-06-15"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/ziwei/palace-children \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-06-15\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/ziwei/palace-children', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-06-15\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/ziwei/palace-children',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-06-15\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('ziwei/palace-children', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-06-15',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"solarYear":{"type":"number","nullable":true},"animal":{"type":"string","nullable":true},"palace":{"type":"object","properties":{"key":{"type":"string","nullable":true},"english":{"type":"string","nullable":true},"pinyin":{"type":"string","nullable":true},"chinese":{"type":"string","nullable":true},"theme":{"type":"string","nullable":true},"rules":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}},"nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"solarYear":1990,"animal":"Horse","palace":{"key":"children","english":"Children","pinyin":"Zinu","chinese":"子女宫","theme":"Children, fertility, juniors","rules":["Number of children"]},"disclaimer":"Zi Wei Dou Shu reference tables. Palace meanings and the 14 main stars here are static and do not vary with the birth date; only solarYear and animal derive from it. Star placement lives on POST /v1/ziwei/chart, which computes the soul and body palaces, the five-element class and every star from the lunar date and the birth hour. Where schools disagree we follow 中州派 (Zhongzhou, the Wang Tingzhi corpus); this is stated up front so results are comparable against the calculators built on the same tables."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/ziwei/palace-wealth":{"post":{"tags":["Zi Wei Dou Shu (Purple Star)"],"summary":"Wealth Palace (Caibo)","description":"Income, material prosperity.","operationId":"ziwei_palace-wealth","x-quality":"green","x-source":"中洲派 初階講義 安星口訣 for every placement rule, read alongside the 紫微斗數全書 line, with the 王亭之 corpus for the 四化 default. POST /ziwei/chart places the stars from the lunar date and the birth hour: soul and body palaces, the five-element class, all 14 main stars, the auxiliaries, the twelve life stages, the decade limits and the 四化. Pinned to three published charts. The remaining /ziwei/* paths are reference glossaries and say so in a computed:false field; /ziwei/full-chart is deprecated in favour of /ziwei/chart, sunset 2027-11-26.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ZiweiDateInput"},"example":{"date":"1990-06-15"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/ziwei/palace-wealth \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-06-15\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/ziwei/palace-wealth', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-06-15\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/ziwei/palace-wealth',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-06-15\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('ziwei/palace-wealth', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-06-15',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"solarYear":{"type":"number","nullable":true},"animal":{"type":"string","nullable":true},"palace":{"type":"object","properties":{"key":{"type":"string","nullable":true},"english":{"type":"string","nullable":true},"pinyin":{"type":"string","nullable":true},"chinese":{"type":"string","nullable":true},"theme":{"type":"string","nullable":true},"rules":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}},"nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"solarYear":1990,"animal":"Horse","palace":{"key":"wealth","english":"Wealth","pinyin":"Caibo","chinese":"财帛宫","theme":"Income, material prosperity","rules":["Earning capacity"]},"disclaimer":"Zi Wei Dou Shu reference tables. Palace meanings and the 14 main stars here are static and do not vary with the birth date; only solarYear and animal derive from it. Star placement lives on POST /v1/ziwei/chart, which computes the soul and body palaces, the five-element class and every star from the lunar date and the birth hour. Where schools disagree we follow 中州派 (Zhongzhou, the Wang Tingzhi corpus); this is stated up front so results are comparable against the calculators built on the same tables."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/ziwei/palace-health":{"post":{"tags":["Zi Wei Dou Shu (Purple Star)"],"summary":"Health Palace (Ji'e)","description":"Body, illness, weak points.","operationId":"ziwei_palace-health","x-quality":"green","x-source":"中洲派 初階講義 安星口訣 for every placement rule, read alongside the 紫微斗數全書 line, with the 王亭之 corpus for the 四化 default. POST /ziwei/chart places the stars from the lunar date and the birth hour: soul and body palaces, the five-element class, all 14 main stars, the auxiliaries, the twelve life stages, the decade limits and the 四化. Pinned to three published charts. The remaining /ziwei/* paths are reference glossaries and say so in a computed:false field; /ziwei/full-chart is deprecated in favour of /ziwei/chart, sunset 2027-11-26.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ZiweiDateInput"},"example":{"date":"1990-06-15"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/ziwei/palace-health \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-06-15\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/ziwei/palace-health', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-06-15\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/ziwei/palace-health',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-06-15\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('ziwei/palace-health', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-06-15',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"solarYear":{"type":"number","nullable":true},"animal":{"type":"string","nullable":true},"palace":{"type":"object","properties":{"key":{"type":"string","nullable":true},"english":{"type":"string","nullable":true},"pinyin":{"type":"string","nullable":true},"chinese":{"type":"string","nullable":true},"theme":{"type":"string","nullable":true},"rules":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}},"nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"solarYear":1990,"animal":"Horse","palace":{"key":"health","english":"Health / Disease","pinyin":"Ji'e","chinese":"疾厄宫","theme":"Body, illness, weak points","rules":["Constitutional health"]},"disclaimer":"Zi Wei Dou Shu reference tables. Palace meanings and the 14 main stars here are static and do not vary with the birth date; only solarYear and animal derive from it. Star placement lives on POST /v1/ziwei/chart, which computes the soul and body palaces, the five-element class and every star from the lunar date and the birth hour. Where schools disagree we follow 中州派 (Zhongzhou, the Wang Tingzhi corpus); this is stated up front so results are comparable against the calculators built on the same tables."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/ziwei/palace-travel":{"post":{"tags":["Zi Wei Dou Shu (Purple Star)"],"summary":"Travel Palace (Qianyi)","description":"Travel, relocation, foreign opportunities.","operationId":"ziwei_palace-travel","x-quality":"green","x-source":"中洲派 初階講義 安星口訣 for every placement rule, read alongside the 紫微斗數全書 line, with the 王亭之 corpus for the 四化 default. POST /ziwei/chart places the stars from the lunar date and the birth hour: soul and body palaces, the five-element class, all 14 main stars, the auxiliaries, the twelve life stages, the decade limits and the 四化. Pinned to three published charts. The remaining /ziwei/* paths are reference glossaries and say so in a computed:false field; /ziwei/full-chart is deprecated in favour of /ziwei/chart, sunset 2027-11-26.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ZiweiDateInput"},"example":{"date":"1990-06-15"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/ziwei/palace-travel \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-06-15\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/ziwei/palace-travel', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-06-15\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/ziwei/palace-travel',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-06-15\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('ziwei/palace-travel', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-06-15',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"solarYear":{"type":"number","nullable":true},"animal":{"type":"string","nullable":true},"palace":{"type":"object","properties":{"key":{"type":"string","nullable":true},"english":{"type":"string","nullable":true},"pinyin":{"type":"string","nullable":true},"chinese":{"type":"string","nullable":true},"theme":{"type":"string","nullable":true},"rules":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}},"nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"solarYear":1990,"animal":"Horse","palace":{"key":"travel","english":"Travel / Movement","pinyin":"Qianyi","chinese":"迁移宫","theme":"Travel, relocation, foreign opportunities","rules":["Migration"]},"disclaimer":"Zi Wei Dou Shu reference tables. Palace meanings and the 14 main stars here are static and do not vary with the birth date; only solarYear and animal derive from it. Star placement lives on POST /v1/ziwei/chart, which computes the soul and body palaces, the five-element class and every star from the lunar date and the birth hour. Where schools disagree we follow 中州派 (Zhongzhou, the Wang Tingzhi corpus); this is stated up front so results are comparable against the calculators built on the same tables."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/ziwei/palace-career":{"post":{"tags":["Zi Wei Dou Shu (Purple Star)"],"summary":"Career Palace (Guanlu)","description":"Profession, status, official position.","operationId":"ziwei_palace-career","x-quality":"green","x-source":"中洲派 初階講義 安星口訣 for every placement rule, read alongside the 紫微斗數全書 line, with the 王亭之 corpus for the 四化 default. POST /ziwei/chart places the stars from the lunar date and the birth hour: soul and body palaces, the five-element class, all 14 main stars, the auxiliaries, the twelve life stages, the decade limits and the 四化. Pinned to three published charts. The remaining /ziwei/* paths are reference glossaries and say so in a computed:false field; /ziwei/full-chart is deprecated in favour of /ziwei/chart, sunset 2027-11-26.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ZiweiDateInput"},"example":{"date":"1990-06-15"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/ziwei/palace-career \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-06-15\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/ziwei/palace-career', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-06-15\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/ziwei/palace-career',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-06-15\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('ziwei/palace-career', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-06-15',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"solarYear":{"type":"number","nullable":true},"animal":{"type":"string","nullable":true},"palace":{"type":"object","properties":{"key":{"type":"string","nullable":true},"english":{"type":"string","nullable":true},"pinyin":{"type":"string","nullable":true},"chinese":{"type":"string","nullable":true},"theme":{"type":"string","nullable":true},"rules":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}},"nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"solarYear":1990,"animal":"Horse","palace":{"key":"career","english":"Career","pinyin":"Guanlu","chinese":"官禄宫","theme":"Profession, status, official position","rules":["Career path"]},"disclaimer":"Zi Wei Dou Shu reference tables. Palace meanings and the 14 main stars here are static and do not vary with the birth date; only solarYear and animal derive from it. Star placement lives on POST /v1/ziwei/chart, which computes the soul and body palaces, the five-element class and every star from the lunar date and the birth hour. Where schools disagree we follow 中州派 (Zhongzhou, the Wang Tingzhi corpus); this is stated up front so results are comparable against the calculators built on the same tables."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/ziwei/palace-property":{"post":{"tags":["Zi Wei Dou Shu (Purple Star)"],"summary":"Property Palace (Tianzhai)","description":"Real estate, family home, ancestry.","operationId":"ziwei_palace-property","x-quality":"green","x-source":"中洲派 初階講義 安星口訣 for every placement rule, read alongside the 紫微斗數全書 line, with the 王亭之 corpus for the 四化 default. POST /ziwei/chart places the stars from the lunar date and the birth hour: soul and body palaces, the five-element class, all 14 main stars, the auxiliaries, the twelve life stages, the decade limits and the 四化. Pinned to three published charts. The remaining /ziwei/* paths are reference glossaries and say so in a computed:false field; /ziwei/full-chart is deprecated in favour of /ziwei/chart, sunset 2027-11-26.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ZiweiDateInput"},"example":{"date":"1990-06-15"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/ziwei/palace-property \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-06-15\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/ziwei/palace-property', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-06-15\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/ziwei/palace-property',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-06-15\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('ziwei/palace-property', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-06-15',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"solarYear":{"type":"number","nullable":true},"animal":{"type":"string","nullable":true},"palace":{"type":"object","properties":{"key":{"type":"string","nullable":true},"english":{"type":"string","nullable":true},"pinyin":{"type":"string","nullable":true},"chinese":{"type":"string","nullable":true},"theme":{"type":"string","nullable":true},"rules":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}},"nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"solarYear":1990,"animal":"Horse","palace":{"key":"property","english":"Property / Home","pinyin":"Tianzhai","chinese":"田宅宫","theme":"Real estate, family home, ancestry","rules":["Property luck"]},"disclaimer":"Zi Wei Dou Shu reference tables. Palace meanings and the 14 main stars here are static and do not vary with the birth date; only solarYear and animal derive from it. Star placement lives on POST /v1/ziwei/chart, which computes the soul and body palaces, the five-element class and every star from the lunar date and the birth hour. Where schools disagree we follow 中州派 (Zhongzhou, the Wang Tingzhi corpus); this is stated up front so results are comparable against the calculators built on the same tables."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/midpoints":{"post":{"tags":["Aspects & Points"],"summary":"Midpoints","description":"Calculate all planetary midpoints and their zodiac positions. Optionally include midpoint aspects to natal points.","operationId":"midpoints","x-quality":"green","x-source":"Aspect orbs per Robert Hand \"Planets in Aspect\" 1975 + Lilly traditional orbs. Midpoints per Ebertin 1940 (8H). Antiscia per Vettius Valens (PD). Fixed stars per Vivian Robson \"Fixed Stars and Constellations\" 1923 (PD).","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/midpoints \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/midpoints', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/midpoints',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('midpoints', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"midpoints":{"type":"array","items":{"type":"object","properties":{"planet1Id":{"type":"number","nullable":true},"planet1Name":{"type":"string","nullable":true},"planet2Id":{"type":"number","nullable":true},"planet2Name":{"type":"string","nullable":true},"longitude":{"type":"number","nullable":true},"longitude90":{"type":"number","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"midpoints":[{"planet1Id":0,"planet1Name":"Sun","planet2Id":1,"planet2Name":"Moon","longitude":355.6403537890938,"longitude90":85.64035378909381}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/midpoint-trees":{"post":{"tags":["Aspects & Points"],"summary":"Midpoint Trees (Uranian)","description":"Calculate Uranian midpoint trees and planetary pictures (symmetries) for each focal planet within a given orb.","operationId":"midpoint-trees","x-quality":"green","x-source":"Aspect orbs per Robert Hand \"Planets in Aspect\" 1975 + Lilly traditional orbs. Midpoints per Ebertin 1940 (8H). Antiscia per Vettius Valens (PD). Fixed stars per Vivian Robson \"Fixed Stars and Constellations\" 1923 (PD).","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MidpointTrees"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52,"orb":1.5}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/midpoint-trees \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52, \"orb\": 1.5 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/midpoint-trees', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52,\n    \"orb\": 1.5\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/midpoint-trees',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52,\n      'orb': 1.5\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('midpoint-trees', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n        'orb' => 1.5,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"trees":{"type":"array","items":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"midpoints":{"type":"array","items":{"type":"object","properties":{"pair":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"pairNames":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"orb":{"type":"number","nullable":true}},"nullable":true},"nullable":true}},"nullable":true},"nullable":true},"symmetries":{"type":"array","items":{"type":"object","properties":{"pair1":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"pair1Names":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"pair2":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"pair2Names":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"orb":{"type":"number","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"trees":[{"planet":1,"planetName":"Moon","midpoints":[{"pair":[11],"pairNames":["true Node"],"orb":0.17008895241192334}]}],"symmetries":[{"pair1":[0],"pair1Names":["Sun"],"pair2":[1],"pair2Names":["Moon"],"orb":0.003731016016544686}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/antiscia":{"post":{"tags":["Aspects & Points"],"summary":"Antiscia","description":"Calculate antiscia (mirror points along the Cancer/Capricorn axis) and contra-antiscia, plus their aspects to natal planets.","operationId":"antiscia","x-quality":"green","x-source":"Aspect orbs per Robert Hand \"Planets in Aspect\" 1975 + Lilly traditional orbs. Midpoints per Ebertin 1940 (8H). Antiscia per Vettius Valens (PD). Fixed stars per Vivian Robson \"Fixed Stars and Constellations\" 1923 (PD).","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/antiscia \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/antiscia', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/antiscia',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('antiscia', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"antiscia":{"type":"array","items":{"type":"object","properties":{"planetId":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"antiscion":{"type":"number","nullable":true},"contraAntiscion":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"aspects":{"type":"array","items":{},"nullable":true}}}}},"example":{"ok":true,"data":{"antiscia":[{"planetId":0,"planetName":"Sun","antiscion":125.62398019832818,"contraAntiscion":305.6239801983282}],"aspects":[]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/parallel-aspects":{"post":{"tags":["Aspects & Points"],"summary":"Parallel Aspects","description":"Calculate parallel (same declination) and contra-parallel (opposite declination) aspects between all planets within orb.","operationId":"parallel-aspects","x-quality":"green","x-source":"Aspect orbs per Robert Hand \"Planets in Aspect\" 1975 + Lilly traditional orbs. Midpoints per Ebertin 1940 (8H). Antiscia per Vettius Valens (PD). Fixed stars per Vivian Robson \"Fixed Stars and Constellations\" 1923 (PD).","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ParallelAspects"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52,"orb":1}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/parallel-aspects \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52, \"orb\": 1 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/parallel-aspects', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52,\n    \"orb\": 1\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/parallel-aspects',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52,\n      'orb': 1\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('parallel-aspects', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n        'orb' => 1,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"parallels":{"type":"array","items":{"type":"object","properties":{"planet1":{"type":"string","nullable":true},"planet2":{"type":"string","nullable":true},"planet1Id":{"type":"number","nullable":true},"planet2Id":{"type":"number","nullable":true},"type":{"type":"string","nullable":true},"exactDiff":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"parallels":[{"planet1":"Moon","planet2":"Saturn","planet1Id":1,"planet2Id":6,"type":"parallel","exactDiff":0.9889902750346735,"orb":0.9889902750346735}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/arabic-parts":{"post":{"tags":["Aspects & Points"],"summary":"Arabic Parts (Lots)","description":"Calculate Arabic parts (Lots) from a natal chart. Returns positions for standard lots (Fortune, Spirit, etc.) and any custom formula.","operationId":"arabic-parts","x-quality":"green","x-source":"Aspect orbs per Robert Hand \"Planets in Aspect\" 1975 + Lilly traditional orbs. Midpoints per Ebertin 1940 (8H). Antiscia per Vettius Valens (PD). Fixed stars per Vivian Robson \"Fixed Stars and Constellations\" 1923 (PD).","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ArabicParts"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52,"lots":["fortune","spirit","eros"]}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/arabic-parts \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52, \"lots\": [ \"fortune\", \"spirit\", \"eros\" ] }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/arabic-parts', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52,\n    \"lots\": [\n      \"fortune\",\n      \"spirit\",\n      \"eros\"\n    ]\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/arabic-parts',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52,\n      'lots': [\n        \"fortune\",\n        \"spirit\",\n        \"eros\"\n      ]\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('arabic-parts', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n        'lots' => ['fortune', 'spirit', 'eros'],\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"parts":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","nullable":true},"longitude":{"type":"number","nullable":true},"formula":{"type":"string","nullable":true},"flag":{"type":"string","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"parts":[{"name":"Pars of Fortune","longitude":52.49661802302876,"formula":"H1 + [Lun-Sun]","flag":"for"}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/fixed-stars":{"post":{"tags":["Aspects & Points"],"summary":"Fixed Stars","description":"Positions of fixed stars at the birth moment (36 classic stars, or the names in `stars`), and the conjunctions of natal planets with them within `orb` degrees (default 1, at most 5), closest first.","operationId":"fixed-stars","x-quality":"green","x-source":"Aspect orbs per Robert Hand \"Planets in Aspect\" 1975 + Lilly traditional orbs. Midpoints per Ebertin 1940 (8H). Antiscia per Vettius Valens (PD). Fixed stars per Vivian Robson \"Fixed Stars and Constellations\" 1923 (PD).","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52,"orb":1}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/fixed-stars \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52, \"orb\": 1 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/fixed-stars', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52,\n    \"orb\": 1\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/fixed-stars',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52,\n      'orb': 1\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('fixed-stars', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n        'orb' => 1,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"orb":{"type":"number","nullable":true},"conjunctions":{"type":"array","items":{"type":"object","properties":{"planet":{"type":"string","nullable":true},"planetLongitude":{"type":"number","nullable":true},"star":{"type":"string","nullable":true},"starLongitude":{"type":"number","nullable":true},"magnitude":{"type":"number","nullable":true},"aspect":{"type":"string","nullable":true},"orb":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"stars":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","nullable":true},"longitude":{"type":"number","nullable":true},"latitude":{"type":"number","nullable":true},"distance":{"type":"number","nullable":true},"magnitude":{"type":"number","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"orb":1,"conjunctions":[{"planet":"Mean Lilith","planetLongitude":231.4765781492152,"star":"Unukalhai","starLongitude":231.94943062285077,"magnitude":2.63,"aspect":"conjunction","orb":0.4729}],"stars":[{"name":"Aldebaran","longitude":69.65234551905289,"latitude":-5.468158864477149,"distance":4214537.357020248,"magnitude":0.86}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/fixed-stars/catalog":{"get":{"tags":["Aspects & Points"],"summary":"Fixed star catalogue","description":"The star names this API accepts, from Swiss Ephemeris `fixstars.cat`: traditional name, Bayer nomenclature, constellation and magnitude, with the 36-star astrological default set flagged. Optional `?maxMagnitude=` trims to the bright end. Static lookup, no chart needed.","operationId":"fixed-stars_catalog_get","x-quality":"green","x-source":"Swiss Ephemeris fixstars.cat verbatim, deduplicated by name and sorted by magnitude. No ephemeris call. Added so that the star-name refusal on /parans/star has somewhere to point.","security":[{"ApiKeyAuth":[]}],"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X GET https://api.astroway.info/v1/fixed-stars/catalog \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/fixed-stars/catalog', {\n  method: 'GET',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.get(\n    'https://api.astroway.info/v1/fixed-stars/catalog',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->get('fixed-stars/catalog', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"count":{"type":"number","nullable":true},"total":{"type":"number","nullable":true},"defaultSetSize":{"type":"number","nullable":true},"maxMagnitude":{"nullable":true},"source":{"type":"string","nullable":true},"stars":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","nullable":true},"traditionalName":{"type":"string","nullable":true},"nomenclature":{"type":"string","nullable":true},"constellation":{"type":"string","nullable":true},"magnitude":{"type":"number","nullable":true},"default":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"count":953,"total":953,"defaultSetSize":36,"maxMagnitude":null,"source":"Swiss Ephemeris fixstars.cat","stars":[{"name":"Sirius","traditionalName":"Sirius","nomenclature":"alCMa","constellation":"Canis Major","magnitude":-1.47,"default":true}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/gauquelin-sectors":{"post":{"tags":["Aspects & Points"],"summary":"Gauquelin Sectors","description":"Calculate Gauquelin sector positions (1–36) for all planets, indicating whether each planet is in a power zone.","operationId":"gauquelin-sectors","x-quality":"green","x-source":"Aspect orbs per Robert Hand \"Planets in Aspect\" 1975 + Lilly traditional orbs. Midpoints per Ebertin 1940 (8H). Antiscia per Vettius Valens (PD). Fixed stars per Vivian Robson \"Fixed Stars and Constellations\" 1923 (PD).","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/gauquelin-sectors \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/gauquelin-sectors', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/gauquelin-sectors',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('gauquelin-sectors', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"sectors":{"type":"array","items":{"type":"object","properties":{"planetId":{"type":"number","nullable":true},"sector":{"type":"number","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"sectors":[{"planetId":0,"sector":12}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/sabian-symbols":{"post":{"tags":["Aspects & Points"],"summary":"Sabian Symbols","description":"Return the Sabian symbol (Dane Rudhyar) for each given ecliptic longitude.","operationId":"sabian-symbols","x-quality":"green","x-source":"Aspect orbs per Robert Hand \"Planets in Aspect\" 1975 + Lilly traditional orbs. Midpoints per Ebertin 1940 (8H). Antiscia per Vettius Valens (PD). Fixed stars per Vivian Robson \"Fixed Stars and Constellations\" 1923 (PD).","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Sabian"},"example":{"longitudes":[54.2,123.7,215.3,287.5]}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/sabian-symbols \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"longitudes\": [ 54.2, 123.7, 215.3, 287.5 ] }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/sabian-symbols', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"longitudes\": [\n      54.2,\n      123.7,\n      215.3,\n      287.5\n    ]\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/sabian-symbols',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'longitudes': [\n        54.2,\n        123.7,\n        215.3,\n        287.5\n      ]\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('sabian-symbols', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'longitudes' => [54.2, 123.7, 215.3, 287.5],\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"count":{"type":"number","nullable":true},"symbols":{"type":"array","items":{"type":"object","properties":{"longitude":{"type":"number","nullable":true},"sign":{"type":"number","nullable":true},"degree":{"type":"number","nullable":true},"symbol":{"nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"count":4,"symbols":[{"longitude":54.2,"sign":1,"degree":25,"symbol":null}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/aspect-timeline":{"post":{"tags":["Aspects & Points"],"summary":"Aspect Timeline","description":"Calculate a timeline of when two specific planets form an exact aspect within a date range, including enter/exact/leave dates.","operationId":"aspect-timeline","x-quality":"green","x-source":"Aspect orbs per Robert Hand \"Planets in Aspect\" 1975 + Lilly traditional orbs. Midpoints per Ebertin 1940 (8H). Antiscia per Vettius Valens (PD). Fixed stars per Vivian Robson \"Fixed Stars and Constellations\" 1923 (PD).","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AspectTimeline"},"example":{"planet1Id":0,"planet2Id":6,"aspectAngle":90,"startDate":"2024-01-01","endDate":"2024-12-31","orb":3}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/aspect-timeline \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"planet1Id\": 0, \"planet2Id\": 6, \"aspectAngle\": 90, \"startDate\": \"2024-01-01\", \"endDate\": \"2024-12-31\", \"orb\": 3 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/aspect-timeline', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"planet1Id\": 0,\n    \"planet2Id\": 6,\n    \"aspectAngle\": 90,\n    \"startDate\": \"2024-01-01\",\n    \"endDate\": \"2024-12-31\",\n    \"orb\": 3\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/aspect-timeline',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'planet1Id': 0,\n      'planet2Id': 6,\n      'aspectAngle': 90,\n      'startDate': \"2024-01-01\",\n      'endDate': \"2024-12-31\",\n      'orb': 3\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('aspect-timeline', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'planet1Id' => 0,\n        'planet2Id' => 6,\n        'aspectAngle' => 90,\n        'startDate' => '2024-01-01',\n        'endDate' => '2024-12-31',\n        'orb' => 3,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"count":{"type":"number","nullable":true},"timelines":{"type":"array","items":{"type":"object","properties":{"planet1Id":{"type":"number","nullable":true},"planet2Id":{"type":"number","nullable":true},"aspect":{"type":"object","properties":{"name":{"type":"string","nullable":true},"i18nKey":{"type":"string","nullable":true},"angle":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true},"symbol":{"type":"string","nullable":true},"isMajor":{"type":"boolean","nullable":true},"color":{"type":"string","nullable":true}},"nullable":true},"orbSeries":{"type":"array","items":{"type":"object","properties":{"jd":{"type":"number","nullable":true},"date":{"type":"string","nullable":true},"orb":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"exactDates":{"type":"array","items":{},"nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"count":168,"timelines":[{"planet1Id":0,"planet2Id":1,"aspect":{"name":"Conjunction","i18nKey":"aspect_conjunction","angle":0,"orb":12,"symbol":"☌","isMajor":true,"color":"#660480"},"orbSeries":[{"jd":2460321,"date":"2024-01-11T12:00:00.000Z","orb":0.024571774590640416}],"exactDates":[]}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/aspect-bar":{"post":{"tags":["Aspects & Points"],"summary":"Aspect Bars (Gantt)","description":"Transform aspect timelines into Gantt-style bars grouped by transit planet. Each bar shows the duration an aspect is in orb, with exact dates marked. Useful for visual transit calendars.","operationId":"aspect-bar","x-quality":"green","x-source":"Aspect orbs per Robert Hand \"Planets in Aspect\" 1975 + Lilly traditional orbs. Midpoints per Ebertin 1940 (8H). Antiscia per Vettius Valens (PD). Fixed stars per Vivian Robson \"Fixed Stars and Constellations\" 1923 (PD).","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AspectBar"},"example":{"startDate":"2024-01-01","endDate":"2024-06-30","stepDays":1,"visiblePlanetIds":[0,1,2,3,4,5,6,7,8,9]}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/aspect-bar \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"startDate\": \"2024-01-01\", \"endDate\": \"2024-06-30\", \"stepDays\": 1, \"visiblePlanetIds\": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ] }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/aspect-bar', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"startDate\": \"2024-01-01\",\n    \"endDate\": \"2024-06-30\",\n    \"stepDays\": 1,\n    \"visiblePlanetIds\": [\n      0,\n      1,\n      2,\n      3,\n      4,\n      5,\n      6,\n      7,\n      8,\n      9\n    ]\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/aspect-bar',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'startDate': \"2024-01-01\",\n      'endDate': \"2024-06-30\",\n      'stepDays': 1,\n      'visiblePlanetIds': [\n        0,\n        1,\n        2,\n        3,\n        4,\n        5,\n        6,\n        7,\n        8,\n        9\n      ]\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('aspect-bar', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'startDate' => '2024-01-01',\n        'endDate' => '2024-06-30',\n        'stepDays' => 1,\n        'visiblePlanetIds' => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"rows":{"type":"number","nullable":true},"bars":{"type":"object","properties":{"rows":{"type":"array","items":{"type":"object","properties":{"planetId":{"type":"number","nullable":true},"bars":{"type":"array","items":{"type":"object","properties":{"transitPlanetId":{"type":"number","nullable":true},"targetPlanetId":{"type":"number","nullable":true},"aspect":{"type":"object","properties":{"name":{"type":"string","nullable":true},"i18nKey":{"type":"string","nullable":true},"angle":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true},"symbol":{"type":"string","nullable":true},"isMajor":{"type":"boolean","nullable":true},"color":{"type":"string","nullable":true}},"nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"exactDates":{"type":"array","items":{"type":"object","properties":{"jd":{"type":"number","nullable":true},"date":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"nature":{"type":"string","nullable":true},"lane":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"maxLanes":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"timeRange":{"type":"object","properties":{"start":{"type":"string","nullable":true},"end":{"type":"string","nullable":true}},"nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"rows":9,"bars":{"rows":[{"planetId":0,"bars":[{"transitPlanetId":0,"targetPlanetId":1,"aspect":{"name":"Trine","i18nKey":"aspect_trine","angle":120,"orb":12,"symbol":"△","isMajor":true,"color":"#3366cc"},"startDate":"2024-01-01T12:00:00.000Z","endDate":"2024-06-26T12:00:00.000Z","startJd":2460311,"endJd":2460488,"exactDates":[{"jd":2460340.7539681466,"date":"2024-01-31T06:05:43.000Z"}],"nature":"harmonious","lane":0}],"maxLanes":11}],"timeRange":{"start":"2024-01-01T12:00:00.000Z","end":"2024-06-30T12:00:00.000Z"}}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/eclipses":{"post":{"tags":["Calendar & Cycles"],"summary":"Eclipses","description":"Find solar and lunar eclipses within a given year or multi-year range. Returns type, date, and geographic visibility data.","operationId":"eclipses","x-quality":"green","x-source":"Eclipse calendar via Swiss Ephemeris (Espenak NASA correlation). Lunar calendar per Drik Panchang conventions. Ingresses + planetary cycles use Swiss Ephemeris ephemeris range.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Eclipses"},"example":{"year":2024,"yearsRange":2}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/eclipses \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"year\": 2024, \"yearsRange\": 2 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/eclipses', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"year\": 2024,\n    \"yearsRange\": 2\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/eclipses',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'year': 2024,\n      'yearsRange': 2\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('eclipses', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'year' => 2024,\n        'yearsRange' => 2,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"eclipses":{"type":"array","items":{"type":"object","properties":{"kind":{"type":"string","nullable":true},"type":{"type":"string","nullable":true},"maxJd":{"type":"number","nullable":true},"maxDate":{"type":"string","nullable":true},"beginJd":{"type":"number","nullable":true},"beginDate":{"type":"string","nullable":true},"endJd":{"type":"number","nullable":true},"endDate":{"type":"string","nullable":true},"longitude":{"type":"number","nullable":true},"signIndex":{"type":"number","nullable":true},"totalityBeginJd":{"type":"number","nullable":true},"totalityEndJd":{"type":"number","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"eclipses":[{"kind":"solar","type":"hybrid","maxJd":2460054.6783186323,"maxDate":"2023-04-20T04:16:47.000Z","beginJd":2460054.565720898,"beginDate":"2023-04-20T01:34:38.000Z","endJd":2460054.791215786,"endDate":"2023-04-20T06:59:21.000Z","longitude":29.839278300586834,"signIndex":0,"totalityBeginJd":2460054.6091770693,"totalityEndJd":2460054.7477158764}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/ingresses":{"post":{"tags":["Calendar & Cycles"],"summary":"Planet Ingresses","description":"Find all sign ingresses for a planet within a date range (including retrograde re-entries).","operationId":"ingresses","x-quality":"green","x-source":"Eclipse calendar via Swiss Ephemeris (Espenak NASA correlation). Lunar calendar per Drik Panchang conventions. Ingresses + planetary cycles use Swiss Ephemeris ephemeris range.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ingresses"},"example":{"planetId":5,"startDate":"2024-01-01","endDate":"2025-12-31"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/ingresses \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"planetId\": 5, \"startDate\": \"2024-01-01\", \"endDate\": \"2025-12-31\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/ingresses', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"planetId\": 5,\n    \"startDate\": \"2024-01-01\",\n    \"endDate\": \"2025-12-31\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/ingresses',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'planetId': 5,\n      'startDate': \"2024-01-01\",\n      'endDate': \"2025-12-31\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('ingresses', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'planetId' => 5,\n        'startDate' => '2024-01-01',\n        'endDate' => '2025-12-31',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"ingresses":{"type":"array","items":{"type":"object","properties":{"jd":{"type":"number","nullable":true},"date":{"type":"string","nullable":true},"signIndex":{"type":"number","nullable":true},"signI18nKey":{"type":"string","nullable":true},"signSymbol":{"type":"string","nullable":true},"longitude":{"type":"number","nullable":true},"isRetrograde":{"type":"boolean","nullable":true},"planetId":{"type":"number","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"ingresses":[{"jd":2460456.4687805176,"date":"2024-05-25T23:15:03.000Z","signIndex":2,"signI18nKey":"sign_gemini","signSymbol":"♊","longitude":60.000034547003246,"isRetrograde":false,"planetId":5}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/planetary-cycles":{"post":{"tags":["Calendar & Cycles"],"summary":"Planetary Cycles","description":"Find all conjunctions between two planets within a date range, defining the start of a new synodic cycle.","operationId":"planetary-cycles","x-quality":"green","x-source":"Eclipse calendar via Swiss Ephemeris (Espenak NASA correlation). Lunar calendar per Drik Panchang conventions. Ingresses + planetary cycles use Swiss Ephemeris ephemeris range.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanetaryCycles"},"example":{"planet1Id":5,"planet2Id":6,"startDate":"2000-01-01","endDate":"2040-12-31"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/planetary-cycles \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"planet1Id\": 5, \"planet2Id\": 6, \"startDate\": \"2000-01-01\", \"endDate\": \"2040-12-31\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/planetary-cycles', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"planet1Id\": 5,\n    \"planet2Id\": 6,\n    \"startDate\": \"2000-01-01\",\n    \"endDate\": \"2040-12-31\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/planetary-cycles',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'planet1Id': 5,\n      'planet2Id': 6,\n      'startDate': \"2000-01-01\",\n      'endDate': \"2040-12-31\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('planetary-cycles', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'planet1Id' => 5,\n        'planet2Id' => 6,\n        'startDate' => '2000-01-01',\n        'endDate' => '2040-12-31',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"conjunctions":{"type":"array","items":{"type":"object","properties":{"jd":{"type":"number","nullable":true},"date":{"type":"string","nullable":true},"planet1Id":{"type":"number","nullable":true},"planet2Id":{"type":"number","nullable":true},"longitude":{"type":"number","nullable":true},"signIndex":{"type":"number","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"conjunctions":[{"jd":2451693.169326782,"date":"2000-05-28T16:03:50.000Z","planet1Id":5,"planet2Id":6,"longitude":52.721360573887324,"signIndex":1}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/retrograde-periods":{"post":{"tags":["Calendar & Cycles"],"summary":"Retrograde Periods","description":"Retrograde periods of the planets in `planetIds` (default Mercury) within a date range: the two stations and their longitudes, plus `shadowStart` (the planet first reaches the longitude of its direct station) and `shadowEnd` (it regains the longitude of its retrograde station).","operationId":"retrograde-periods","x-quality":"green","x-source":"Eclipse calendar via Swiss Ephemeris (Espenak NASA correlation). Lunar calendar per Drik Panchang conventions. Ingresses + planetary cycles use Swiss Ephemeris ephemeris range.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Retrograde"},"example":{"planetIds":[2],"startDate":"2024-01-01","endDate":"2024-12-31"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/retrograde-periods \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"planetIds\": [ 2 ], \"startDate\": \"2024-01-01\", \"endDate\": \"2024-12-31\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/retrograde-periods', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"planetIds\": [\n      2\n    ],\n    \"startDate\": \"2024-01-01\",\n    \"endDate\": \"2024-12-31\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/retrograde-periods',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'planetIds': [\n        2\n      ],\n      'startDate': \"2024-01-01\",\n      'endDate': \"2024-12-31\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('retrograde-periods', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'planetIds' => [2],\n        'startDate' => '2024-01-01',\n        'endDate' => '2024-12-31',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"periods":{"type":"array","items":{"type":"object","properties":{"planetId":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"retroStart":{"type":"string","nullable":true},"retroEnd":{"type":"string","nullable":true},"stationRetroLong":{"type":"number","nullable":true},"stationDirectLong":{"type":"number","nullable":true},"shadowStart":{"type":"string","nullable":true},"shadowEnd":{"type":"string","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"periods":[{"planetId":2,"planetName":"Mercury","retroStart":"2024-04-01T22:14:30Z","retroEnd":"2024-04-25T12:54:07Z","stationRetroLong":27.218618740069505,"stationDirectLong":15.981207506060022,"shadowStart":"2024-03-19T03:39:08Z","shadowEnd":"2024-05-13T09:01:24Z"}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/moon-voc":{"post":{"tags":["Calendar & Cycles"],"summary":"Moon Void-of-Course","description":"Find Moon void-of-course periods within a date range. The Moon is VOC from its last aspect until it enters the next sign.","operationId":"moon-voc","x-quality":"green","x-source":"Eclipse calendar via Swiss Ephemeris (Espenak NASA correlation). Lunar calendar per Drik Panchang conventions. Ingresses + planetary cycles use Swiss Ephemeris ephemeris range.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MoonVoc"},"example":{"date":"2024-06-15","time":"12:00:00","timezoneOffset":0,"rangeDays":14}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/moon-voc \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"2024-06-15\", \"time\": \"12:00:00\", \"timezoneOffset\": 0, \"rangeDays\": 14 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/moon-voc', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"2024-06-15\",\n    \"time\": \"12:00:00\",\n    \"timezoneOffset\": 0,\n    \"rangeDays\": 14\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/moon-voc',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"2024-06-15\",\n      'time': \"12:00:00\",\n      'timezoneOffset': 0,\n      'rangeDays': 14\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('moon-voc', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '2024-06-15',\n        'time' => '12:00:00',\n        'timezoneOffset' => 0,\n        'rangeDays' => 14,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"periods":{"type":"array","items":{"type":"object","properties":{"startJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endJd":{"type":"number","nullable":true},"endDate":{"type":"string","nullable":true},"nextSignIndex":{"type":"number","nullable":true},"durationHours":{"type":"number","nullable":true},"lastAspect":{"type":"object","properties":{"planetId":{"type":"number","nullable":true},"aspectName":{"type":"string","nullable":true},"aspectSymbol":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"periods":[{"startJd":2460478.7364843767,"startDate":"2024-06-17T05:40:32.000Z","endJd":2460478.776328127,"endDate":"2024-06-17T06:37:55.000Z","nextSignIndex":7,"durationHours":0.9562500044703484,"lastAspect":{"planetId":2,"aspectName":"Trine","aspectSymbol":"△"}}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/planetary-hours":{"post":{"tags":["Calendar & Cycles"],"summary":"Planetary Hours","description":"Chaldean planetary hours for a date and place: 12 from sunrise to sunset and 12 from sunset to sunrise, so an hour is rarely 60 minutes. `startHour` and `endHour` are decimal local hours. Send `atLocalHour` (decimal local time, e.g. 15.2 for 15:12) to have the hour containing it marked `isCurrent`; without it no hour carries the field, because the answer is cacheable and a flag from the server clock would be stale by the time it renders. `sunTimes.polarState` is `normal`, `polar-day` or `polar-night`, and in the two polar cases there is nothing to divide, so `hours` comes back empty with a warning saying why.","operationId":"planetary-hours","x-quality":"green","x-source":"Eclipse calendar via Swiss Ephemeris (Espenak NASA correlation). Lunar calendar per Drik Panchang conventions. Ingresses + planetary cycles use Swiss Ephemeris ephemeris range.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanetaryHours"},"example":{"date":"2026-06-21","latitude":50.45,"longitude":30.52,"timezoneOffset":3,"atLocalHour":15.2}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/planetary-hours \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"2026-06-21\", \"latitude\": 50.45, \"longitude\": 30.52, \"timezoneOffset\": 3, \"atLocalHour\": 15.2 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/planetary-hours', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"2026-06-21\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52,\n    \"timezoneOffset\": 3,\n    \"atLocalHour\": 15.2\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/planetary-hours',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"2026-06-21\",\n      'latitude': 50.45,\n      'longitude': 30.52,\n      'timezoneOffset': 3,\n      'atLocalHour': 15.2\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('planetary-hours', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '2026-06-21',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n        'timezoneOffset' => 3,\n        'atLocalHour' => 15.2,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"date":{"type":"string","nullable":true},"latitude":{"type":"number","nullable":true},"longitude":{"type":"number","nullable":true},"timezone":{"type":"number","nullable":true},"sunTimes":{"type":"object","properties":{"riseJD":{"type":"number","nullable":true},"setJD":{"type":"number","nullable":true},"riseHour":{"type":"number","nullable":true},"setHour":{"type":"number","nullable":true},"polarState":{"type":"string","nullable":true}},"nullable":true},"dayRulerPlanetId":{"type":"number","nullable":true},"dayRulerPlanetName":{"type":"string","nullable":true},"dayOfWeek":{"type":"number","nullable":true},"hours":{"type":"array","items":{"type":"object","properties":{"number":{"type":"number","nullable":true},"planetId":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"startHour":{"type":"number","nullable":true},"endHour":{"type":"number","nullable":true},"isDaytime":{"type":"boolean","nullable":true},"isCurrent":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"date":"2026-06-21","latitude":50.45,"longitude":30.52,"timezone":3,"sunTimes":{"riseJD":2461212.573777389,"setJD":2461213.2591750845,"riseHour":4.770657330751419,"setHour":21.220202028751373,"polarState":"normal"},"dayRulerPlanetId":0,"dayRulerPlanetName":"Sun","dayOfWeek":0,"hours":[{"number":1,"planetId":0,"planetName":"Sun","startHour":4.770657330751419,"endHour":6.141452722251415,"isDaytime":true,"isCurrent":false},{"number":8,"planetId":0,"planetName":"Sun","startHour":14.366225071251392,"endHour":15.737020462751389,"isDaytime":true,"isCurrent":true}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/lunar-calendar":{"post":{"tags":["Calendar & Cycles"],"summary":"Lunar Calendar","description":"Calculate a lunar calendar for a given month: Moon sign per day, lunar phases, void-of-course windows, and perigee/apogee.","operationId":"lunar-calendar","x-quality":"green","x-source":"Eclipse calendar via Swiss Ephemeris (Espenak NASA correlation). Lunar calendar per Drik Panchang conventions. Ingresses + planetary cycles use Swiss Ephemeris ephemeris range.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LunarCalendar"},"example":{"year":2024,"month":6}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/lunar-calendar \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"year\": 2024, \"month\": 6 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/lunar-calendar', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"year\": 2024,\n    \"month\": 6\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/lunar-calendar',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'year': 2024,\n      'month': 6\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('lunar-calendar', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'year' => 2024,\n        'month' => 6,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"year":{"type":"number","nullable":true},"month":{"type":"number","nullable":true},"phases":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","nullable":true},"jd":{"type":"number","nullable":true},"date":{"type":"string","nullable":true},"longitude":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"ingresses":{"type":"array","items":{"type":"object","properties":{"jd":{"type":"number","nullable":true},"date":{"type":"string","nullable":true},"signIndex":{"type":"number","nullable":true},"longitude":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"voidPeriods":{"type":"array","items":{"type":"object","properties":{"startJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endJd":{"type":"number","nullable":true},"endDate":{"type":"string","nullable":true},"nextSignIndex":{"type":"number","nullable":true},"durationHours":{"type":"number","nullable":true},"lastAspect":{"type":"object","properties":{"planetId":{"type":"number","nullable":true},"aspectName":{"type":"string","nullable":true},"aspectSymbol":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"nullable":true},"moonAspects":{"type":"array","items":{"type":"object","properties":{"jd":{"type":"number","nullable":true},"date":{"type":"string","nullable":true},"planetId":{"type":"number","nullable":true},"aspect":{"type":"object","properties":{"name":{"type":"string","nullable":true},"i18nKey":{"type":"string","nullable":true},"angle":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true},"symbol":{"type":"string","nullable":true},"isMajor":{"type":"boolean","nullable":true},"color":{"type":"string","nullable":true}},"nullable":true},"moonLongitude":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"dailyInfo":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string","nullable":true},"lunarDay":{"type":"number","nullable":true},"lunarDayStart":{"type":"string","nullable":true},"lunarDayEnd":{"type":"string","nullable":true},"moonSignIndex":{"type":"number","nullable":true},"moonLongitude":{"type":"number","nullable":true},"isVoC":{"type":"boolean","nullable":true},"phase":{"nullable":true},"ingress":{"type":"object","properties":{"jd":{"type":"number","nullable":true},"date":{"type":"string","nullable":true},"signIndex":{"type":"number","nullable":true},"longitude":{"type":"number","nullable":true}},"nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"year":2024,"month":6,"phases":[{"type":"new_moon","jd":2460468.0262145996,"date":"2024-06-06T12:37:45.000Z","longitude":76.29534844344522}],"ingresses":[{"jd":2460462.6447265614,"date":"2024-06-01T03:28:24.000Z","signIndex":0,"longitude":0}],"voidPeriods":[{"startJd":2460462.621328125,"startDate":"2024-06-01T02:54:43.000Z","endJd":2460462.644609375,"endDate":"2024-06-01T03:28:14.000Z","nextSignIndex":0,"durationHours":0.5587500035762787,"lastAspect":{"planetId":8,"aspectName":"Conjunction","aspectSymbol":"☌"}}],"moonAspects":[{"jd":2460462.6212771744,"date":"2024-06-01T02:55:00.000Z","planetId":8,"aspect":{"name":"Conjunction","i18nKey":"aspect_conjunction","angle":0,"orb":12,"symbol":"☌","isMajor":true,"color":"#660480"},"moonLongitude":359.66755752916276}],"dailyInfo":[{"date":"2024-06-01T00:00:00.000Z","lunarDay":25,"lunarDayStart":"2024-06-01T03:22:00.000Z","lunarDayEnd":"2024-06-02T03:22:00.000Z","moonSignIndex":0,"moonLongitude":5.05965072191194,"isVoC":true,"phase":null,"ingress":{"jd":2460462.6447265614,"date":"2024-06-01T03:28:24.000Z","signIndex":0,"longitude":0}}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/moon-aspects":{"post":{"tags":["Calendar & Cycles"],"summary":"Moon Aspects","description":"Calculate all aspects the Moon makes within a date range (applying and separating), useful for electional and horary work.","operationId":"moon-aspects","x-quality":"green","x-source":"Eclipse calendar via Swiss Ephemeris (Espenak NASA correlation). Lunar calendar per Drik Panchang conventions. Ingresses + planetary cycles use Swiss Ephemeris ephemeris range.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MoonAspects"},"example":{"year":2024,"month":6}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/moon-aspects \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"year\": 2024, \"month\": 6 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/moon-aspects', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"year\": 2024,\n    \"month\": 6\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/moon-aspects',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'year': 2024,\n      'month': 6\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('moon-aspects', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'year' => 2024,\n        'month' => 6,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"events":{"type":"array","items":{"type":"object","properties":{"jd":{"type":"number","nullable":true},"date":{"type":"string","nullable":true},"planetId":{"type":"number","nullable":true},"aspect":{"type":"object","properties":{"name":{"type":"string","nullable":true},"i18nKey":{"type":"string","nullable":true},"angle":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true},"symbol":{"type":"string","nullable":true},"isMajor":{"type":"boolean","nullable":true},"color":{"type":"string","nullable":true}},"nullable":true},"moonLongitude":{"type":"number","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"events":[{"jd":2460462.6212771744,"date":"2024-06-01T02:55:00.000Z","planetId":8,"aspect":{"name":"Conjunction","i18nKey":"aspect_conjunction","angle":0,"orb":12,"symbol":"☌","isMajor":true,"color":"#660480"},"moonLongitude":359.66755752916276}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/moon-phase":{"post":{"tags":["Calendar & Cycles"],"summary":"Moon Phase","description":"Current moon phase at a given moment: illumination %, age in days, elongation, waxing/waning, sun + moon zodiac signs. Geocentric Sun-Moon elongation per Meeus Ch.48.","operationId":"moon-phase","x-quality":"green","x-source":"Eclipse calendar via Swiss Ephemeris (Espenak NASA correlation). Lunar calendar per Drik Panchang conventions. Ingresses + planetary cycles use Swiss Ephemeris ephemeris range.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"2024-01-25","time":"12:00:00","latitude":0,"longitude":0,"timezoneOffset":0}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/moon-phase \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"2024-01-25\", \"time\": \"12:00:00\", \"latitude\": 0, \"longitude\": 0, \"timezoneOffset\": 0 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/moon-phase', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"2024-01-25\",\n    \"time\": \"12:00:00\",\n    \"latitude\": 0,\n    \"longitude\": 0,\n    \"timezoneOffset\": 0\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/moon-phase',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"2024-01-25\",\n      'time': \"12:00:00\",\n      'latitude': 0,\n      'longitude': 0,\n      'timezoneOffset': 0\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('moon-phase', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '2024-01-25',\n        'time' => '12:00:00',\n        'latitude' => 0,\n        'longitude' => 0,\n        'timezoneOffset' => 0,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"phase":{"type":"number","nullable":true},"phaseName":{"type":"string","nullable":true},"majorPhase":{"type":"string","nullable":true},"illuminationPercent":{"type":"number","nullable":true},"elongationDeg":{"type":"number","nullable":true},"ageDays":{"type":"number","nullable":true},"waxing":{"type":"boolean","nullable":true},"moonSign":{"type":"string","nullable":true},"sunSign":{"type":"string","nullable":true},"moonLongitude":{"type":"number","nullable":true},"sunLongitude":{"type":"number","nullable":true}}}}},"example":{"ok":true,"data":{"phase":0.999,"phaseName":"Full Moon","majorPhase":"full_moon","illuminationPercent":99.94,"elongationDeg":177.25,"ageDays":14.54,"waxing":true,"moonSign":"Leo","sunSign":"Aquarius","moonLongitude":122.24,"sunLongitude":304.99}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/houses":{"post":{"tags":["Calendar & Cycles"],"summary":"House Cusps","description":"Standalone house calculation: 12 cusps + ascendant + MC + ARMC + vertex + co-asc + polar-asc. Supports Placidus, Koch, Regiomontanus, Campanus, Topocentric, Whole Sign, Equal, Porphyry, Morinus etc. Auto-fallback warning on |lat|>66.5° quadrant systems.","operationId":"houses","x-quality":"green","x-source":"Eclipse calendar via Swiss Ephemeris (Espenak NASA correlation). Lunar calendar per Drik Panchang conventions. Ingresses + planetary cycles use Swiss Ephemeris ephemeris range.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1926-06-01","time":"09:30:00","timezoneOffset":-8,"latitude":34.0522,"longitude":-118.2437,"houseSystem":"P"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/houses \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1926-06-01\", \"time\": \"09:30:00\", \"timezoneOffset\": -8, \"latitude\": 34.0522, \"longitude\": -118.2437, \"houseSystem\": \"P\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/houses', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1926-06-01\",\n    \"time\": \"09:30:00\",\n    \"timezoneOffset\": -8,\n    \"latitude\": 34.0522,\n    \"longitude\": -118.2437,\n    \"houseSystem\": \"P\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/houses',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1926-06-01\",\n      'time': \"09:30:00\",\n      'timezoneOffset': -8,\n      'latitude': 34.0522,\n      'longitude': -118.2437,\n      'houseSystem': \"P\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('houses', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1926-06-01',\n        'time' => '09:30:00',\n        'timezoneOffset' => -8,\n        'latitude' => 34.0522,\n        'longitude' => -118.2437,\n        'houseSystem' => 'P',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"houses":{"type":"object","properties":{"system":{"type":"string","nullable":true},"cusps":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"ascendant":{"type":"number","nullable":true},"mc":{"type":"number","nullable":true},"armc":{"type":"number","nullable":true},"vertex":{"type":"number","nullable":true},"equatorialAsc":{"type":"number","nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"houses":{"system":"P","cusps":[133.07,156.14,183.67,216.01,250.59,283.51,313.07,336.14,3.67,36.01,70.59,103.51],"ascendant":133.07,"mc":36.01,"armc":33.69,"vertex":264.52,"equatorialAsc":121.45}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/aspects":{"post":{"tags":["Calendar & Cycles"],"summary":"Aspect Matrix","description":"Standalone aspect calculation: full inter-planetary aspect list with type / exactAngle / orb / isApplying. Uses per-pair astro.com orb matrix. Same calcAspects() as /chart but without planet positions / houses / midpoints overhead.","operationId":"aspects","x-quality":"green","x-source":"Eclipse calendar via Swiss Ephemeris (Espenak NASA correlation). Lunar calendar per Drik Panchang conventions. Ingresses + planetary cycles use Swiss Ephemeris ephemeris range.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1926-06-01","time":"09:30:00","timezoneOffset":-8,"latitude":34.0522,"longitude":-118.2437}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/aspects \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1926-06-01\", \"time\": \"09:30:00\", \"timezoneOffset\": -8, \"latitude\": 34.0522, \"longitude\": -118.2437 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/aspects', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1926-06-01\",\n    \"time\": \"09:30:00\",\n    \"timezoneOffset\": -8,\n    \"latitude\": 34.0522,\n    \"longitude\": -118.2437\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/aspects',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1926-06-01\",\n      'time': \"09:30:00\",\n      'timezoneOffset': -8,\n      'latitude': 34.0522,\n      'longitude': -118.2437\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('aspects', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1926-06-01',\n        'time' => '09:30:00',\n        'timezoneOffset' => -8,\n        'latitude' => 34.0522,\n        'longitude' => -118.2437,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"aspects":{"type":"array","items":{"type":"object","properties":{"planet1":{"type":"string","nullable":true},"planet2":{"type":"string","nullable":true},"planet1Id":{"type":"number","nullable":true},"planet2Id":{"type":"number","nullable":true},"type":{"type":"object","properties":{"name":{"type":"string","nullable":true},"i18nKey":{"type":"string","nullable":true},"angle":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true},"symbol":{"type":"string","nullable":true},"isMajor":{"type":"boolean","nullable":true},"color":{"type":"string","nullable":true}},"nullable":true},"exactAngle":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true},"isApplying":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true},"count":{"type":"number","nullable":true}}}}},"example":{"ok":true,"data":{"aspects":[{"planet1":"Sun","planet2":"Mercury","planet1Id":0,"planet2Id":2,"type":{"name":"Conjunction","i18nKey":"aspect_conjunction","angle":0,"orb":12,"symbol":"☌","isMajor":true,"color":"#660480"},"exactAngle":3.665708779358951,"orb":3.665708779358951,"isApplying":true}],"count":16}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/planetary-phases":{"post":{"tags":["Calendar & Cycles"],"summary":"Planetary Phases","description":"Calculate the synodic phase of each planet relative to the Sun (new, crescent, first quarter, gibbous, full, disseminating, last quarter, balsamic).","operationId":"planetary-phases","x-quality":"green","x-source":"Eclipse calendar via Swiss Ephemeris (Espenak NASA correlation). Lunar calendar per Drik Panchang conventions. Ingresses + planetary cycles use Swiss Ephemeris ephemeris range.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/planetary-phases \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/planetary-phases', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/planetary-phases',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('planetary-phases', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"phases":{"type":"array","items":{"type":"object","properties":{"planetName":{"type":"string","nullable":true},"planetId":{"type":"number","nullable":true},"elongation":{"type":"number","nullable":true},"quarter":{"type":"string","nullable":true},"visibility":{"type":"string","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"phases":[{"planetName":"Moon","planetId":1,"elongation":242.52866797484398,"quarter":"last_quarter","visibility":"oriental"}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/algol-minimum":{"post":{"tags":["Calendar & Cycles"],"summary":"Algol Minimum","description":"Find the nearest minimum brightness moment of Algol (Beta Persei), the eclipsing variable star, within a date range.","operationId":"algol-minimum","x-quality":"green","x-source":"Eclipse calendar via Swiss Ephemeris (Espenak NASA correlation). Lunar calendar per Drik Panchang conventions. Ingresses + planetary cycles use Swiss Ephemeris ephemeris range.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AlgolRange"},"example":{"startDate":"2024-06-01","endDate":"2024-06-30"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/algol-minimum \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"startDate\": \"2024-06-01\", \"endDate\": \"2024-06-30\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/algol-minimum', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"startDate\": \"2024-06-01\",\n    \"endDate\": \"2024-06-30\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/algol-minimum',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'startDate': \"2024-06-01\",\n      'endDate': \"2024-06-30\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('algol-minimum', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'startDate' => '2024-06-01',\n        'endDate' => '2024-06-30',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"count":{"type":"number","nullable":true},"minima":{"type":"array","items":{"type":"object","properties":{"jd":{"type":"number","nullable":true},"date":{"type":"string","nullable":true},"isNighttime":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"count":11,"minima":[{"jd":2460462.742432,"date":"2024-06-01T05:49:06.000Z","isNighttime":true}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/algol-minimum/nearest":{"post":{"tags":["Calendar & Cycles"],"summary":"Algol Nearest Minimum","description":"Find the single nearest Algol brightness minimum before or after a given date.","operationId":"algol-minimum_nearest","x-quality":"green","x-source":"Eclipse calendar via Swiss Ephemeris (Espenak NASA correlation). Lunar calendar per Drik Panchang conventions. Ingresses + planetary cycles use Swiss Ephemeris ephemeris range.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AlgolNearest"},"example":{"date":"2024-06-15"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/algol-minimum/nearest \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"2024-06-15\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/algol-minimum/nearest', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"2024-06-15\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/algol-minimum/nearest',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"2024-06-15\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('algol-minimum/nearest', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '2024-06-15',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"date":{"type":"string","nullable":true},"time":{"type":"string","nullable":true},"jd":{"type":"number","nullable":true},"hoursUntil":{"type":"number","nullable":true}}}}},"example":{"ok":true,"data":{"date":"2024-06-17","time":"08:12:00","jd":2460479.84,"hoursUntil":41.3}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/cyclic-index":{"post":{"tags":["Calendar & Cycles"],"summary":"Cyclic Index","description":"Calculate the André Barbault Cyclic Index, sum of all outer planet separations, for a date range to indicate global crisis periods.","operationId":"cyclic-index","x-quality":"yellow","x-source":"André Barbault, \"Les Indices Cycliques\" (French mundane astrology school, 1960s+). Pierre Lassalle continuation.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CyclicIndex"},"example":{"startYear":2020,"endYear":2030}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/cyclic-index \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"startYear\": 2020, \"endYear\": 2030 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/cyclic-index', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"startYear\": 2020,\n    \"endYear\": 2030\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/cyclic-index',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'startYear': 2020,\n      'endYear': 2030\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('cyclic-index', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'startYear' => 2020,\n        'endYear' => 2030,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"startYear":{"type":"number","nullable":true},"endYear":{"type":"number","nullable":true},"count":{"type":"number","nullable":true},"data":{"type":"array","items":{"type":"object","properties":{"jd":{"type":"number","nullable":true},"year":{"type":"number","nullable":true},"total":{"type":"number","nullable":true},"pairs":{"type":"object","properties":{"Jupiter-Saturn":{"type":"number","nullable":true},"Jupiter-Uranus":{"type":"number","nullable":true},"Jupiter-Neptune":{"type":"number","nullable":true},"Jupiter-Pluto":{"type":"number","nullable":true},"Saturn-Uranus":{"type":"number","nullable":true},"Saturn-Neptune":{"type":"number","nullable":true},"Saturn-Pluto":{"type":"number","nullable":true},"Uranus-Neptune":{"type":"number","nullable":true},"Uranus-Pluto":{"type":"number","nullable":true},"Neptune-Pluto":{"type":"number","nullable":true}},"nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"startYear":2020,"endYear":2030,"count":11,"data":[{"jd":2458850,"year":2020,"total":573.26,"pairs":{"Jupiter-Saturn":14.67,"Jupiter-Uranus":115.9,"Jupiter-Neptune":69.49,"Jupiter-Pluto":15.62,"Saturn-Uranus":101.24,"Saturn-Neptune":54.82,"Saturn-Pluto":0.95,"Uranus-Neptune":46.42,"Uranus-Pluto":100.29,"Neptune-Pluto":53.87}}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/essential-dignities":{"post":{"tags":["Dignities & Receptions"],"summary":"Essential Dignities","description":"Calculate the five Ptolemaic essential dignities (rulership, exaltation, triplicity, term, face) and debilities for each planet.","operationId":"essential-dignities","x-quality":"green","x-source":"Essential dignities per William Lilly \"Christian Astrology\" 1647 (PD) + Bonatti for triplicity. Almuten figuris per Ibn Ezra. Hyleg per Ptolemy Tetrabiblos III.10 (PD). Disposition chains standard.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EssentialDignities"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/essential-dignities \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/essential-dignities', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/essential-dignities',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('essential-dignities', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"dignities":{"type":"array","items":{"type":"object","properties":{"planetId":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"longitude":{"type":"number","nullable":true},"signIndex":{"type":"number","nullable":true},"dignity":{"type":"object","properties":{"rulership":{"nullable":true},"exaltation":{"nullable":true},"triplicity":{"nullable":true},"detriment":{"nullable":true},"fall":{"nullable":true},"term":{"type":"string","nullable":true},"decan":{"type":"string","nullable":true},"peregrine":{"type":"boolean","nullable":true},"score":{"type":"number","nullable":true}},"nullable":true}},"nullable":true},"nullable":true},"totalScore":{"type":"number","nullable":true}}}}},"example":{"ok":true,"data":{"dignities":[{"planetId":0,"planetName":"Sun","longitude":54.37601980167181,"signIndex":1,"dignity":{"rulership":null,"exaltation":null,"triplicity":null,"detriment":null,"fall":null,"term":"Saturn","decan":"Saturn","peregrine":true,"score":-5}}],"totalScore":-25}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/almuten":{"post":{"tags":["Dignities & Receptions"],"summary":"Almuten Figuris","description":"Calculate the Almuten Figuris: the planet with the highest essential dignity score across the key chart positions.","operationId":"almuten","x-quality":"green","x-source":"Essential dignities per William Lilly \"Christian Astrology\" 1647 (PD) + Bonatti for triplicity. Almuten figuris per Ibn Ezra. Hyleg per Ptolemy Tetrabiblos III.10 (PD). Disposition chains standard.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Almuten"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/almuten \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/almuten', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/almuten',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('almuten', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"almuten":{"type":"object","properties":{"planet":{"type":"string","nullable":true},"score":{"type":"number","nullable":true},"scores":{"type":"object","properties":{"Sun":{"type":"number","nullable":true},"Moon":{"type":"number","nullable":true},"Mercury":{"type":"number","nullable":true},"Venus":{"type":"number","nullable":true},"Mars":{"type":"number","nullable":true},"Jupiter":{"type":"number","nullable":true},"Saturn":{"type":"number","nullable":true}},"nullable":true}},"nullable":true},"chart":{"type":"object","properties":{"input":{"type":"object","properties":{"name":{"type":"string","nullable":true},"date":{"type":"string","nullable":true},"time":{"type":"string","nullable":true},"timezoneOffset":{"type":"number","nullable":true},"latitude":{"type":"number","nullable":true},"longitude":{"type":"number","nullable":true},"houseSystem":{"type":"string","nullable":true},"city":{"type":"string","nullable":true},"cosmogram":{"type":"boolean","nullable":true}},"nullable":true},"julianDay":{"type":"number","nullable":true},"siderealTime":{"type":"number","nullable":true},"planets":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"longitude":{"type":"number","nullable":true},"latitude":{"type":"number","nullable":true},"distance":{"type":"number","nullable":true},"speedLong":{"type":"number","nullable":true},"speedLat":{"type":"number","nullable":true},"speedDist":{"type":"number","nullable":true},"isRetrograde":{"type":"boolean","nullable":true},"declination":{"type":"number","nullable":true},"rightAscension":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"houses":{"type":"object","properties":{"system":{"type":"string","nullable":true},"cusps":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"ascendant":{"type":"number","nullable":true},"mc":{"type":"number","nullable":true},"armc":{"type":"number","nullable":true},"vertex":{"type":"number","nullable":true},"equatorialAsc":{"type":"number","nullable":true},"coAscWK":{"type":"number","nullable":true},"coAscMunkasey":{"type":"number","nullable":true},"polarAsc":{"type":"number","nullable":true}},"nullable":true},"aspects":{"type":"array","items":{"type":"object","properties":{"planet1":{"type":"string","nullable":true},"planet2":{"type":"string","nullable":true},"planet1Id":{"type":"number","nullable":true},"planet2Id":{"type":"number","nullable":true},"type":{"type":"object","properties":{"name":{"type":"string","nullable":true},"i18nKey":{"type":"string","nullable":true},"angle":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true},"symbol":{"type":"string","nullable":true},"isMajor":{"type":"boolean","nullable":true},"color":{"type":"string","nullable":true}},"nullable":true},"exactAngle":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true},"isApplying":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true},"houseAspects":{"type":"array","items":{"type":"object","properties":{"planetName":{"type":"string","nullable":true},"planetId":{"type":"number","nullable":true},"houseIndex":{"type":"number","nullable":true},"cuspLongitude":{"type":"number","nullable":true},"type":{"type":"object","properties":{"name":{"type":"string","nullable":true},"i18nKey":{"type":"string","nullable":true},"angle":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true},"symbol":{"type":"string","nullable":true},"isMajor":{"type":"boolean","nullable":true},"color":{"type":"string","nullable":true}},"nullable":true},"exactAngle":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true},"isApplying":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true},"parallelAspects":{"type":"array","items":{"type":"object","properties":{"planet1":{"type":"string","nullable":true},"planet2":{"type":"string","nullable":true},"planet1Id":{"type":"number","nullable":true},"planet2Id":{"type":"number","nullable":true},"type":{"type":"string","nullable":true},"exactDiff":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"antiscia":{"type":"array","items":{"type":"object","properties":{"planetId":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"antiscion":{"type":"number","nullable":true},"contraAntiscion":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"antisciaAspects":{"type":"array","items":{},"nullable":true},"chartSect":{"type":"string","nullable":true},"meta":{"type":"object","properties":{"engineVersion":{"type":"string","nullable":true},"calculatedAt":{"type":"string","nullable":true}},"nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"almuten":{"planet":"Venus","score":23,"scores":{"Sun":1,"Moon":8,"Mercury":14,"Venus":23,"Mars":9,"Jupiter":2,"Saturn":14}},"chart":{"input":{"name":"","date":"1990-05-15","time":"15:30:00","timezoneOffset":4,"latitude":50.45,"longitude":30.52,"houseSystem":"P","city":"","cosmogram":false},"julianDay":2448026.9791666665,"siderealTime":3.029043551629416,"planets":[{"id":0,"name":"Sun","longitude":54.37601980167181,"latitude":-0.000020054940759470553,"distance":1.0108955908980104,"speedLong":0.9642248003676466,"speedLat":0.00003805311526169511,"speedDist":0.00022039347866615117,"isRetrograde":false,"declination":18.867035147029778,"rightAscension":52.00919841916813}],"houses":{"system":"P","cusps":[169.9679500481848],"ascendant":169.9679500481848,"mc":77.07426201523143,"armc":75.95565327444125,"vertex":336.6271586045666,"equatorialAsc":164.74875654391414,"coAscWK":149.27468505332592,"coAscMunkasey":168.73706704232438,"polarAsc":329.2746850533259},"aspects":[{"planet1":"Sun","planet2":"Moon","planet1Id":0,"planet2Id":1,"type":{"name":"Trine","i18nKey":"aspect_trine","angle":120,"orb":12,"symbol":"△","isMajor":true,"color":"#3366cc"},"exactAngle":117.47133202515602,"orb":2.5286679748439838,"isApplying":false}],"houseAspects":[{"planetName":"Sun","planetId":0,"houseIndex":0,"cuspLongitude":169.9679500481848,"type":{"name":"Trine","i18nKey":"aspect_trine","angle":120,"orb":12,"symbol":"△","isMajor":true,"color":"#3366cc"},"exactAngle":115.59193024651299,"orb":4.408069753487013,"isApplying":false}],"parallelAspects":[{"planet1":"Moon","planet2":"Saturn","planet1Id":1,"planet2Id":6,"type":"parallel","exactDiff":0.9889902750346735,"orb":0.9889902750346735}],"antiscia":[{"planetId":0,"planetName":"Sun","antiscion":125.62398019832818,"contraAntiscion":305.6239801983282}],"antisciaAspects":[],"chartSect":"diurnal","meta":{"engineVersion":"2.10.03","calculatedAt":"2026-08-23T22:04:21.819Z"}}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/hyleg":{"post":{"tags":["Dignities & Receptions"],"summary":"Hyleg & Alcocoden","description":"Calculate the Hyleg (apheta, giver of life) and Alcocoden (indicator of lifespan) using traditional Hellenistic method.","operationId":"hyleg","x-quality":"green","x-source":"Essential dignities per William Lilly \"Christian Astrology\" 1647 (PD) + Bonatti for triplicity. Almuten figuris per Ibn Ezra. Hyleg per Ptolemy Tetrabiblos III.10 (PD). Disposition chains standard.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Hyleg"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/hyleg \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/hyleg', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/hyleg',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('hyleg', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"hyleg":{"type":"object","properties":{"planet":{"type":"string","nullable":true},"longitude":{"type":"number","nullable":true},"house":{"type":"number","nullable":true},"condition":{"type":"string","nullable":true}},"nullable":true},"alcocoden":{"type":"object","properties":{"planet":{"type":"string","nullable":true},"minYears":{"type":"number","nullable":true},"maxYears":{"type":"number","nullable":true},"moreYears":{"type":"number","nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"hyleg":{"planet":"Moon","longitude":54.37601980167181,"house":9,"condition":"angular"},"alcocoden":{"planet":"Saturn","minYears":57,"maxYears":91,"moreYears":43}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/receptions":{"post":{"tags":["Dignities & Receptions"],"summary":"Mutual Receptions","description":"Find mutual receptions between planets: pairs where each planet is in a sign ruled, exalted, or in the dignity of the other.","operationId":"receptions","x-quality":"green","x-source":"Essential dignities per William Lilly \"Christian Astrology\" 1647 (PD) + Bonatti for triplicity. Almuten figuris per Ibn Ezra. Hyleg per Ptolemy Tetrabiblos III.10 (PD). Disposition chains standard.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Receptions"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/receptions \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/receptions', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/receptions',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('receptions', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"count":{"type":"number","nullable":true},"mutual":{"type":"number","nullable":true},"receptions":{"type":"array","items":{"type":"object","properties":{"planet1Id":{"type":"number","nullable":true},"planet1Name":{"type":"string","nullable":true},"planet2Id":{"type":"number","nullable":true},"planet2Name":{"type":"string","nullable":true},"type1":{"type":"string","nullable":true},"type2":{"type":"string","nullable":true},"isMutual":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"count":9,"mutual":1,"receptions":[{"planet1Id":0,"planet1Name":"Sun","planet2Id":1,"planet2Name":"Moon","type1":"exaltation","type2":"decan","isMutual":false}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/disposition-chains":{"post":{"tags":["Dignities & Receptions"],"summary":"Disposition Chains","description":"Calculate planetary disposition chains: the recursive sequence of sign rulers leading to the final dispositor.","operationId":"disposition-chains","x-quality":"green","x-source":"Essential dignities per William Lilly \"Christian Astrology\" 1647 (PD) + Bonatti for triplicity. Almuten figuris per Ibn Ezra. Hyleg per Ptolemy Tetrabiblos III.10 (PD). Disposition chains standard.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DispositionChains"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/disposition-chains \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/disposition-chains', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/disposition-chains',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('disposition-chains', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"mode":{"type":"string","nullable":true},"rulerMode":{"type":"string","nullable":true},"data":{"type":"object","properties":{"nodes":{"type":"array","items":{"type":"object","properties":{"planetId":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"symbol":{"type":"string","nullable":true},"signIndex":{"type":"number","nullable":true},"signSymbol":{"type":"string","nullable":true},"isTerminal":{"type":"boolean","nullable":true},"isMutualReception":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true},"edges":{"type":"array","items":{"type":"object","properties":{"from":{"type":"number","nullable":true},"to":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"groups":{"type":"array","items":{"type":"object","properties":{"rootIds":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"memberIds":{"type":"array","items":{"type":"number","nullable":true},"nullable":true}},"nullable":true},"nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"mode":"rulership","rulerMode":"classical","data":{"nodes":[{"planetId":0,"planetName":"Sun","symbol":"☉","signIndex":1,"signSymbol":"♉","isTerminal":false,"isMutualReception":false}],"edges":[{"from":0,"to":3}],"groups":[{"rootIds":[6],"memberIds":[6]}]}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/disposition-chains/layout":{"post":{"tags":["Dignities & Receptions"],"summary":"Disposition Chains Layout","description":"Return disposition chains with computed x/y layout coordinates for graph visualization.","operationId":"disposition-chains_layout","x-quality":"green","x-source":"Essential dignities per William Lilly \"Christian Astrology\" 1647 (PD) + Bonatti for triplicity. Almuten figuris per Ibn Ezra. Hyleg per Ptolemy Tetrabiblos III.10 (PD). Disposition chains standard.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DispositionChains"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/disposition-chains/layout \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/disposition-chains/layout', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/disposition-chains/layout',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('disposition-chains/layout', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"mode":{"type":"string","nullable":true},"rulerMode":{"type":"string","nullable":true},"data":{"type":"object","properties":{"nodes":{"type":"array","items":{"type":"object","properties":{"planetId":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"symbol":{"type":"string","nullable":true},"signIndex":{"type":"number","nullable":true},"signSymbol":{"type":"string","nullable":true},"isTerminal":{"type":"boolean","nullable":true},"isMutualReception":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true},"edges":{"type":"array","items":{"type":"object","properties":{"from":{"type":"number","nullable":true},"to":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"groups":{"type":"array","items":{"type":"object","properties":{"rootIds":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"memberIds":{"type":"array","items":{"type":"number","nullable":true},"nullable":true}},"nullable":true},"nullable":true}},"nullable":true},"layout":{"type":"array","items":{"type":"object","properties":{"planetId":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"symbol":{"type":"string","nullable":true},"signIndex":{"type":"number","nullable":true},"signSymbol":{"type":"string","nullable":true},"isTerminal":{"type":"boolean","nullable":true},"isMutualReception":{"type":"boolean","nullable":true},"x":{"type":"number","nullable":true},"y":{"type":"number","nullable":true},"level":{"type":"number","nullable":true},"parentId":{"nullable":true}},"nullable":true},"nullable":true},"bounds":{"type":"object","properties":{"width":{"type":"number","nullable":true},"height":{"type":"number","nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"mode":"rulership","rulerMode":"classical","data":{"nodes":[{"planetId":0,"planetName":"Sun","symbol":"☉","signIndex":1,"signSymbol":"♉","isTerminal":false,"isMutualReception":false}],"edges":[{"from":0,"to":3}],"groups":[{"rootIds":[6],"memberIds":[6]}]},"layout":[{"planetId":6,"planetName":"Saturn","symbol":"♄","signIndex":9,"signSymbol":"♑","isTerminal":true,"isMutualReception":false,"x":144,"y":28,"level":0,"parentId":null}],"bounds":{"width":276,"height":344}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/horary":{"post":{"tags":["Horary"],"summary":"Horary Chart","description":"Calculate a horary chart for a question moment and return the chart data with radicality assessment and significator analysis.","operationId":"horary","x-quality":"green","x-source":"Horary technique per William Lilly \"Christian Astrology\" 1647 (PD), Books 1-3. Querent/quesited significators, planetary applications, Moon as co-significator. Lilly's tradition.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"2024-06-15","time":"14:30:00","timezoneOffset":3,"latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/horary \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"2024-06-15\", \"time\": \"14:30:00\", \"timezoneOffset\": 3, \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/horary', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"2024-06-15\",\n    \"time\": \"14:30:00\",\n    \"timezoneOffset\": 3,\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/horary',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"2024-06-15\",\n      'time': \"14:30:00\",\n      'timezoneOffset': 3,\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('horary', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '2024-06-15',\n        'time' => '14:30:00',\n        'timezoneOffset' => 3,\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"chart":{"type":"object","properties":{"input":{"type":"object","properties":{"name":{"type":"string","nullable":true},"date":{"type":"string","nullable":true},"time":{"type":"string","nullable":true},"timezoneOffset":{"type":"number","nullable":true},"latitude":{"type":"number","nullable":true},"longitude":{"type":"number","nullable":true},"houseSystem":{"type":"string","nullable":true},"city":{"type":"string","nullable":true},"cosmogram":{"type":"boolean","nullable":true}},"nullable":true},"julianDay":{"type":"number","nullable":true},"siderealTime":{"type":"number","nullable":true},"planets":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"longitude":{"type":"number","nullable":true},"latitude":{"type":"number","nullable":true},"distance":{"type":"number","nullable":true},"speedLong":{"type":"number","nullable":true},"speedLat":{"type":"number","nullable":true},"speedDist":{"type":"number","nullable":true},"isRetrograde":{"type":"boolean","nullable":true},"declination":{"type":"number","nullable":true},"rightAscension":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"houses":{"type":"object","properties":{"system":{"type":"string","nullable":true},"cusps":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"ascendant":{"type":"number","nullable":true},"mc":{"type":"number","nullable":true},"armc":{"type":"number","nullable":true},"vertex":{"type":"number","nullable":true},"equatorialAsc":{"type":"number","nullable":true},"coAscWK":{"type":"number","nullable":true},"coAscMunkasey":{"type":"number","nullable":true},"polarAsc":{"type":"number","nullable":true}},"nullable":true},"aspects":{"type":"array","items":{"type":"object","properties":{"planet1":{"type":"string","nullable":true},"planet2":{"type":"string","nullable":true},"planet1Id":{"type":"number","nullable":true},"planet2Id":{"type":"number","nullable":true},"type":{"type":"object","properties":{"name":{"type":"string","nullable":true},"i18nKey":{"type":"string","nullable":true},"angle":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true},"symbol":{"type":"string","nullable":true},"isMajor":{"type":"boolean","nullable":true},"color":{"type":"string","nullable":true}},"nullable":true},"exactAngle":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true},"isApplying":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true},"houseAspects":{"type":"array","items":{"type":"object","properties":{"planetName":{"type":"string","nullable":true},"planetId":{"type":"number","nullable":true},"houseIndex":{"type":"number","nullable":true},"cuspLongitude":{"type":"number","nullable":true},"type":{"type":"object","properties":{"name":{"type":"string","nullable":true},"i18nKey":{"type":"string","nullable":true},"angle":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true},"symbol":{"type":"string","nullable":true},"isMajor":{"type":"boolean","nullable":true},"color":{"type":"string","nullable":true}},"nullable":true},"exactAngle":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true},"isApplying":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true},"parallelAspects":{"type":"array","items":{"type":"object","properties":{"planet1":{"type":"string","nullable":true},"planet2":{"type":"string","nullable":true},"planet1Id":{"type":"number","nullable":true},"planet2Id":{"type":"number","nullable":true},"type":{"type":"string","nullable":true},"exactDiff":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"antiscia":{"type":"array","items":{"type":"object","properties":{"planetId":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"antiscion":{"type":"number","nullable":true},"contraAntiscion":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"antisciaAspects":{"type":"array","items":{},"nullable":true},"chartSect":{"type":"string","nullable":true},"meta":{"type":"object","properties":{"engineVersion":{"type":"string","nullable":true},"calculatedAt":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"indicators":{"type":"object","properties":{"currentPlanetaryHour":{"type":"object","properties":{"planetId":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"startHour":{"type":"number","nullable":true},"endHour":{"type":"number","nullable":true},"isCurrent":{"type":"boolean","nullable":true}},"nullable":true},"planetaryHours":{"type":"array","items":{"type":"object","properties":{"planetId":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"startHour":{"type":"number","nullable":true},"endHour":{"type":"number","nullable":true},"isCurrent":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true},"moonVoidOfCourse":{"type":"boolean","nullable":true},"moonInViaCombusta":{"type":"boolean","nullable":true},"lastMoonAspect":{"type":"object","properties":{"planetId":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"aspectName":{"type":"string","nullable":true},"aspectSymbol":{"type":"string","nullable":true},"orb":{"type":"number","nullable":true},"isApplying":{"type":"boolean","nullable":true},"hoursToExact":{"type":"number","nullable":true}},"nullable":true},"nextMoonAspect":{"type":"object","properties":{"planetId":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"aspectName":{"type":"string","nullable":true},"aspectSymbol":{"type":"string","nullable":true},"orb":{"type":"number","nullable":true},"isApplying":{"type":"boolean","nullable":true},"hoursToExact":{"type":"number","nullable":true}},"nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"chart":{"input":{"name":"","date":"2024-06-15","time":"15:30:00","timezoneOffset":4,"latitude":50.45,"longitude":30.52,"houseSystem":"P","city":"","cosmogram":false},"julianDay":2460476.9791666665,"siderealTime":5.116093788184427,"planets":[{"id":0,"name":"Sun","longitude":84.85601436282582,"latitude":-0.000019866836181065662,"distance":1.0157910160498802,"speedLong":0.9549885884248844,"speedLat":-0.00003714251244401531,"speedDist":0.00008533289545297364,"isRetrograde":false,"declination":23.338427649710464,"rightAscension":84.39622715771179}],"houses":{"system":"P","cusps":[192.32722799012248],"ascendant":192.32722799012248,"mc":105.9122069427123,"armc":107.2614068227664,"vertex":28.44826551596455,"equatorialAsc":198.70975021905312,"coAscWK":216.94971714067472,"coAscMunkasey":193.83784571388753,"polarAsc":36.949717140674714},"aspects":[{"planet1":"Sun","planet2":"Mercury","planet1Id":0,"planet2Id":2,"type":{"name":"Conjunction","i18nKey":"aspect_conjunction","angle":0,"orb":12,"symbol":"☌","isMajor":true,"color":"#660480"},"exactAngle":0.9824684587343029,"orb":0.9824684587343029,"isApplying":false}],"houseAspects":[{"planetName":"Sun","planetId":0,"houseIndex":4,"cuspLongitude":320.9594428227293,"type":{"name":"Trine","i18nKey":"aspect_trine","angle":120,"orb":12,"symbol":"△","isMajor":true,"color":"#3366cc"},"exactAngle":123.89657154009655,"orb":3.896571540096545,"isApplying":false}],"parallelAspects":[{"planet1":"Sun","planet2":"Venus","planet1Id":0,"planet2Id":3,"type":"parallel","exactDiff":0.44914682611428347,"orb":0.44914682611428347}],"antiscia":[{"planetId":0,"planetName":"Sun","antiscion":95.14398563717418,"contraAntiscion":275.1439856371742}],"antisciaAspects":[],"chartSect":"diurnal","meta":{"engineVersion":"2.10.03","calculatedAt":"2026-08-23T22:04:22.546Z"}},"indicators":{"currentPlanetaryHour":{"planetId":5,"planetName":"Jupiter","startHour":14,"endHour":15,"isCurrent":true},"planetaryHours":[{"planetId":6,"planetName":"Saturn","startHour":6,"endHour":7,"isCurrent":false}],"moonVoidOfCourse":false,"moonInViaCombusta":false,"lastMoonAspect":{"planetId":9,"planetName":"Pluto","aspectName":"Trine","aspectSymbol":"△","orb":6.830171110351955,"isApplying":false,"hoursToExact":-13.825054127397596},"nextMoonAspect":{"planetId":5,"planetName":"Jupiter","aspectName":"Trine","aspectSymbol":"△","orb":3.755872565892304,"isApplying":true,"hoursToExact":7.763037553662107}}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/horary/diagnostics":{"post":{"tags":["Horary"],"summary":"Horary Diagnostics","description":"Run a full horary radicality diagnostic including early/late ASC, Via Combusta, Saturn in 7th, and considerations before judgement.","operationId":"horary_diagnostics","x-quality":"green","x-source":"Horary technique per William Lilly \"Christian Astrology\" 1647 (PD), Books 1-3. Querent/quesited significators, planetary applications, Moon as co-significator. Lilly's tradition.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"2024-06-15","time":"14:30:00","timezoneOffset":3,"latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/horary/diagnostics \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"2024-06-15\", \"time\": \"14:30:00\", \"timezoneOffset\": 3, \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/horary/diagnostics', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"2024-06-15\",\n    \"time\": \"14:30:00\",\n    \"timezoneOffset\": 3,\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/horary/diagnostics',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"2024-06-15\",\n      'time': \"14:30:00\",\n      'timezoneOffset': 3,\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('horary/diagnostics', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '2024-06-15',\n        'time' => '14:30:00',\n        'timezoneOffset' => 3,\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"radical":{"type":"boolean","nullable":true},"issues":{"type":"array","items":{"type":"object","properties":{"rule":{"type":"string","nullable":true},"value":{"type":"string","nullable":true},"severity":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"passed":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"recommendation":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"radical":false,"issues":[{"rule":"Late Ascendant","value":"28°14'","severity":"warning"}],"passed":["Moon not VOC","Ascendant not early"],"recommendation":"Chart may be considered with caution"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/horary/planetary-hours":{"post":{"tags":["Horary"],"summary":"Horary Planetary Hours","description":"Return the planetary hour ruler at the exact moment of a horary question and check if it matches the ASC ruler.","operationId":"horary_planetary-hours","x-quality":"green","x-source":"Horary technique per William Lilly \"Christian Astrology\" 1647 (PD), Books 1-3. Querent/quesited significators, planetary applications, Moon as co-significator. Lilly's tradition.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HoraryPlanetaryHours"},"example":{"dayOfWeek":6,"sunriseHour":5.05,"sunsetHour":21.2,"currentHour":14.5}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/horary/planetary-hours \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"dayOfWeek\": 6, \"sunriseHour\": 5.05, \"sunsetHour\": 21.2, \"currentHour\": 14.5 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/horary/planetary-hours', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"dayOfWeek\": 6,\n    \"sunriseHour\": 5.05,\n    \"sunsetHour\": 21.2,\n    \"currentHour\": 14.5\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/horary/planetary-hours',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'dayOfWeek': 6,\n      'sunriseHour': 5.05,\n      'sunsetHour': 21.2,\n      'currentHour': 14.5\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('horary/planetary-hours', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'dayOfWeek' => 6,\n        'sunriseHour' => 5.05,\n        'sunsetHour' => 21.2,\n        'currentHour' => 14.5,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"hourRuler":{"type":"string","nullable":true},"dayRuler":{"type":"string","nullable":true},"ascRuler":{"type":"string","nullable":true},"match":{"type":"boolean","nullable":true},"hourNumber":{"type":"number","nullable":true},"hourStart":{"type":"string","nullable":true},"hourEnd":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"hourRuler":"Venus","dayRuler":"Saturn","ascRuler":"Venus","match":true,"hourNumber":4,"hourStart":"14:02","hourEnd":"15:04"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/horary/moon-aspects":{"post":{"tags":["Horary"],"summary":"Horary Moon Aspects","description":"List all aspects the Moon will make in this horary chart before leaving its sign, the key timing tool in horary.","operationId":"horary_moon-aspects","x-quality":"green","x-source":"Horary technique per William Lilly \"Christian Astrology\" 1647 (PD), Books 1-3. Querent/quesited significators, planetary applications, Moon as co-significator. Lilly's tradition.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"2024-06-15","time":"14:30:00","timezoneOffset":3,"latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/horary/moon-aspects \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"2024-06-15\", \"time\": \"14:30:00\", \"timezoneOffset\": 3, \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/horary/moon-aspects', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"2024-06-15\",\n    \"time\": \"14:30:00\",\n    \"timezoneOffset\": 3,\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/horary/moon-aspects',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"2024-06-15\",\n      'time': \"14:30:00\",\n      'timezoneOffset': 3,\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('horary/moon-aspects', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '2024-06-15',\n        'time' => '14:30:00',\n        'timezoneOffset' => 3,\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"lastAspect":{"type":"object","properties":{"planetId":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"aspectName":{"type":"string","nullable":true},"aspectSymbol":{"type":"string","nullable":true},"orb":{"type":"number","nullable":true},"isApplying":{"type":"boolean","nullable":true},"hoursToExact":{"type":"number","nullable":true}},"nullable":true},"nextAspect":{"type":"object","properties":{"planetId":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"aspectName":{"type":"string","nullable":true},"aspectSymbol":{"type":"string","nullable":true},"orb":{"type":"number","nullable":true},"isApplying":{"type":"boolean","nullable":true},"hoursToExact":{"type":"number","nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"lastAspect":{"planetId":9,"planetName":"Pluto","aspectName":"Trine","aspectSymbol":"△","orb":6.830171110351955,"isApplying":false,"hoursToExact":-13.825054127397596},"nextAspect":{"planetId":5,"planetName":"Jupiter","aspectName":"Trine","aspectSymbol":"△","orb":3.755872565892304,"isApplying":true,"hoursToExact":7.763037553662107}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/horary/moon-voc":{"post":{"tags":["Horary"],"summary":"Horary Moon VOC","description":"Check if the Moon is void-of-course in this horary chart and return the last aspect it made and when it enters the next sign.","operationId":"horary_moon-voc","x-quality":"green","x-source":"Horary technique per William Lilly \"Christian Astrology\" 1647 (PD), Books 1-3. Querent/quesited significators, planetary applications, Moon as co-significator. Lilly's tradition.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"2024-06-15","time":"14:30:00","timezoneOffset":3,"latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/horary/moon-voc \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"2024-06-15\", \"time\": \"14:30:00\", \"timezoneOffset\": 3, \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/horary/moon-voc', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"2024-06-15\",\n    \"time\": \"14:30:00\",\n    \"timezoneOffset\": 3,\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/horary/moon-voc',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"2024-06-15\",\n      'time': \"14:30:00\",\n      'timezoneOffset': 3,\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('horary/moon-voc', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '2024-06-15',\n        'time' => '14:30:00',\n        'timezoneOffset' => 3,\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"voc":{"type":"boolean","nullable":true},"lastAspect":{"type":"object","properties":{"planet":{"type":"string","nullable":true},"type":{"type":"string","nullable":true},"date":{"type":"string","nullable":true}},"nullable":true},"nextSignEntry":{"type":"object","properties":{"sign":{"type":"string","nullable":true},"date":{"type":"string","nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"voc":false,"lastAspect":{"planet":"Mars","type":"trine","date":"2024-06-15 10:15"},"nextSignEntry":{"sign":"Cancer","date":"2024-06-16 18:42"}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/horary/via-combusta":{"post":{"tags":["Horary"],"summary":"Via Combusta Check","description":"Check if the Moon or ASC is in the Via Combusta (15° Libra – 15° Scorpio), a classical prohibition in horary.","operationId":"horary_via-combusta","x-quality":"green","x-source":"Horary technique per William Lilly \"Christian Astrology\" 1647 (PD), Books 1-3. Querent/quesited significators, planetary applications, Moon as co-significator. Lilly's tradition.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HoraryViaCombusta"},"example":{"moonLongitude":200.5}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/horary/via-combusta \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"moonLongitude\": 200.5 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/horary/via-combusta', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"moonLongitude\": 200.5\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/horary/via-combusta',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'moonLongitude': 200.5\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('horary/via-combusta', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'moonLongitude' => 200.5,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"moonViaCombusta":{"type":"boolean","nullable":true},"moonLongitude":{"type":"number","nullable":true},"moonSign":{"type":"string","nullable":true},"ascViaCombusta":{"type":"boolean","nullable":true},"ascLongitude":{"type":"number","nullable":true},"warning":{"nullable":true}}}}},"example":{"ok":true,"data":{"moonViaCombusta":false,"moonLongitude":75.4,"moonSign":"Gemini","ascViaCombusta":false,"ascLongitude":180.5,"warning":null}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/human-design":{"post":{"tags":["Human Design"],"summary":"Human Design Chart","description":"Calculate a full Human Design BodyGraph chart: type, strategy, authority, profile, definition, incarnation cross, centers, channels, and gate activations. Centre identifiers are PascalCase with no separator and are stable: Head, Ajna, Throat, G, Heart, SolarPlexus, Spleen, Sacral, Root. `channels[].centerA` and `centerB` use the same nine. These identifiers are English and have no localised twin yet, unlike the sign and planet names on /public/moon-phase.","operationId":"human-design","x-quality":"yellow","x-source":"Human Design system originated by Ra Uru Hu (1987). Calculations based on Swiss Ephemeris (88° solar arc). Interpretation system (gates, channels, types, profiles) is intellectual property of Jovian Archive Inc.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/human-design \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/human-design', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/human-design',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('human-design', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"input":{"type":"object","properties":{"name":{"type":"string","nullable":true},"date":{"type":"string","nullable":true},"time":{"type":"string","nullable":true},"timezoneOffset":{"type":"number","nullable":true},"latitude":{"type":"number","nullable":true},"longitude":{"type":"number","nullable":true},"houseSystem":{"type":"string","nullable":true},"city":{"type":"string","nullable":true},"cosmogram":{"type":"boolean","nullable":true}},"nullable":true},"type":{"type":"string","nullable":true},"strategy":{"type":"string","nullable":true},"notSelfTheme":{"type":"string","nullable":true},"authority":{"type":"string","nullable":true},"profile":{"type":"object","properties":{"profile":{"type":"string","nullable":true},"personalityLine":{"type":"number","nullable":true},"designLine":{"type":"number","nullable":true},"geometry":{"type":"string","nullable":true}},"nullable":true},"definition":{"type":"string","nullable":true},"cross":{"type":"object","properties":{"name":{"type":"string","nullable":true},"type":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true}},"nullable":true},"activations":{"type":"array","items":{"type":"object","properties":{"planet":{"type":"string","nullable":true},"planetId":{"type":"number","nullable":true},"gate":{"type":"number","nullable":true},"line":{"type":"number","nullable":true},"color":{"type":"number","nullable":true},"tone":{"type":"number","nullable":true},"base":{"type":"number","nullable":true},"longitude":{"type":"number","nullable":true},"isPersonality":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true},"personalityActivations":{"type":"array","items":{"type":"object","properties":{"planet":{"type":"string","nullable":true},"planetId":{"type":"number","nullable":true},"gate":{"type":"number","nullable":true},"line":{"type":"number","nullable":true},"color":{"type":"number","nullable":true},"tone":{"type":"number","nullable":true},"base":{"type":"number","nullable":true},"longitude":{"type":"number","nullable":true},"isPersonality":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true},"designActivations":{"type":"array","items":{"type":"object","properties":{"planet":{"type":"string","nullable":true},"planetId":{"type":"number","nullable":true},"gate":{"type":"number","nullable":true},"line":{"type":"number","nullable":true},"color":{"type":"number","nullable":true},"tone":{"type":"number","nullable":true},"base":{"type":"number","nullable":true},"longitude":{"type":"number","nullable":true},"isPersonality":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true},"centers":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","nullable":true},"defined":{"type":"boolean","nullable":true},"open":{"type":"boolean","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"activeGates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true}},"nullable":true},"nullable":true},"channels":{"type":"array","items":{"type":"object","properties":{"gate1":{"type":"number","nullable":true},"gate2":{"type":"number","nullable":true},"centerA":{"type":"string","nullable":true},"centerB":{"type":"string","nullable":true},"activatedBy":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}},"nullable":true},"nullable":true},"designJd":{"type":"number","nullable":true},"personalityJd":{"type":"number","nullable":true}}}}},"example":{"ok":true,"data":{"input":{"name":"","date":"1990-05-15","time":"15:30:00","timezoneOffset":4,"latitude":50.45,"longitude":30.52,"houseSystem":"P","city":"","cosmogram":false},"type":"Projector","strategy":"Wait for the Invitation","notSelfTheme":"Bitterness","authority":"Emotional (Solar Plexus)","profile":{"profile":"6/3","personalityLine":6,"designLine":3,"geometry":"Left Angle"},"definition":"Split","cross":{"name":"Left Angle Cross of Dedication","type":"LAC","gates":[23]},"activations":[{"planet":"Sun","planetId":0,"gate":23,"line":6,"color":6,"tone":2,"base":2,"longitude":54.37601980167181,"isPersonality":true}],"personalityActivations":[{"planet":"Sun","planetId":0,"gate":23,"line":6,"color":6,"tone":2,"base":2,"longitude":54.37601980167181,"isPersonality":true}],"designActivations":[{"planet":"Sun","planetId":0,"gate":30,"line":3,"color":1,"tone":1,"base":1,"longitude":326.37601741834976,"isPersonality":false}],"centers":[{"name":"Head","defined":true,"open":false,"gates":[61],"activeGates":[61]}],"channels":[{"gate1":13,"gate2":33,"centerA":"G","centerB":"Throat","activatedBy":["personality"]}],"designJd":2447937.835688273,"personalityJd":2448026.9791666665}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/human-design/compatibility":{"post":{"tags":["Human Design"],"summary":"HD Compatibility","description":"Calculate Human Design connection chart (compatibility) between two people: electromagnetic connections, compromise, dominance, and companionship channels.","operationId":"human-design_compatibility","x-quality":"yellow","x-source":"Human Design system originated by Ra Uru Hu (1987). Calculations based on Swiss Ephemeris (88° solar arc). Interpretation system (gates, channels, types, profiles) is intellectual property of Jovian Archive Inc.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwoChart"},"example":{"chart1":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52},"chart2":{"date":"1985-11-03","time":"09:15:00","timezone":"Europe/Kyiv","latitude":48.46,"longitude":35.04}}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/human-design/compatibility \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"chart1\": { \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }, \"chart2\": { \"date\": \"1985-11-03\", \"time\": \"09:15:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 48.46, \"longitude\": 35.04 } }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/human-design/compatibility', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"chart1\": {\n      \"date\": \"1990-05-15\",\n      \"time\": \"15:30:00\",\n      \"timezone\": \"Europe/Kyiv\",\n      \"latitude\": 50.45,\n      \"longitude\": 30.52\n    },\n    \"chart2\": {\n      \"date\": \"1985-11-03\",\n      \"time\": \"09:15:00\",\n      \"timezone\": \"Europe/Kyiv\",\n      \"latitude\": 48.46,\n      \"longitude\": 35.04\n    }\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/human-design/compatibility',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'chart1': {\n        'date': \"1990-05-15\",\n        'time': \"15:30:00\",\n        'timezone': \"Europe/Kyiv\",\n        'latitude': 50.45,\n        'longitude': 30.52\n      },\n      'chart2': {\n        'date': \"1985-11-03\",\n        'time': \"09:15:00\",\n        'timezone': \"Europe/Kyiv\",\n        'latitude': 48.46,\n        'longitude': 35.04\n      }\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('human-design/compatibility', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'chart1' => [\n            'date' => '1990-05-15',\n            'time' => '15:30:00',\n            'timezone' => 'Europe/Kyiv',\n            'latitude' => 50.45,\n            'longitude' => 30.52,\n        ],\n        'chart2' => [\n            'date' => '1985-11-03',\n            'time' => '09:15:00',\n            'timezone' => 'Europe/Kyiv',\n            'latitude' => 48.46,\n            'longitude' => 35.04,\n        ],\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"chart1":{"type":"object","properties":{"input":{"type":"object","properties":{"name":{"type":"string","nullable":true},"date":{"type":"string","nullable":true},"time":{"type":"string","nullable":true},"timezoneOffset":{"type":"number","nullable":true},"latitude":{"type":"number","nullable":true},"longitude":{"type":"number","nullable":true},"houseSystem":{"type":"string","nullable":true},"city":{"type":"string","nullable":true},"cosmogram":{"type":"boolean","nullable":true}},"nullable":true},"type":{"type":"string","nullable":true},"strategy":{"type":"string","nullable":true},"notSelfTheme":{"type":"string","nullable":true},"authority":{"type":"string","nullable":true},"profile":{"type":"object","properties":{"profile":{"type":"string","nullable":true},"personalityLine":{"type":"number","nullable":true},"designLine":{"type":"number","nullable":true},"geometry":{"type":"string","nullable":true}},"nullable":true},"definition":{"type":"string","nullable":true},"cross":{"type":"object","properties":{"name":{"type":"string","nullable":true},"type":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true}},"nullable":true},"activations":{"type":"array","items":{"type":"object","properties":{"planet":{"type":"string","nullable":true},"planetId":{"type":"number","nullable":true},"gate":{"type":"number","nullable":true},"line":{"type":"number","nullable":true},"color":{"type":"number","nullable":true},"tone":{"type":"number","nullable":true},"base":{"type":"number","nullable":true},"longitude":{"type":"number","nullable":true},"isPersonality":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true},"personalityActivations":{"type":"array","items":{"type":"object","properties":{"planet":{"type":"string","nullable":true},"planetId":{"type":"number","nullable":true},"gate":{"type":"number","nullable":true},"line":{"type":"number","nullable":true},"color":{"type":"number","nullable":true},"tone":{"type":"number","nullable":true},"base":{"type":"number","nullable":true},"longitude":{"type":"number","nullable":true},"isPersonality":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true},"designActivations":{"type":"array","items":{"type":"object","properties":{"planet":{"type":"string","nullable":true},"planetId":{"type":"number","nullable":true},"gate":{"type":"number","nullable":true},"line":{"type":"number","nullable":true},"color":{"type":"number","nullable":true},"tone":{"type":"number","nullable":true},"base":{"type":"number","nullable":true},"longitude":{"type":"number","nullable":true},"isPersonality":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true},"centers":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","nullable":true},"defined":{"type":"boolean","nullable":true},"open":{"type":"boolean","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"activeGates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true}},"nullable":true},"nullable":true},"channels":{"type":"array","items":{"type":"object","properties":{"gate1":{"type":"number","nullable":true},"gate2":{"type":"number","nullable":true},"centerA":{"type":"string","nullable":true},"centerB":{"type":"string","nullable":true},"activatedBy":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}},"nullable":true},"nullable":true},"designJd":{"type":"number","nullable":true},"personalityJd":{"type":"number","nullable":true}},"nullable":true},"chart2":{"type":"object","properties":{"input":{"type":"object","properties":{"name":{"type":"string","nullable":true},"date":{"type":"string","nullable":true},"time":{"type":"string","nullable":true},"timezoneOffset":{"type":"number","nullable":true},"latitude":{"type":"number","nullable":true},"longitude":{"type":"number","nullable":true},"houseSystem":{"type":"string","nullable":true},"city":{"type":"string","nullable":true},"cosmogram":{"type":"boolean","nullable":true}},"nullable":true},"type":{"type":"string","nullable":true},"strategy":{"type":"string","nullable":true},"notSelfTheme":{"type":"string","nullable":true},"authority":{"type":"string","nullable":true},"profile":{"type":"object","properties":{"profile":{"type":"string","nullable":true},"personalityLine":{"type":"number","nullable":true},"designLine":{"type":"number","nullable":true},"geometry":{"type":"string","nullable":true}},"nullable":true},"definition":{"type":"string","nullable":true},"cross":{"type":"object","properties":{"name":{"type":"string","nullable":true},"type":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true}},"nullable":true},"activations":{"type":"array","items":{"type":"object","properties":{"planet":{"type":"string","nullable":true},"planetId":{"type":"number","nullable":true},"gate":{"type":"number","nullable":true},"line":{"type":"number","nullable":true},"color":{"type":"number","nullable":true},"tone":{"type":"number","nullable":true},"base":{"type":"number","nullable":true},"longitude":{"type":"number","nullable":true},"isPersonality":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true},"personalityActivations":{"type":"array","items":{"type":"object","properties":{"planet":{"type":"string","nullable":true},"planetId":{"type":"number","nullable":true},"gate":{"type":"number","nullable":true},"line":{"type":"number","nullable":true},"color":{"type":"number","nullable":true},"tone":{"type":"number","nullable":true},"base":{"type":"number","nullable":true},"longitude":{"type":"number","nullable":true},"isPersonality":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true},"designActivations":{"type":"array","items":{"type":"object","properties":{"planet":{"type":"string","nullable":true},"planetId":{"type":"number","nullable":true},"gate":{"type":"number","nullable":true},"line":{"type":"number","nullable":true},"color":{"type":"number","nullable":true},"tone":{"type":"number","nullable":true},"base":{"type":"number","nullable":true},"longitude":{"type":"number","nullable":true},"isPersonality":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true},"centers":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","nullable":true},"defined":{"type":"boolean","nullable":true},"open":{"type":"boolean","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"activeGates":{"type":"array","items":{},"nullable":true}},"nullable":true},"nullable":true},"channels":{"type":"array","items":{"type":"object","properties":{"gate1":{"type":"number","nullable":true},"gate2":{"type":"number","nullable":true},"centerA":{"type":"string","nullable":true},"centerB":{"type":"string","nullable":true},"activatedBy":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}},"nullable":true},"nullable":true},"designJd":{"type":"number","nullable":true},"personalityJd":{"type":"number","nullable":true}},"nullable":true},"connections":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","nullable":true},"gate1":{"type":"number","nullable":true},"gate2":{"type":"number","nullable":true},"centerA":{"type":"string","nullable":true},"centerB":{"type":"string","nullable":true},"person1Gates":{"type":"array","items":{},"nullable":true},"person2Gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true}},"nullable":true},"nullable":true},"electromagnetic":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","nullable":true},"gate1":{"type":"number","nullable":true},"gate2":{"type":"number","nullable":true},"centerA":{"type":"string","nullable":true},"centerB":{"type":"string","nullable":true},"person1Gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"person2Gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true}},"nullable":true},"nullable":true},"compromise":{"type":"array","items":{},"nullable":true},"dominance":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","nullable":true},"gate1":{"type":"number","nullable":true},"gate2":{"type":"number","nullable":true},"centerA":{"type":"string","nullable":true},"centerB":{"type":"string","nullable":true},"person1Gates":{"type":"array","items":{},"nullable":true},"person2Gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true}},"nullable":true},"nullable":true},"companionship":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","nullable":true},"gate1":{"type":"number","nullable":true},"gate2":{"type":"number","nullable":true},"centerA":{"type":"string","nullable":true},"centerB":{"type":"string","nullable":true},"person1Gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"person2Gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true}},"nullable":true},"nullable":true},"combinedDefinedCenters":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"combinedDefinition":{"type":"string","nullable":true},"attractionScore":{"type":"number","nullable":true}}}}},"example":{"ok":true,"data":{"chart1":{"input":{"name":"","date":"1990-05-15","time":"15:30:00","timezoneOffset":4,"latitude":50.45,"longitude":30.52,"houseSystem":"P","city":"","cosmogram":false},"type":"Projector","strategy":"Wait for the Invitation","notSelfTheme":"Bitterness","authority":"Emotional (Solar Plexus)","profile":{"profile":"6/3","personalityLine":6,"designLine":3,"geometry":"Left Angle"},"definition":"Split","cross":{"name":"Left Angle Cross of Dedication","type":"LAC","gates":[23]},"activations":[{"planet":"Sun","planetId":0,"gate":23,"line":6,"color":6,"tone":2,"base":2,"longitude":54.37601980167181,"isPersonality":true}],"personalityActivations":[{"planet":"Sun","planetId":0,"gate":23,"line":6,"color":6,"tone":2,"base":2,"longitude":54.37601980167181,"isPersonality":true}],"designActivations":[{"planet":"Sun","planetId":0,"gate":30,"line":3,"color":1,"tone":1,"base":1,"longitude":326.37601741834976,"isPersonality":false}],"centers":[{"name":"Head","defined":true,"open":false,"gates":[61],"activeGates":[61]}],"channels":[{"gate1":13,"gate2":33,"centerA":"G","centerB":"Throat","activatedBy":["personality"]}],"designJd":2447937.835688273,"personalityJd":2448026.9791666665},"chart2":{"input":{"name":"","date":"1985-11-03","time":"09:15:00","timezoneOffset":3,"latitude":48.46,"longitude":35.04,"houseSystem":"P","city":"","cosmogram":false},"type":"Generator","strategy":"Wait for the Sacral Response","notSelfTheme":"Frustration","authority":"Sacral","profile":{"profile":"4/6","personalityLine":4,"designLine":6,"geometry":"Right Angle"},"definition":"Single","cross":{"name":"Juxtaposition Cross of Alertness","type":"JC","gates":[44]},"activations":[{"planet":"Sun","planetId":0,"gate":44,"line":4,"color":3,"tone":1,"base":4,"longitude":220.77033612885523,"isPersonality":true}],"personalityActivations":[{"planet":"Sun","planetId":0,"gate":44,"line":4,"color":3,"tone":1,"base":4,"longitude":220.77033612885523,"isPersonality":true}],"designActivations":[{"planet":"Sun","planetId":0,"gate":33,"line":6,"color":3,"tone":6,"base":3,"longitude":132.77033760638002,"isPersonality":false}],"centers":[{"name":"Head","defined":false,"open":true,"gates":[61],"activeGates":[]}],"channels":[{"gate1":2,"gate2":14,"centerA":"G","centerB":"Sacral","activatedBy":["personality"]}],"designJd":2446282.758661906,"personalityJd":2446372.7604166665},"connections":[{"type":"dominance","gate1":2,"gate2":14,"centerA":"G","centerB":"Sacral","person1Gates":[],"person2Gates":[2]}],"electromagnetic":[{"type":"electromagnetic","gate1":7,"gate2":31,"centerA":"G","centerB":"Throat","person1Gates":[7],"person2Gates":[31]}],"compromise":[],"dominance":[{"type":"dominance","gate1":2,"gate2":14,"centerA":"G","centerB":"Sacral","person1Gates":[],"person2Gates":[2]}],"companionship":[{"type":"companionship","gate1":39,"gate2":39,"centerA":"Root","centerB":"Root","person1Gates":[39],"person2Gates":[39]}],"combinedDefinedCenters":["Head"],"combinedDefinition":"8/9","attractionScore":95}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/human-design/transits":{"post":{"tags":["Human Design"],"summary":"HD Transits","description":"Calculate current Human Design transit activations. Optionally overlay on natal chart to show combined defined centers and channels.","operationId":"human-design_transits","x-quality":"yellow","x-source":"Human Design system originated by Ra Uru Hu (1987). Calculations based on Swiss Ephemeris (88° solar arc). Interpretation system (gates, channels, types, profiles) is intellectual property of Jovian Archive Inc.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HdTransits"},"example":{"date":"2024-06-15","time":"12:00:00","timezoneOffset":0,"natalDate":"1990-05-15","natalTime":"14:30:00","natalTimezoneOffset":3,"latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/human-design/transits \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"2024-06-15\", \"time\": \"12:00:00\", \"timezoneOffset\": 0, \"natalDate\": \"1990-05-15\", \"natalTime\": \"14:30:00\", \"natalTimezoneOffset\": 3, \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/human-design/transits', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"2024-06-15\",\n    \"time\": \"12:00:00\",\n    \"timezoneOffset\": 0,\n    \"natalDate\": \"1990-05-15\",\n    \"natalTime\": \"14:30:00\",\n    \"natalTimezoneOffset\": 3,\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/human-design/transits',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"2024-06-15\",\n      'time': \"12:00:00\",\n      'timezoneOffset': 0,\n      'natalDate': \"1990-05-15\",\n      'natalTime': \"14:30:00\",\n      'natalTimezoneOffset': 3,\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('human-design/transits', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '2024-06-15',\n        'time' => '12:00:00',\n        'timezoneOffset' => 0,\n        'natalDate' => '1990-05-15',\n        'natalTime' => '14:30:00',\n        'natalTimezoneOffset' => 3,\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"transitActivations":{"type":"array","items":{"type":"object","properties":{"planet":{"type":"string","nullable":true},"planetId":{"type":"number","nullable":true},"gate":{"type":"number","nullable":true},"line":{"type":"number","nullable":true},"color":{"type":"number","nullable":true},"tone":{"type":"number","nullable":true},"base":{"type":"number","nullable":true},"longitude":{"type":"number","nullable":true},"isPersonality":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true},"combinedCenters":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","nullable":true},"defined":{"type":"boolean","nullable":true},"open":{"type":"boolean","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"activeGates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true}},"nullable":true},"nullable":true},"combinedChannels":{"type":"array","items":{"type":"object","properties":{"gate1":{"type":"number","nullable":true},"gate2":{"type":"number","nullable":true},"centerA":{"type":"string","nullable":true},"centerB":{"type":"string","nullable":true},"activatedBy":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"transitActivations":[{"planet":"Sun","planetId":0,"gate":12,"line":3,"color":3,"tone":3,"base":3,"longitude":84.87590991671424,"isPersonality":false}],"combinedCenters":[{"name":"Head","defined":true,"open":false,"gates":[61],"activeGates":[61]}],"combinedChannels":[{"gate1":1,"gate2":8,"centerA":"G","centerB":"Throat","activatedBy":["personality"]}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/hd/incarnation-cross":{"post":{"tags":["Human Design"],"summary":"Incarnation Cross","description":"Return the Incarnation Cross from birth data (or directly from gate numbers). Includes cross name, type, and theme description. With gate numbers, personalitySunLine and designSunLine decide the angle: lines 1-3 and profile 4/6 are right angle, 4/1 juxtaposition, 5 and 6 left angle.","operationId":"hd_incarnation-cross","x-quality":"yellow","x-source":"Human Design system originated by Ra Uru Hu (1987). Calculations based on Swiss Ephemeris (88° solar arc). Interpretation system (gates, channels, types, profiles) is intellectual property of Jovian Archive Inc.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/hd/incarnation-cross \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/hd/incarnation-cross', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/hd/incarnation-cross',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('hd/incarnation-cross', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"name":{"type":"string","nullable":true},"type":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"lines":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"theme":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"name":"Left Angle Cross of Dedication","type":"LAC","gates":[23,43,30,29],"lines":[1,1,1,1],"theme":"Physical love and incarnation"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/hd/dream-rave":{"post":{"tags":["Human Design"],"summary":"Dream Rave","description":"Calculate the Dream Rave chart: sleep type, active gates in lower centers (Sacral, Solar Plexus, Root), and dream themes.","operationId":"hd_dream-rave","x-quality":"yellow","x-source":"Human Design system originated by Ra Uru Hu (1987). Calculations based on Swiss Ephemeris (88° solar arc). Interpretation system (gates, channels, types, profiles) is intellectual property of Jovian Archive Inc.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/hd/dream-rave \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/hd/dream-rave', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/hd/dream-rave',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('hd/dream-rave', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"activeGates":{"type":"array","items":{"type":"object","properties":{"gate":{"type":"number","nullable":true},"realm":{"type":"string","nullable":true},"dreamName_en":{"type":"string","nullable":true},"dreamName_ru":{"type":"string","nullable":true},"dreamName_uk":{"type":"string","nullable":true},"activatedBy":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}},"nullable":true},"nullable":true},"channels":{"type":"array","items":{},"nullable":true},"centers":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","nullable":true},"defined":{"type":"boolean","nullable":true},"activeGates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true}},"nullable":true},"nullable":true},"type":{"type":"string","nullable":true},"activePortals":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"weakPoints":{"type":"array","items":{},"nullable":true}}}}},"example":{"ok":true,"data":{"activeGates":[{"gate":1,"realm":"light","dreamName_en":"Joy","dreamName_ru":"Радость","dreamName_uk":"Радість","activatedBy":["Pluto (P)"]}],"channels":[],"centers":[{"name":"Throat","defined":false,"activeGates":[1]}],"type":"Dream Reflector","activePortals":[22],"weakPoints":[]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/hd/hologenetic":{"post":{"tags":["Human Design"],"summary":"Hologenetic Profile","description":"Calculate the Gene Keys hologenetic profile (Activation Sequence, Venus Sequence, Pearl Sequence) from HD gate activations.","operationId":"hd_hologenetic","x-quality":"yellow","x-source":"Human Design system originated by Ra Uru Hu (1987). Calculations based on Swiss Ephemeris (88° solar arc). Interpretation system (gates, channels, types, profiles) is intellectual property of Jovian Archive Inc.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/hd/hologenetic \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/hd/hologenetic', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/hd/hologenetic',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('hd/hologenetic', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"spheres":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","nullable":true},"name_en":{"type":"string","nullable":true},"name_ru":{"type":"string","nullable":true},"name_uk":{"type":"string","nullable":true},"desc_en":{"type":"string","nullable":true},"desc_ru":{"type":"string","nullable":true},"desc_uk":{"type":"string","nullable":true},"sequence":{"type":"string","nullable":true},"planet":{"type":"string","nullable":true},"isPersonality":{"type":"boolean","nullable":true},"gate":{"type":"number","nullable":true},"line":{"type":"number","nullable":true},"partnerGate":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"activationSequence":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","nullable":true},"name_en":{"type":"string","nullable":true},"name_ru":{"type":"string","nullable":true},"name_uk":{"type":"string","nullable":true},"desc_en":{"type":"string","nullable":true},"desc_ru":{"type":"string","nullable":true},"desc_uk":{"type":"string","nullable":true},"sequence":{"type":"string","nullable":true},"planet":{"type":"string","nullable":true},"isPersonality":{"type":"boolean","nullable":true},"gate":{"type":"number","nullable":true},"line":{"type":"number","nullable":true},"partnerGate":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"venusSequence":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","nullable":true},"name_en":{"type":"string","nullable":true},"name_ru":{"type":"string","nullable":true},"name_uk":{"type":"string","nullable":true},"desc_en":{"type":"string","nullable":true},"desc_ru":{"type":"string","nullable":true},"desc_uk":{"type":"string","nullable":true},"sequence":{"type":"string","nullable":true},"planet":{"type":"string","nullable":true},"isPersonality":{"type":"boolean","nullable":true},"gate":{"type":"number","nullable":true},"line":{"type":"number","nullable":true},"partnerGate":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"pearlSequence":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","nullable":true},"name_en":{"type":"string","nullable":true},"name_ru":{"type":"string","nullable":true},"name_uk":{"type":"string","nullable":true},"desc_en":{"type":"string","nullable":true},"desc_ru":{"type":"string","nullable":true},"desc_uk":{"type":"string","nullable":true},"sequence":{"type":"string","nullable":true},"planet":{"type":"string","nullable":true},"isPersonality":{"type":"boolean","nullable":true},"gate":{"type":"number","nullable":true},"line":{"type":"number","nullable":true},"partnerGate":{"type":"number","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"spheres":[{"id":"lifework","name_en":"Life's Work","name_ru":"Дело Жизни","name_uk":"Справа Життя","desc_en":"Your core creative theme - what you are here to express in the world through your conscious talents and gifts.","desc_ru":"Ваша основная творческая тема - то, что вы призваны выражать в мире через осознанные таланты и дары.","desc_uk":"Ваша основна творча тема - те, що ви покликані виражати у світі через усвідомлені таланти та дари.","sequence":"activation","planet":"Sun","isPersonality":true,"gate":23,"line":6,"partnerGate":43}],"activationSequence":[{"id":"lifework","name_en":"Life's Work","name_ru":"Дело Жизни","name_uk":"Справа Життя","desc_en":"Your core creative theme - what you are here to express in the world through your conscious talents and gifts.","desc_ru":"Ваша основная творческая тема - то, что вы призваны выражать в мире через осознанные таланты и дары.","desc_uk":"Ваша основна творча тема - те, що ви покликані виражати у світі через усвідомлені таланти та дари.","sequence":"activation","planet":"Sun","isPersonality":true,"gate":23,"line":6,"partnerGate":43}],"venusSequence":[{"id":"attraction","name_en":"Attraction","name_ru":"Притяжение","name_uk":"Притягання","desc_en":"What you consciously attract in relationships - your magnetic quality and the type of people drawn to you.","desc_ru":"Что вы осознанно привлекаете в отношениях - ваше магнетическое качество и тип людей, которые к вам тянутся.","desc_uk":"Що ви усвідомлено притягуєте у відносинах - ваша магнетична якість та тип людей, яких до вас тягне.","sequence":"venus","planet":"Venus","isPersonality":true,"gate":21,"line":4,"partnerGate":48}],"pearlSequence":[{"id":"vocation","name_en":"Vocation","name_ru":"Призвание","name_uk":"Покликання","desc_en":"Your true vocation - the work that brings you prosperity when aligned with your authentic nature.","desc_ru":"Ваше истинное призвание - работа, которая приносит процветание, когда вы следуете своей подлинной природе.","desc_uk":"Ваше справжнє покликання - робота, що приносить процвітання, коли ви слідуєте своїй справжній природі.","sequence":"pearl","planet":"Jupiter","isPersonality":true,"gate":39,"line":1,"partnerGate":38}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/hd/penta":{"post":{"tags":["Human Design"],"summary":"Penta Chart","description":"Calculate the Penta (group) chart for 3–5 people: combined BodyGraph showing group dynamics and collective conditioning.","operationId":"hd_penta","x-quality":"yellow","x-source":"Human Design system originated by Ra Uru Hu (1987). Calculations based on Swiss Ephemeris (88° solar arc). Interpretation system (gates, channels, types, profiles) is intellectual property of Jovian Archive Inc.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Penta"},"example":{"inputs":[{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52},{"date":"1985-11-03","time":"09:15:00","timezone":"Europe/Kyiv","latitude":48.46,"longitude":35.04},{"date":"1992-07-20","time":"22:00:00","timezoneOffset":3,"latitude":50.45,"longitude":30.52}]}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/hd/penta \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"inputs\": [ { \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }, { \"date\": \"1985-11-03\", \"time\": \"09:15:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 48.46, \"longitude\": 35.04 }, { \"date\": \"1992-07-20\", \"time\": \"22:00:00\", \"timezoneOffset\": 3, \"latitude\": 50.45, \"longitude\": 30.52 } ] }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/hd/penta', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"inputs\": [\n      {\n        \"date\": \"1990-05-15\",\n        \"time\": \"15:30:00\",\n        \"timezone\": \"Europe/Kyiv\",\n        \"latitude\": 50.45,\n        \"longitude\": 30.52\n      },\n      {\n        \"date\": \"1985-11-03\",\n        \"time\": \"09:15:00\",\n        \"timezone\": \"Europe/Kyiv\",\n        \"latitude\": 48.46,\n        \"longitude\": 35.04\n      },\n      {\n        \"date\": \"1992-07-20\",\n        \"time\": \"22:00:00\",\n        \"timezoneOffset\": 3,\n        \"latitude\": 50.45,\n        \"longitude\": 30.52\n      }\n    ]\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/hd/penta',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'inputs': [\n        {\n          'date': \"1990-05-15\",\n          'time': \"15:30:00\",\n          'timezone': \"Europe/Kyiv\",\n          'latitude': 50.45,\n          'longitude': 30.52\n        },\n        {\n          'date': \"1985-11-03\",\n          'time': \"09:15:00\",\n          'timezone': \"Europe/Kyiv\",\n          'latitude': 48.46,\n          'longitude': 35.04\n        },\n        {\n          'date': \"1992-07-20\",\n          'time': \"22:00:00\",\n          'timezoneOffset': 3,\n          'latitude': 50.45,\n          'longitude': 30.52\n        }\n      ]\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('hd/penta', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'inputs' => [[\n            'date' => '1990-05-15',\n            'time' => '15:30:00',\n            'timezone' => 'Europe/Kyiv',\n            'latitude' => 50.45,\n            'longitude' => 30.52,\n        ], [\n            'date' => '1985-11-03',\n            'time' => '09:15:00',\n            'timezone' => 'Europe/Kyiv',\n            'latitude' => 48.46,\n            'longitude' => 35.04,\n        ], [\n            'date' => '1992-07-20',\n            'time' => '22:00:00',\n            'timezoneOffset' => 3,\n            'latitude' => 50.45,\n            'longitude' => 30.52,\n        ]],\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"size":{"type":"number","nullable":true},"definedCenters":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"channels":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","nullable":true},"defined":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true},"pentaAuthority":{"type":"string","nullable":true},"role":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"size":3,"definedCenters":["Throat","Sacral","Root"],"channels":[{"id":"20-57","defined":true}],"pentaAuthority":"Splenic","role":"Nourishment"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/hd/group-overlay":{"post":{"tags":["Human Design"],"summary":"HD Group Overlay","description":"Calculate a combined HD group overlay chart for 2 or more people, showing collectively defined centers and channels.","operationId":"hd_group-overlay","x-quality":"yellow","x-source":"Human Design system originated by Ra Uru Hu (1987). Calculations based on Swiss Ephemeris (88° solar arc). Interpretation system (gates, channels, types, profiles) is intellectual property of Jovian Archive Inc.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MultiChart"},"example":{"inputs":[{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52},{"date":"1985-11-03","time":"09:15:00","timezone":"Europe/Kyiv","latitude":48.46,"longitude":35.04}]}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/hd/group-overlay \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"inputs\": [ { \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }, { \"date\": \"1985-11-03\", \"time\": \"09:15:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 48.46, \"longitude\": 35.04 } ] }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/hd/group-overlay', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"inputs\": [\n      {\n        \"date\": \"1990-05-15\",\n        \"time\": \"15:30:00\",\n        \"timezone\": \"Europe/Kyiv\",\n        \"latitude\": 50.45,\n        \"longitude\": 30.52\n      },\n      {\n        \"date\": \"1985-11-03\",\n        \"time\": \"09:15:00\",\n        \"timezone\": \"Europe/Kyiv\",\n        \"latitude\": 48.46,\n        \"longitude\": 35.04\n      }\n    ]\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/hd/group-overlay',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'inputs': [\n        {\n          'date': \"1990-05-15\",\n          'time': \"15:30:00\",\n          'timezone': \"Europe/Kyiv\",\n          'latitude': 50.45,\n          'longitude': 30.52\n        },\n        {\n          'date': \"1985-11-03\",\n          'time': \"09:15:00\",\n          'timezone': \"Europe/Kyiv\",\n          'latitude': 48.46,\n          'longitude': 35.04\n        }\n      ]\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('hd/group-overlay', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'inputs' => [[\n            'date' => '1990-05-15',\n            'time' => '15:30:00',\n            'timezone' => 'Europe/Kyiv',\n            'latitude' => 50.45,\n            'longitude' => 30.52,\n        ], [\n            'date' => '1985-11-03',\n            'time' => '09:15:00',\n            'timezone' => 'Europe/Kyiv',\n            'latitude' => 48.46,\n            'longitude' => 35.04,\n        ]],\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"count":{"type":"number","nullable":true},"definedCenters":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"definedChannels":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","nullable":true},"from":{"type":"string","nullable":true},"to":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"openCenters":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"count":2,"definedCenters":["Head","Ajna"],"definedChannels":[{"id":"34-20","from":"chart1.gate34","to":"chart2.gate20"}],"openCenters":["Head","Ajna","Heart","G","SolarPlexus","Spleen","Root"]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/hd/sensitivity":{"post":{"tags":["Human Design"],"summary":"HD Time Sensitivity","description":"Analyze how sensitive the HD chart type/authority is to birth time changes. Returns windows where the chart is stable vs. in transition.","operationId":"hd_sensitivity","x-quality":"yellow","x-source":"Human Design system originated by Ra Uru Hu (1987). Calculations based on Swiss Ephemeris (88° solar arc). Interpretation system (gates, channels, types, profiles) is intellectual property of Jovian Archive Inc.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/hd/sensitivity \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/hd/sensitivity', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/hd/sensitivity',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('hd/sensitivity', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"stableWindow":{"type":"object","properties":{"start":{"type":"string","nullable":true},"end":{"type":"string","nullable":true}},"nullable":true},"transitions":{"type":"array","items":{"type":"object","properties":{"at":{"type":"string","nullable":true},"change":{"type":"string","nullable":true},"from":{"type":"string","nullable":true},"to":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"confidence":{"type":"number","nullable":true}}}}},"example":{"ok":true,"data":{"stableWindow":{"start":"14:15:00","end":"14:55:00"},"transitions":[{"at":"14:55:00","change":"authority","from":"Sacral","to":"Emotional"}],"confidence":0.91}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/hd/rave-new-years":{"post":{"tags":["Human Design"],"summary":"Rave New Years","description":"Calculate Rave New Year dates (exact moment Sun enters Gate 41) for a range of years. Max range: 50 years.","operationId":"hd_rave-new-years","x-quality":"yellow","x-source":"Human Design system originated by Ra Uru Hu (1987). Calculations based on Swiss Ephemeris (88° solar arc). Interpretation system (gates, channels, types, profiles) is intellectual property of Jovian Archive Inc.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/YearRange"},"example":{"startYear":2020,"endYear":2030}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/hd/rave-new-years \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"startYear\": 2020, \"endYear\": 2030 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/hd/rave-new-years', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"startYear\": 2020,\n    \"endYear\": 2030\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/hd/rave-new-years',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'startYear': 2020,\n      'endYear': 2030\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('hd/rave-new-years', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'startYear' => 2020,\n        'endYear' => 2030,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"count":{"type":"number","nullable":true},"years":{"type":"array","items":{"type":"object","properties":{"year":{"type":"number","nullable":true},"date":{"type":"string","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"count":11,"years":[{"year":2020,"date":"2020-01-22T14:03:00.000Z"}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/hd/design-date":{"post":{"tags":["Human Design"],"summary":"HD Design Date","description":"Find the Design date (the moment 88° of solar arc before birth) for a given birth moment, the unconscious imprinting point.","operationId":"hd_design-date","x-quality":"yellow","x-source":"Human Design system originated by Ra Uru Hu (1987). Calculations based on Swiss Ephemeris (88° solar arc). Interpretation system (gates, channels, types, profiles) is intellectual property of Jovian Archive Inc.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/hd/design-date \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/hd/design-date', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/hd/design-date',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('hd/design-date', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"birthJd":{"type":"number","nullable":true},"designJd":{"type":"number","nullable":true},"designDate":{"type":"object","properties":{"year":{"type":"number","nullable":true},"month":{"type":"number","nullable":true},"day":{"type":"number","nullable":true},"hour":{"type":"number","nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"birthJd":2448026.9791666665,"designJd":2447937.835688273,"designDate":{"year":1990,"month":2,"day":15,"hour":8.05651855096221}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/hd/circuitry":{"post":{"tags":["Human Design"],"summary":"HD Circuitry Analysis","description":"Analyze which of the 3 Circuits (Tribal, Individual, Collective) and 6 Sub-circuits are activated in a Human Design chart based on defined channels.","operationId":"hd_circuitry","x-quality":"yellow","x-source":"Human Design system originated by Ra Uru Hu (1987). Calculations based on Swiss Ephemeris (88° solar arc). Interpretation system (gates, channels, types, profiles) is intellectual property of Jovian Archive Inc.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/hd/circuitry \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/hd/circuitry', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/hd/circuitry',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('hd/circuitry', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"circuits":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"color":{"type":"string","nullable":true},"subCircuits":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"channels":{"type":"array","items":{"type":"object","properties":{"gate1":{"type":"number","nullable":true},"gate2":{"type":"number","nullable":true},"active":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true},"activeCount":{"type":"number","nullable":true},"totalCount":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"activeCount":{"type":"number","nullable":true},"totalCount":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"totalActive":{"type":"number","nullable":true}}}}},"example":{"ok":true,"data":{"circuits":[{"type":"tribal","name":"Tribal Circuit","color":"#e25050","subCircuits":[{"type":"ego","name":"Ego (Will)","channels":[{"gate1":21,"gate2":45,"active":false}],"activeCount":0,"totalCount":4}],"activeCount":0,"totalCount":7}],"totalActive":4}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/acg":{"post":{"tags":["Astro-Geography"],"summary":"Astrocartography (A*C*G)","description":"Calculate A*C*G lines for all planets: the geodetic map lines where each planet was on an angle at birth.","operationId":"acg","x-quality":"green","x-source":"Astrocartography per Jim Lewis \"Astrolocality Astrology\" 1976 + Erlewine. Local space lines per Michael Erlewine. Geodetic per W. Sepharial / Carter / E.C. Cole. Relocation chart standard technique.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/acg \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/acg', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/acg',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('acg', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"lines":{"type":"array","items":{"type":"object","properties":{"planet":{"type":"string","nullable":true},"planetId":{"type":"number","nullable":true},"type":{"type":"string","nullable":true},"coordinates":{"type":"array","items":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"lines":[{"planet":"Sun","planetId":0,"type":"MC","coordinates":[[-85]]}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/parans":{"post":{"tags":["Astro-Geography"],"summary":"Parans","description":"Crossing points of two A*C*G lines: the places where two planets were simultaneously angular. Returns every planet-to-planet crossing with its coordinates.","operationId":"parans","x-quality":"green","x-source":"Astrocartography per Jim Lewis \"Astrolocality Astrology\" 1976 + Erlewine. Local space lines per Michael Erlewine. Geodetic per W. Sepharial / Carter / E.C. Cole. Relocation chart standard technique.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/parans \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/parans', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/parans',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('parans', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"count":{"type":"number","nullable":true},"parans":{"type":"array","items":{"type":"object","properties":{"planet1Id":{"type":"number","nullable":true},"planet1Name":{"type":"string","nullable":true},"line1Type":{"type":"string","nullable":true},"planet2Id":{"type":"number","nullable":true},"planet2Name":{"type":"string","nullable":true},"line2Type":{"type":"string","nullable":true},"location":{"type":"object","properties":{"lat":{"type":"number","nullable":true},"lng":{"type":"number","nullable":true}},"nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"count":388,"parans":[{"planet1Id":0,"planet1Name":"Sun","line1Type":"MC","planet2Id":1,"planet2Name":"Moon","line2Type":"DSC","location":{"lat":-43.93625706456217,"lng":6.57354514472695}}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/acg/best-places":{"post":{"tags":["Astro-Geography"],"summary":"Best places for a life category","description":"Rank cities against the astrocartography lines of a chart for one of the 19 life categories. Distance to a line is computed from the body hour angle and altitude rather than against a discretised polyline, so it is exact: the distance to a horizon line IS the altitude in degrees of arc, and a meridian line offset is the hour angle times cos(latitude). Supportive and challenging totals are returned separately with every contributing line and its distance, so a strong-but-turbulent city is distinguishable from an average one. Bundled GeoNames set of 34,028 places above 15,000 people. **Not geocoding**: a smaller town is absent from the ranking rather than ranked poorly, and an arbitrary place name cannot be resolved.","operationId":"acg_best-places","x-quality":"green","x-source":"Sky geometry is the same as /acg. Category weights and polarities from data/acg-categories.ts (audited 2026-07-26). Orb default 1126 km is the 700 miles Jim Lewis used. City data: GeoNames cities15000 under CC BY 4.0, provenance and trimming in api-calc/data/geonames/LICENSE.md; attribution ships in the response because a downstream integrator inherits the obligation. Distance geometry pinned by placing a synthetic body directly overhead (0 km to MC, 10008 km to the horizon) and by three named cities cross-checked against /acg-zones.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AcgBestPlaces"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52,"category":"career","countries":["UA","PL"],"orbKm":1126,"limit":25,"sort":"net"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/acg/best-places \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52, \"category\": \"career\", \"countries\": [ \"UA\", \"PL\" ], \"orbKm\": 1126, \"limit\": 25, \"sort\": \"net\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/acg/best-places', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52,\n    \"category\": \"career\",\n    \"countries\": [\n      \"UA\",\n      \"PL\"\n    ],\n    \"orbKm\": 1126,\n    \"limit\": 25,\n    \"sort\": \"net\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/acg/best-places',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52,\n      'category': \"career\",\n      'countries': [\n        \"UA\",\n        \"PL\"\n      ],\n      'orbKm': 1126,\n      'limit': 25,\n      'sort': \"net\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('acg/best-places', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n        'category' => 'career',\n        'countries' => ['UA', 'PL'],\n        'orbKm' => 1126,\n        'limit' => 25,\n        'sort' => 'net',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"type":{"type":"string","nullable":true},"category":{"type":"object","properties":{"id":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"description":{"type":"string","nullable":true},"language":{"type":"string","nullable":true},"lines":{"type":"array","items":{"type":"object","properties":{"planetId":{"type":"number","nullable":true},"planet":{"type":"string","nullable":true},"angle":{"type":"string","nullable":true},"weight":{"type":"number","nullable":true},"polarity":{"type":"string","nullable":true}},"nullable":true},"nullable":true}},"nullable":true},"orbKm":{"type":"number","nullable":true},"sort":{"type":"string","nullable":true},"minSeparationKm":{"type":"number","nullable":true},"suppressedAsTooClose":{"type":"number","nullable":true},"maxPossibleSupportive":{"type":"number","nullable":true},"pool":{"type":"object","properties":{"citiesConsidered":{"type":"number","nullable":true},"citiesWithAnyLine":{"type":"number","nullable":true},"minPopulation":{"type":"number","nullable":true},"countries":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}},"nullable":true},"count":{"type":"number","nullable":true},"places":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","nullable":true},"country":{"type":"string","nullable":true},"countryCode":{"type":"string","nullable":true},"admin1Code":{"type":"string","nullable":true},"lat":{"type":"number","nullable":true},"lon":{"type":"number","nullable":true},"population":{"type":"number","nullable":true},"timezone":{"type":"string","nullable":true},"supportive":{"type":"number","nullable":true},"challenging":{"type":"number","nullable":true},"net":{"type":"number","nullable":true},"supportivePercent":{"type":"number","nullable":true},"lines":{"type":"array","items":{"type":"object","properties":{"planetId":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"angle":{"type":"string","nullable":true},"weight":{"type":"number","nullable":true},"polarity":{"type":"string","nullable":true},"distanceKm":{"type":"number","nullable":true},"contribution":{"type":"number","nullable":true}},"nullable":true},"nullable":true}},"nullable":true},"nullable":true},"dataset":{"type":"object","properties":{"source":{"type":"string","nullable":true},"url":{"type":"string","nullable":true},"licence":{"type":"string","nullable":true},"downloaded":{"type":"string","nullable":true},"count":{"type":"number","nullable":true},"note":{"type":"string","nullable":true}},"nullable":true},"attribution":{"type":"object","properties":{"source":{"type":"string","nullable":true},"sourceUrl":{"type":"string","nullable":true},"licence":{"type":"string","nullable":true},"licenceUrl":{"type":"string","nullable":true},"notice":{"type":"string","nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"type":"acg-best-places","category":{"id":"career","name":"Кар’єра","description":"Професійна реалізація, посада, репутація в галузі.","language":"uk","lines":[{"planetId":0,"planet":"Sun","angle":"MC","weight":3,"polarity":"supportive"}]},"orbKm":1126,"sort":"net","minSeparationKm":300,"suppressedAsTooClose":345,"maxPossibleSupportive":12,"pool":{"citiesConsidered":760,"citiesWithAnyLine":352,"minPopulation":15000,"countries":["UA"]},"count":7,"places":[{"name":"Świnoujście","country":"Poland","countryCode":"PL","admin1Code":"87","lat":53.9105,"lon":14.2471,"population":40919,"timezone":"Europe/Warsaw","supportive":1.6609,"challenging":0,"net":1.6609,"supportivePercent":13.8,"lines":[{"planetId":0,"planetName":"Sun","angle":"MC","weight":3,"polarity":"supportive","distanceKm":503,"contribution":1.6609}]}],"dataset":{"source":"GeoNames cities15000","url":"https://download.geonames.org/export/dump/cities15000.zip","licence":"CC BY 4.0","downloaded":"2026-08-05","count":34028,"note":"A fixed list of populated places above 15000 people. This endpoint does not geocode: a smaller town is absent from the ranking rather than ranked poorly, and an arbitrary place name cannot be resolved. Use POST /v1/acg-zones with your own coordinates to score a specific point."},"attribution":{"source":"GeoNames","sourceUrl":"https://www.geonames.org/","licence":"CC BY 4.0","licenceUrl":"https://creativecommons.org/licenses/by/4.0/","notice":"City names, coordinates and populations from the GeoNames geographical database, used under CC BY 4.0. Displaying this data requires carrying the same credit."}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/acg/countries":{"get":{"tags":["Astro-Geography"],"summary":"Countries available for ranking","description":"Which countries the bundled city list can rank, and how many qualifying cities each has. Asking for a country with two cities and getting two results should not look like a bug.","operationId":"acg_countries_get","x-quality":"green","x-source":"Derived from the bundled GeoNames set. No ephemeris call.","security":[{"ApiKeyAuth":[]}],"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X GET https://api.astroway.info/v1/acg/countries \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/acg/countries', {\n  method: 'GET',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.get(\n    'https://api.astroway.info/v1/acg/countries',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->get('acg/countries', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"count":{"type":"number","nullable":true},"totalCities":{"type":"number","nullable":true},"countries":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"cities":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"dataset":{"type":"object","properties":{"source":{"type":"string","nullable":true},"url":{"type":"string","nullable":true},"licence":{"type":"string","nullable":true},"downloaded":{"type":"string","nullable":true},"count":{"type":"number","nullable":true}},"nullable":true},"attribution":{"type":"object","properties":{"source":{"type":"string","nullable":true},"sourceUrl":{"type":"string","nullable":true},"licence":{"type":"string","nullable":true},"licenceUrl":{"type":"string","nullable":true},"notice":{"type":"string","nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"count":210,"totalCities":34028,"countries":[{"code":"AF","name":"Afghanistan","cities":54}],"dataset":{"source":"GeoNames cities15000","url":"https://download.geonames.org/export/dump/cities15000.zip","licence":"CC BY 4.0","downloaded":"2026-08-05","count":34028},"attribution":{"source":"GeoNames","sourceUrl":"https://www.geonames.org/","licence":"CC BY 4.0","licenceUrl":"https://creativecommons.org/licenses/by/4.0/","notice":"City names, coordinates and populations from the GeoNames geographical database, used under CC BY 4.0. Displaying this data requires carrying the same credit."}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/parans/star":{"post":{"tags":["Astro-Geography"],"summary":"Star-planet parans (Brady)","description":"Latitudes where a fixed star and a planet are angular at the same moment, which is how Brady tabulates a paran: not a place, a latitude. Twelve event pairs per star and planet (rise, set, culminate, anticulminate, minus meridian against meridian, which is a shared right ascension rather than a paran). Each row carries the houses of the technique in plain form: which body does what, the latitude, and the meridian where it happens at this chart moment. Solved on hour angles rather than by intersecting map polylines, so the latitude is exact rather than quantised to the polyline step. `horizon` selects the geometric horizon (default) or the apparent one at -34 arcmin, measured at about two degrees of paran latitude at mid-latitudes.","operationId":"parans_star","x-quality":"green","x-source":"Bernadette Brady, \"Brady's Book of Fixed Stars\" (1998) for the technique and for reporting a paran as a latitude; the astronomy is the standard semi-diurnal arc, Meeus \"Astronomical Algorithms\" ch. 15. The ecliptic-to-equatorial conversion stars need is pinned against Swiss Ephemeris by running the planets through it and comparing with SEFLG_EQUATORIAL. Every returned latitude is verified to put both bodies angular at one sidereal time, the meridian cases against their closed form, and the whole solver against the equator-mirror invariant. Brady's own worked Castor example is reproduced to within a degree.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StarParans"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52,"stars":["Regulus","Sirius"],"planets":[0,4],"latitudeLimit":60,"horizon":"geometric"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/parans/star \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52, \"stars\": [ \"Regulus\", \"Sirius\" ], \"planets\": [ 0, 4 ], \"latitudeLimit\": 60, \"horizon\": \"geometric\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/parans/star', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52,\n    \"stars\": [\n      \"Regulus\",\n      \"Sirius\"\n    ],\n    \"planets\": [\n      0,\n      4\n    ],\n    \"latitudeLimit\": 60,\n    \"horizon\": \"geometric\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/parans/star',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52,\n      'stars': [\n        \"Regulus\",\n        \"Sirius\"\n      ],\n      'planets': [\n        0,\n        4\n      ],\n      'latitudeLimit': 60,\n      'horizon': \"geometric\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('parans/star', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n        'stars' => ['Regulus', 'Sirius'],\n        'planets' => [0, 4],\n        'latitudeLimit' => 60,\n        'horizon' => 'geometric',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"type":{"type":"string","nullable":true},"julianDay":{"type":"number","nullable":true},"gmst":{"type":"number","nullable":true},"obliquity":{"type":"number","nullable":true},"latitudeLimit":{"type":"number","nullable":true},"horizon":{"type":"string","nullable":true},"count":{"type":"number","nullable":true},"stars":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","nullable":true},"magnitude":{"type":"number","nullable":true},"rightAscension":{"type":"number","nullable":true},"declination":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"requestedStarsNotFound":{"type":"array","items":{},"nullable":true},"starsWithNoParans":{"type":"array","items":{},"nullable":true},"parans":{"type":"array","items":{"type":"object","properties":{"star":{"type":"string","nullable":true},"starEvent":{"type":"string","nullable":true},"planetId":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"planetEvent":{"type":"string","nullable":true},"latitude":{"type":"number","nullable":true},"longitude":{"type":"number","nullable":true},"lst":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"note":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"type":"star-parans","julianDay":2448026.9791666665,"gmst":45.4357,"obliquity":23.440544,"latitudeLimit":60,"horizon":"geometric","count":8,"stars":[{"name":"Regulus","magnitude":1.4,"rightAscension":151.9686,"declination":12.0133}],"requestedStarsNotFound":[],"starsWithNoParans":[],"parans":[{"star":"Regulus","starEvent":"set","planetId":0,"planetName":"Sun","planetEvent":"anticulminate","latitude":-39.1022,"longitude":-173.4265,"lst":232.0092}],"note":"A paran is a latitude, which is how Brady tabulates it. `longitude` is the meridian where the pair is angular at this chart moment, and is an addition to the technique rather than part of it: the latitude is the durable half."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/zenith":{"post":{"tags":["Astro-Geography"],"summary":"Zenith","description":"Find all geographic locations where a given planet is exactly at the zenith (MC) at the birth moment.","operationId":"zenith","x-quality":"green","x-source":"Astrocartography per Jim Lewis \"Astrolocality Astrology\" 1976 + Erlewine. Local space lines per Michael Erlewine. Geodetic per W. Sepharial / Carter / E.C. Cole. Relocation chart standard technique.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52,"planetId":0}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/zenith \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52, \"planetId\": 0 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/zenith', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52,\n    \"planetId\": 0\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/zenith',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52,\n      'planetId': 0\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('zenith', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n        'planetId' => 0,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"count":{"type":"number","nullable":true},"points":{"type":"array","items":{"type":"object","properties":{"planetId":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"lat":{"type":"number","nullable":true},"lng":{"type":"number","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"count":13,"points":[{"planetId":0,"planetName":"Sun","lat":18.867035147029778,"lng":6.573545144726893}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/local-space":{"post":{"tags":["Astro-Geography"],"summary":"Local Space Chart","description":"Calculate local space chart: azimuth and altitude of each planet from a given geographic location at the birth moment.","operationId":"local-space","x-quality":"green","x-source":"Astrocartography per Jim Lewis \"Astrolocality Astrology\" 1976 + Erlewine. Local space lines per Michael Erlewine. Geodetic per W. Sepharial / Carter / E.C. Cole. Relocation chart standard technique.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/local-space \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/local-space', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/local-space',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('local-space', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"birthplace":{"type":"object","properties":{"latitude":{"type":"number","nullable":true},"longitude":{"type":"number","nullable":true}},"nullable":true},"count":{"type":"number","nullable":true},"lines":{"type":"array","items":{"type":"object","properties":{"planetId":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"azimuth":{"type":"number","nullable":true},"altitude":{"type":"number","nullable":true},"color":{"type":"string","nullable":true},"points":{"type":"array","items":{"type":"object","properties":{"lat":{"type":"number","nullable":true},"lng":{"type":"number","nullable":true}},"nullable":true},"nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"birthplace":{"latitude":50.45,"longitude":30.52},"count":13,"lines":[{"planetId":0,"planetName":"Sun","azimuth":219.80181704555417,"altitude":53.13092653828096,"color":"#FFB300","points":[{"lat":50.45,"lng":30.519999999999982}]}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/local-space/influence-zone":{"post":{"tags":["Astro-Geography"],"summary":"Local Space Influence Zone","description":"Calculate the local space influence zone lines for a chart relocated to a specific city: lines on the map showing planet directions from that location.","operationId":"local-space_influence-zone","x-quality":"green","x-source":"Astrocartography per Jim Lewis \"Astrolocality Astrology\" 1976 + Erlewine. Local space lines per Michael Erlewine. Geodetic per W. Sepharial / Carter / E.C. Cole. Relocation chart standard technique.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InfluenceZone"},"example":{"latitude":50.45,"longitude":30.52,"azimuth":90,"halfAngle":4}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/local-space/influence-zone \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"latitude\": 50.45, \"longitude\": 30.52, \"azimuth\": 90, \"halfAngle\": 4 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/local-space/influence-zone', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"latitude\": 50.45,\n    \"longitude\": 30.52,\n    \"azimuth\": 90,\n    \"halfAngle\": 4\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/local-space/influence-zone',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'latitude': 50.45,\n      'longitude': 30.52,\n      'azimuth': 90,\n      'halfAngle': 4\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('local-space/influence-zone', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n        'azimuth' => 90,\n        'halfAngle' => 4,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"polygon":{"type":"array","items":{"type":"object","properties":{"lat":{"type":"number","nullable":true},"lng":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"count":{"type":"number","nullable":true}}}}},"example":{"ok":true,"data":{"polygon":[{"lat":50.45,"lng":30.519999999999982}],"count":93}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/relocation":{"post":{"tags":["Astro-Geography"],"summary":"Relocation Chart","description":"Recalculate a natal chart for a new geographic location (same birth moment, different lat/lng). Returns new houses and planet house positions.","operationId":"relocation","x-quality":"green","x-source":"Astrocartography per Jim Lewis \"Astrolocality Astrology\" 1976 + Erlewine. Local space lines per Michael Erlewine. Geodetic per W. Sepharial / Carter / E.C. Cole. Relocation chart standard technique.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Relocation"},"example":{"natal":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52},"target":{"latitude":48.8566,"longitude":2.3522}}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/relocation \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"natal\": { \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }, \"target\": { \"latitude\": 48.8566, \"longitude\": 2.3522 } }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/relocation', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"natal\": {\n      \"date\": \"1990-05-15\",\n      \"time\": \"15:30:00\",\n      \"timezone\": \"Europe/Kyiv\",\n      \"latitude\": 50.45,\n      \"longitude\": 30.52\n    },\n    \"target\": {\n      \"latitude\": 48.8566,\n      \"longitude\": 2.3522\n    }\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/relocation',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'natal': {\n        'date': \"1990-05-15\",\n        'time': \"15:30:00\",\n        'timezone': \"Europe/Kyiv\",\n        'latitude': 50.45,\n        'longitude': 30.52\n      },\n      'target': {\n        'latitude': 48.8566,\n        'longitude': 2.3522\n      }\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('relocation', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'natal' => [\n            'date' => '1990-05-15',\n            'time' => '15:30:00',\n            'timezone' => 'Europe/Kyiv',\n            'latitude' => 50.45,\n            'longitude' => 30.52,\n        ],\n        'target' => [\n            'latitude' => 48.8566,\n            'longitude' => 2.3522,\n        ],\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"natal":{"type":"object","properties":{"input":{"type":"object","properties":{"name":{"type":"string","nullable":true},"date":{"type":"string","nullable":true},"time":{"type":"string","nullable":true},"timezoneOffset":{"type":"number","nullable":true},"latitude":{"type":"number","nullable":true},"longitude":{"type":"number","nullable":true},"houseSystem":{"type":"string","nullable":true},"city":{"type":"string","nullable":true},"cosmogram":{"type":"boolean","nullable":true}},"nullable":true},"julianDay":{"type":"number","nullable":true},"siderealTime":{"type":"number","nullable":true},"planets":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"longitude":{"type":"number","nullable":true},"latitude":{"type":"number","nullable":true},"distance":{"type":"number","nullable":true},"speedLong":{"type":"number","nullable":true},"speedLat":{"type":"number","nullable":true},"speedDist":{"type":"number","nullable":true},"isRetrograde":{"type":"boolean","nullable":true},"declination":{"type":"number","nullable":true},"rightAscension":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"houses":{"type":"object","properties":{"system":{"type":"string","nullable":true},"cusps":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"ascendant":{"type":"number","nullable":true},"mc":{"type":"number","nullable":true},"armc":{"type":"number","nullable":true},"vertex":{"type":"number","nullable":true},"equatorialAsc":{"type":"number","nullable":true},"coAscWK":{"type":"number","nullable":true},"coAscMunkasey":{"type":"number","nullable":true},"polarAsc":{"type":"number","nullable":true}},"nullable":true},"aspects":{"type":"array","items":{"type":"object","properties":{"planet1":{"type":"string","nullable":true},"planet2":{"type":"string","nullable":true},"planet1Id":{"type":"number","nullable":true},"planet2Id":{"type":"number","nullable":true},"type":{"type":"object","properties":{"name":{"type":"string","nullable":true},"i18nKey":{"type":"string","nullable":true},"angle":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true},"symbol":{"type":"string","nullable":true},"isMajor":{"type":"boolean","nullable":true},"color":{"type":"string","nullable":true}},"nullable":true},"exactAngle":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true},"isApplying":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true},"houseAspects":{"type":"array","items":{"type":"object","properties":{"planetName":{"type":"string","nullable":true},"planetId":{"type":"number","nullable":true},"houseIndex":{"type":"number","nullable":true},"cuspLongitude":{"type":"number","nullable":true},"type":{"type":"object","properties":{"name":{"type":"string","nullable":true},"i18nKey":{"type":"string","nullable":true},"angle":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true},"symbol":{"type":"string","nullable":true},"isMajor":{"type":"boolean","nullable":true},"color":{"type":"string","nullable":true}},"nullable":true},"exactAngle":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true},"isApplying":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true},"parallelAspects":{"type":"array","items":{"type":"object","properties":{"planet1":{"type":"string","nullable":true},"planet2":{"type":"string","nullable":true},"planet1Id":{"type":"number","nullable":true},"planet2Id":{"type":"number","nullable":true},"type":{"type":"string","nullable":true},"exactDiff":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"antiscia":{"type":"array","items":{"type":"object","properties":{"planetId":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"antiscion":{"type":"number","nullable":true},"contraAntiscion":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"antisciaAspects":{"type":"array","items":{},"nullable":true},"chartSect":{"type":"string","nullable":true},"meta":{"type":"object","properties":{"engineVersion":{"type":"string","nullable":true},"calculatedAt":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"relocated":{"type":"object","properties":{"input":{"type":"object","properties":{"name":{"type":"string","nullable":true},"date":{"type":"string","nullable":true},"time":{"type":"string","nullable":true},"timezoneOffset":{"type":"number","nullable":true},"latitude":{"type":"number","nullable":true},"longitude":{"type":"number","nullable":true},"houseSystem":{"type":"string","nullable":true},"city":{"type":"string","nullable":true},"cosmogram":{"type":"boolean","nullable":true}},"nullable":true},"julianDay":{"type":"number","nullable":true},"siderealTime":{"type":"number","nullable":true},"planets":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"longitude":{"type":"number","nullable":true},"latitude":{"type":"number","nullable":true},"distance":{"type":"number","nullable":true},"speedLong":{"type":"number","nullable":true},"speedLat":{"type":"number","nullable":true},"speedDist":{"type":"number","nullable":true},"isRetrograde":{"type":"boolean","nullable":true},"declination":{"type":"number","nullable":true},"rightAscension":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"houses":{"type":"object","properties":{"system":{"type":"string","nullable":true},"cusps":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"ascendant":{"type":"number","nullable":true},"mc":{"type":"number","nullable":true},"armc":{"type":"number","nullable":true},"vertex":{"type":"number","nullable":true},"equatorialAsc":{"type":"number","nullable":true},"coAscWK":{"type":"number","nullable":true},"coAscMunkasey":{"type":"number","nullable":true},"polarAsc":{"type":"number","nullable":true}},"nullable":true},"aspects":{"type":"array","items":{"type":"object","properties":{"planet1":{"type":"string","nullable":true},"planet2":{"type":"string","nullable":true},"planet1Id":{"type":"number","nullable":true},"planet2Id":{"type":"number","nullable":true},"type":{"type":"object","properties":{"name":{"type":"string","nullable":true},"i18nKey":{"type":"string","nullable":true},"angle":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true},"symbol":{"type":"string","nullable":true},"isMajor":{"type":"boolean","nullable":true},"color":{"type":"string","nullable":true}},"nullable":true},"exactAngle":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true},"isApplying":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true},"houseAspects":{"type":"array","items":{"type":"object","properties":{"planetName":{"type":"string","nullable":true},"planetId":{"type":"number","nullable":true},"houseIndex":{"type":"number","nullable":true},"cuspLongitude":{"type":"number","nullable":true},"type":{"type":"object","properties":{"name":{"type":"string","nullable":true},"i18nKey":{"type":"string","nullable":true},"angle":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true},"symbol":{"type":"string","nullable":true},"isMajor":{"type":"boolean","nullable":true},"color":{"type":"string","nullable":true}},"nullable":true},"exactAngle":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true},"isApplying":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true},"parallelAspects":{"type":"array","items":{"type":"object","properties":{"planet1":{"type":"string","nullable":true},"planet2":{"type":"string","nullable":true},"planet1Id":{"type":"number","nullable":true},"planet2Id":{"type":"number","nullable":true},"type":{"type":"string","nullable":true},"exactDiff":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"antiscia":{"type":"array","items":{"type":"object","properties":{"planetId":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"antiscion":{"type":"number","nullable":true},"contraAntiscion":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"antisciaAspects":{"type":"array","items":{},"nullable":true},"chartSect":{"type":"string","nullable":true},"meta":{"type":"object","properties":{"engineVersion":{"type":"string","nullable":true},"calculatedAt":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"delta":{"type":"object","properties":{"ascendantShift":{"type":"number","nullable":true},"mcShift":{"type":"number","nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"natal":{"input":{"name":"","date":"1990-05-15","time":"15:30:00","timezoneOffset":4,"latitude":50.45,"longitude":30.52,"houseSystem":"P","city":"","cosmogram":false},"julianDay":2448026.9791666665,"siderealTime":3.029043551629416,"planets":[{"id":0,"name":"Sun","longitude":54.37601980167181,"latitude":-0.000020054940759470553,"distance":1.0108955908980104,"speedLong":0.9642248003676466,"speedLat":0.00003805311526169511,"speedDist":0.00022039347866615117,"isRetrograde":false,"declination":18.867035147029778,"rightAscension":52.00919841916813}],"houses":{"system":"P","cusps":[169.9679500481848],"ascendant":169.9679500481848,"mc":77.07426201523143,"armc":75.95565327444125,"vertex":336.6271586045666,"equatorialAsc":164.74875654391414,"coAscWK":149.27468505332592,"coAscMunkasey":168.73706704232438,"polarAsc":329.2746850533259},"aspects":[{"planet1":"Sun","planet2":"Moon","planet1Id":0,"planet2Id":1,"type":{"name":"Trine","i18nKey":"aspect_trine","angle":120,"orb":12,"symbol":"△","isMajor":true,"color":"#3366cc"},"exactAngle":117.47133202515602,"orb":2.5286679748439838,"isApplying":false}],"houseAspects":[{"planetName":"Sun","planetId":0,"houseIndex":0,"cuspLongitude":169.9679500481848,"type":{"name":"Trine","i18nKey":"aspect_trine","angle":120,"orb":12,"symbol":"△","isMajor":true,"color":"#3366cc"},"exactAngle":115.59193024651299,"orb":4.408069753487013,"isApplying":false}],"parallelAspects":[{"planet1":"Moon","planet2":"Saturn","planet1Id":1,"planet2Id":6,"type":"parallel","exactDiff":0.9889902750346735,"orb":0.9889902750346735}],"antiscia":[{"planetId":0,"planetName":"Sun","antiscion":125.62398019832818,"contraAntiscion":305.6239801983282}],"antisciaAspects":[],"chartSect":"diurnal","meta":{"engineVersion":"2.10.03","calculatedAt":"2026-08-23T22:04:25.783Z"}},"relocated":{"input":{"name":"","date":"1990-05-15","time":"15:30:00","timezoneOffset":4,"latitude":48.8566,"longitude":2.3522,"houseSystem":"P","city":"48.86, 2.35","cosmogram":false},"julianDay":2448026.9791666665,"siderealTime":3.029043551629416,"planets":[{"id":0,"name":"Sun","longitude":54.37601980167181,"latitude":-0.000020054940759470553,"distance":1.0108955908980104,"speedLong":0.9642248003676466,"speedLat":0.00003805311526169511,"speedDist":0.00022039347866615117,"isRetrograde":false,"declination":18.867035147029778,"rightAscension":52.00919841916813}],"houses":{"system":"P","cusps":[149.37308631363834],"ascendant":149.37308631363834,"mc":50.23079805043816,"armc":47.78785327444125,"vertex":296.2926392820717,"equatorialAsc":135.32441345602732,"coAscWK":108.45288644922994,"coAscMunkasey":146.809384460278,"polarAsc":288.45288644922994},"aspects":[{"planet1":"Sun","planet2":"Moon","planet1Id":0,"planet2Id":1,"type":{"name":"Trine","i18nKey":"aspect_trine","angle":120,"orb":12,"symbol":"△","isMajor":true,"color":"#3366cc"},"exactAngle":117.47133202515602,"orb":2.5286679748439838,"isApplying":false}],"houseAspects":[{"planetName":"Sun","planetId":0,"houseIndex":0,"cuspLongitude":149.37308631363834,"type":{"name":"Square","i18nKey":"aspect_square","angle":90,"orb":10,"symbol":"□","isMajor":true,"color":"#cc3333"},"exactAngle":94.99706651196652,"orb":4.997066511966523,"isApplying":true}],"parallelAspects":[{"planet1":"Moon","planet2":"Saturn","planet1Id":1,"planet2Id":6,"type":"parallel","exactDiff":0.9889902750346735,"orb":0.9889902750346735}],"antiscia":[{"planetId":0,"planetName":"Sun","antiscion":125.62398019832818,"contraAntiscion":305.6239801983282}],"antisciaAspects":[],"chartSect":"diurnal","meta":{"engineVersion":"2.10.03","calculatedAt":"2026-08-23T22:04:25.783Z"}},"delta":{"ascendantShift":339.4051362654535,"mcShift":333.1565360352067}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/ccg-analysis":{"post":{"tags":["Astro-Geography"],"summary":"CCG Analysis","description":"Analyse Cyclo-Carto-Graphy (CCG) lines: progressed A*C*G lines at a target date with mundane/local aspects and latitude crossings.","operationId":"ccg-analysis","x-quality":"yellow","x-source":"Jim Lewis, Cyclo-Carto-Graphy method (extension of A*C*G). Adopted as standard in Solar Fire, Kepler astrocartography modules.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CcgAnalysis"},"example":{"natal":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52},"targetDate":"2024-06-15","targetTime":"12:00:00","targetTzOffset":3}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/ccg-analysis \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"natal\": { \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }, \"targetDate\": \"2024-06-15\", \"targetTime\": \"12:00:00\", \"targetTzOffset\": 3 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/ccg-analysis', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"natal\": {\n      \"date\": \"1990-05-15\",\n      \"time\": \"15:30:00\",\n      \"timezone\": \"Europe/Kyiv\",\n      \"latitude\": 50.45,\n      \"longitude\": 30.52\n    },\n    \"targetDate\": \"2024-06-15\",\n    \"targetTime\": \"12:00:00\",\n    \"targetTzOffset\": 3\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/ccg-analysis',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'natal': {\n        'date': \"1990-05-15\",\n        'time': \"15:30:00\",\n        'timezone': \"Europe/Kyiv\",\n        'latitude': 50.45,\n        'longitude': 30.52\n      },\n      'targetDate': \"2024-06-15\",\n      'targetTime': \"12:00:00\",\n      'targetTzOffset': 3\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('ccg-analysis', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'natal' => [\n            'date' => '1990-05-15',\n            'time' => '15:30:00',\n            'timezone' => 'Europe/Kyiv',\n            'latitude' => 50.45,\n            'longitude' => 30.52,\n        ],\n        'targetDate' => '2024-06-15',\n        'targetTime' => '12:00:00',\n        'targetTzOffset' => 3,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"mundaneAspects":{"type":"array","items":{"type":"object","properties":{"ccgPlanetId":{"type":"number","nullable":true},"ccgPlanetName":{"type":"string","nullable":true},"acgPlanetId":{"type":"number","nullable":true},"acgPlanetName":{"type":"string","nullable":true},"aspectType":{"type":"number","nullable":true},"exactDiff":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"mcShift":{"type":"number","nullable":true},"meta":{"type":"object","properties":{"natalJD":{"type":"number","nullable":true},"progressedJD":{"type":"number","nullable":true},"natalArmc":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"mundaneAspects":[{"ccgPlanetId":4,"ccgPlanetName":"Mars","acgPlanetId":15,"acgPlanetName":"Chiron","aspectType":90,"exactDiff":0.03}],"mcShift":32.68067039088724,"meta":{"natalJD":2448026.9791666665,"progressedJD":2448061.0651237736,"natalArmc":75.95565327444125,"orb":1.5}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/eclipse-analysis":{"post":{"tags":["Astro-Geography"],"summary":"Eclipse Analysis","description":"Analyse the impact of upcoming eclipses on a natal chart: aspects to natal planets, house activations, and Saros series context.","operationId":"eclipse-analysis","x-quality":"green","x-source":"Astrocartography per Jim Lewis \"Astrolocality Astrology\" 1976 + Erlewine. Local space lines per Michael Erlewine. Geodetic per W. Sepharial / Carter / E.C. Cole. Relocation chart standard technique.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EclipseAnalysis"},"example":{"natal":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52},"year":2024,"point":{"lat":50.45,"lng":30.52}}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/eclipse-analysis \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"natal\": { \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }, \"year\": 2024, \"point\": { \"lat\": 50.45, \"lng\": 30.52 } }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/eclipse-analysis', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"natal\": {\n      \"date\": \"1990-05-15\",\n      \"time\": \"15:30:00\",\n      \"timezone\": \"Europe/Kyiv\",\n      \"latitude\": 50.45,\n      \"longitude\": 30.52\n    },\n    \"year\": 2024,\n    \"point\": {\n      \"lat\": 50.45,\n      \"lng\": 30.52\n    }\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/eclipse-analysis',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'natal': {\n        'date': \"1990-05-15\",\n        'time': \"15:30:00\",\n        'timezone': \"Europe/Kyiv\",\n        'latitude': 50.45,\n        'longitude': 30.52\n      },\n      'year': 2024,\n      'point': {\n        'lat': 50.45,\n        'lng': 30.52\n      }\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('eclipse-analysis', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'natal' => [\n            'date' => '1990-05-15',\n            'time' => '15:30:00',\n            'timezone' => 'Europe/Kyiv',\n            'latitude' => 50.45,\n            'longitude' => 30.52,\n        ],\n        'year' => 2024,\n        'point' => [\n            'lat' => 50.45,\n            'lng' => 30.52,\n        ],\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"eclipses":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","nullable":true},"date":{"type":"string","nullable":true},"longitude":{"type":"number","nullable":true},"aspects":{"type":"array","items":{"type":"object","properties":{"natalPlanet":{"type":"string","nullable":true},"type":{"type":"string","nullable":true},"orb":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"activatedHouse":{"type":"number","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"eclipses":[{"type":"solar","date":"2024-04-08","longitude":19.1,"aspects":[{"natalPlanet":"Sun","type":"conjunction","orb":4.9}],"activatedHouse":10}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/geodetic":{"post":{"tags":["Astro-Geography"],"summary":"Geodetic Equivalents","description":"Convert geographic coordinates to geodetic chart degrees (Sepharial method): each longitude maps to a zodiac degree on the Earth's surface.","operationId":"geodetic","x-quality":"green","x-source":"Astrocartography per Jim Lewis \"Astrolocality Astrology\" 1976 + Erlewine. Local space lines per Michael Erlewine. Geodetic per W. Sepharial / Carter / E.C. Cole. Relocation chart standard technique.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Geodetic"},"example":{"latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/geodetic \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/geodetic', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/geodetic',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('geodetic', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"geodeticAscendant":{"type":"number","nullable":true},"geodeticMC":{"type":"number","nullable":true},"zodiacalLongitude":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"geodeticAscendant":30.52,"geodeticMC":0.52,"zodiacalLongitude":"Taurus 0°31'"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/solar-acg":{"post":{"tags":["Astro-Geography"],"summary":"Solar A*C*G","description":"Astrocartography for the solar return of a given year: the A*C*G map of the moment the Sun comes back to its natal longitude. Planet names carry an SR suffix.","operationId":"solar-acg","x-quality":"green","x-source":"Astrocartography per Jim Lewis \"Astrolocality Astrology\" 1976 + Erlewine. Local space lines per Michael Erlewine. Geodetic per W. Sepharial / Carter / E.C. Cole. Relocation chart standard technique.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SolarAcg"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52,"year":2024}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/solar-acg \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52, \"year\": 2024 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/solar-acg', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52,\n    \"year\": 2024\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/solar-acg',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52,\n      'year': 2024\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('solar-acg', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n        'year' => 2024,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"year":{"type":"number","nullable":true},"lines":{"type":"array","items":{"type":"object","properties":{"planet":{"type":"string","nullable":true},"planetId":{"type":"number","nullable":true},"type":{"type":"string","nullable":true},"coordinates":{"type":"array","items":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"year":2024,"lines":[{"planet":"Sun (SR)","planetId":0,"type":"MC","coordinates":[[-85]]}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/acg-zones":{"post":{"tags":["Astro-Geography"],"summary":"A*C*G Lines Near a Point","description":"A*C*G lines passing within radiusDeg of one location, with the angular distance to each. The \"what runs over this city\" lookup.","operationId":"acg-zones","x-quality":"green","x-source":"Astrocartography per Jim Lewis \"Astrolocality Astrology\" 1976 + Erlewine. Local space lines per Michael Erlewine. Geodetic per W. Sepharial / Carter / E.C. Cole. Relocation chart standard technique.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AcgZones"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52,"point":{"lat":48.8566,"lng":2.3522},"radiusDeg":4}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/acg-zones \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52, \"point\": { \"lat\": 48.8566, \"lng\": 2.3522 }, \"radiusDeg\": 4 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/acg-zones', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52,\n    \"point\": {\n      \"lat\": 48.8566,\n      \"lng\": 2.3522\n    },\n    \"radiusDeg\": 4\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/acg-zones',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52,\n      'point': {\n        'lat': 48.8566,\n        'lng': 2.3522\n      },\n      'radiusDeg': 4\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('acg-zones', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n        'point' => [\n            'lat' => 48.8566,\n            'lng' => 2.3522,\n        ],\n        'radiusDeg' => 4,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"point":{"type":"object","properties":{"lat":{"type":"number","nullable":true},"lng":{"type":"number","nullable":true}},"nullable":true},"radiusDeg":{"type":"number","nullable":true},"nearbyLines":{"type":"array","items":{"type":"object","properties":{"planet":{"type":"string","nullable":true},"planetId":{"type":"number","nullable":true},"type":{"type":"string","nullable":true},"distanceDeg":{"type":"number","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"point":{"lat":48.8566,"lng":2.3522},"radiusDeg":4,"nearbyLines":[{"planet":"mean Apogee","planetId":12,"type":"IC","distanceDeg":0.11188862345757444}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/acg/categories":{"get":{"tags":["Astro-Geography"],"summary":"A*C*G Life Categories","description":"Reference taxonomy: 19 areas of life, each naming the planet-and-angle lines that govern it with a weight and a polarity. Free, cacheable, drives the two endpoints below.","operationId":"acg_categories_get","x-quality":"green","x-source":"Jim Lewis A*C*G booklets (planet-on-angle) + Erin Sullivan \"Where in the World?\" (angle semantics) + Martin Davis \"Astrolocality Astrology\" (challenging lines).","security":[{"ApiKeyAuth":[]}],"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X GET https://api.astroway.info/v1/acg/categories \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/acg/categories', {\n  method: 'GET',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.get(\n    'https://api.astroway.info/v1/acg/categories',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->get('acg/categories', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"count":{"type":"number","nullable":true},"language":{"type":"string","nullable":true},"requestedLanguage":{"type":"string","nullable":true},"categories":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"description":{"type":"string","nullable":true},"lineCount":{"type":"number","nullable":true},"lines":{"type":"array","items":{"type":"object","properties":{"planet":{"type":"string","nullable":true},"planetId":{"type":"number","nullable":true},"angle":{"type":"string","nullable":true},"weight":{"type":"number","nullable":true},"polarity":{"type":"string","nullable":true}},"nullable":true},"nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"count":19,"language":"uk","requestedLanguage":"uk","categories":[{"id":"adventure","name":"Пригоди","description":"Ризик, новизна, різкі зміни ритму. Місця, де людина виходить із звичного сценарію.","lineCount":6,"lines":[{"planet":"Uranus","planetId":7,"angle":"ASC","weight":3,"polarity":"supportive"}]}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/acg/by-category":{"post":{"tags":["Astro-Geography"],"summary":"A*C*G by Life Category","description":"A*C*G lines that govern one area of life, ranked by astrological weight and, when a point is supplied, by proximity to it. Returns curated interpretation text per line in 11 languages.","operationId":"acg_by-category","x-quality":"green","x-source":"Geometry from /acg (Jim Lewis). Category mapping per data/acg-categories.ts. Text from the curated geo knowledge base.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AcgByCategory"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52,"category":"career","point":{"lat":51.5074,"lng":-0.1278},"radiusDeg":8,"language":"en"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/acg/by-category \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52, \"category\": \"career\", \"point\": { \"lat\": 51.5074, \"lng\": -0.1278 }, \"radiusDeg\": 8, \"language\": \"en\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/acg/by-category', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52,\n    \"category\": \"career\",\n    \"point\": {\n      \"lat\": 51.5074,\n      \"lng\": -0.1278\n    },\n    \"radiusDeg\": 8,\n    \"language\": \"en\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/acg/by-category',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52,\n      'category': \"career\",\n      'point': {\n        'lat': 51.5074,\n        'lng': -0.1278\n      },\n      'radiusDeg': 8,\n      'language': \"en\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('acg/by-category', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n        'category' => 'career',\n        'point' => [\n            'lat' => 51.5074,\n            'lng' => -0.1278,\n        ],\n        'radiusDeg' => 8,\n        'language' => 'en',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"category":{"type":"object","properties":{"id":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"description":{"type":"string","nullable":true}},"nullable":true},"language":{"type":"string","nullable":true},"requestedLanguage":{"type":"string","nullable":true},"point":{"type":"object","properties":{"lat":{"type":"number","nullable":true},"lng":{"type":"number","nullable":true}},"nullable":true},"radiusDeg":{"type":"number","nullable":true},"polarity":{"type":"string","nullable":true},"count":{"type":"number","nullable":true},"lines":{"type":"array","items":{"type":"object","properties":{"planet":{"type":"string","nullable":true},"planetId":{"type":"number","nullable":true},"type":{"type":"string","nullable":true},"weight":{"type":"number","nullable":true},"polarity":{"type":"string","nullable":true},"strength":{"type":"number","nullable":true},"distanceDeg":{"type":"number","nullable":true},"pointCount":{"type":"number","nullable":true},"segments":{"type":"array","items":{"type":"array","items":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"nullable":true},"nullable":true},"interpretation":{"type":"object","properties":{"title":{"type":"string","nullable":true},"text":{"type":"string","nullable":true},"lang":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"category":{"id":"career","name":"Career","description":"Professional realisation, position, standing within a field."},"language":"en","requestedLanguage":"en","point":{"lat":51.5074,"lng":-0.1278},"radiusDeg":8,"polarity":"all","count":2,"lines":[{"planet":"Sun","planetId":0,"type":"MC","weight":3,"polarity":"supportive","strength":1.436,"distanceDeg":4.171,"pointCount":341,"segments":[[[-85]]],"interpretation":{"title":"Sun - MC","text":"Energy and personal creative potential are directed towards professional fulfillment, career, achieving maximum results in realizing one's calling, social success, recognition, and fame. Increased probability of social and professional success. Realization of leadership potential.","lang":"en"}}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/acg/line-report":{"post":{"tags":["Astro-Geography"],"summary":"A*C*G Line Report","description":"One line in full: its geometry, every life area it touches with weight and polarity, and the interpretation text for that planet-and-angle pair. Rising and setting curves arrive as several disjoint segments; all of them are returned.","operationId":"acg_line-report","x-quality":"green","x-source":"Geometry from /acg (Jim Lewis). Category mapping per data/acg-categories.ts. Text from the curated geo knowledge base.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AcgLineReport"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52,"planet":"Venus","angle":"DSC","language":"uk"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/acg/line-report \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52, \"planet\": \"Venus\", \"angle\": \"DSC\", \"language\": \"uk\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/acg/line-report', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52,\n    \"planet\": \"Venus\",\n    \"angle\": \"DSC\",\n    \"language\": \"uk\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/acg/line-report',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52,\n      'planet': \"Venus\",\n      'angle': \"DSC\",\n      'language': \"uk\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('acg/line-report', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n        'planet' => 'Venus',\n        'angle' => 'DSC',\n        'language' => 'uk',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"line":{"type":"object","properties":{"planet":{"type":"string","nullable":true},"planetId":{"type":"number","nullable":true},"type":{"type":"string","nullable":true},"segmentCount":{"type":"number","nullable":true},"pointCount":{"type":"number","nullable":true},"segments":{"type":"array","items":{"type":"array","items":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"nullable":true},"nullable":true}},"nullable":true},"language":{"type":"string","nullable":true},"requestedLanguage":{"type":"string","nullable":true},"categories":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"weight":{"type":"number","nullable":true},"polarity":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"interpretation":{"type":"object","properties":{"title":{"type":"string","nullable":true},"text":{"type":"string","nullable":true},"lang":{"type":"string","nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"line":{"planet":"Venus","planetId":3,"type":"DSC","segmentCount":1,"pointCount":171,"segments":[[[-84.97850360981103]]]},"language":"uk","requestedLanguage":"uk","categories":[{"id":"love","name":"Кохання","weight":3,"polarity":"supportive"}],"interpretation":{"title":"Венера - DSC","text":"Зростання привабливості, чарівності, популярності. Удачливість. Максимальна ймовірність знайти кохання, партнера, вирішити проблеми взаємин. Партнерство, інтенсивне особисте життя, більше спілкування та взаємодії, більше вечірок і цікавих зустрічей. Гармонія та співпраця заради досягнення спільних цілей. Вдале вирішення юридичних і фінансових питань. Вкладення грошей у спільні проєкти. Вдале залагодження спірних питань, популярність, здатність встановлювати особисті контакти. Багато спокус. Хороші можливості в реалізації творчих планів, визнання ваших талантів, здібностей. Сприятливо для діяльності, пов'язаної з мистецтвом, красою, естетикою.","lang":"uk"}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/phase-return":{"post":{"tags":["Astro-Geography"],"summary":"Phase Return","description":"Find dates when a planet returns to its same synodic phase relative to the Sun (e.g. next Venus heliacal rising, next Mars retrograde station).","operationId":"phase-return","x-quality":"green","x-source":"Astrocartography per Jim Lewis \"Astrolocality Astrology\" 1976 + Erlewine. Local space lines per Michael Erlewine. Geodetic per W. Sepharial / Carter / E.C. Cole. Relocation chart standard technique.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PhaseReturn"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52,"startYear":2024,"endYear":2030}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/phase-return \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52, \"startYear\": 2024, \"endYear\": 2030 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/phase-return', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52,\n    \"startYear\": 2024,\n    \"endYear\": 2030\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/phase-return',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52,\n      'startYear': 2024,\n      'endYear': 2030\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('phase-return', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n        'startYear' => 2024,\n        'endYear' => 2030,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"planet":{"type":"string","nullable":true},"phase":{"type":"string","nullable":true},"returns":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string","nullable":true},"longitude":{"type":"number","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"planet":"Venus","phase":"heliacal-rising","returns":[{"date":"2028-09-15","longitude":154.2},{"date":"2026-04-25","longitude":36.8}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/nakshatras":{"post":{"tags":["Vedic"],"summary":"Nakshatras","description":"Calculate the Nakshatra (lunar mansion) for each planet using the sidereal zodiac. Returns nakshatra name, pada, deity, and quality.","operationId":"nakshatras","x-quality":"green","x-source":"BPHS (Brihat Parashara Hora Shastra): canonical Sanskrit text PD with Sharma/Santhanam translations. Cross-validated against jhora, py-jhora, vargas-py.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/nakshatras \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/nakshatras', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/nakshatras',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('nakshatras', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"ayanamsaId":{"type":"number","nullable":true},"planets":{"type":"array","items":{"type":"object","properties":{"planetId":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"siderealLongitude":{"type":"number","nullable":true},"nakshatra":{"type":"object","properties":{"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"nameRu":{"type":"string","nullable":true},"nameUk":{"type":"string","nullable":true},"ruler":{"type":"string","nullable":true},"startDeg":{"type":"number","nullable":true},"endDeg":{"type":"number","nullable":true}},"nullable":true},"pada":{"type":"number","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"ayanamsaId":1,"planets":[{"planetId":0,"planetName":"Sun","siderealLongitude":30.650211922318967,"nakshatra":{"number":3,"name":"Krittika","nameRu":"Криттика","nameUk":"Кріттіка","ruler":"Sun","startDeg":26.6667,"endDeg":40},"pada":2}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/ashtakavarga":{"post":{"tags":["Vedic"],"summary":"Ashtakavarga","description":"Calculate the Ashtakavarga benefic point table for a Vedic chart: individual bindus for each planet in each sign and the total Sarvashtakavarga.","operationId":"ashtakavarga","x-quality":"green","x-source":"BPHS (Brihat Parashara Hora Shastra): canonical Sanskrit text PD with Sharma/Santhanam translations. Cross-validated against jhora, py-jhora, vargas-py.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/ashtakavarga \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/ashtakavarga', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/ashtakavarga',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('ashtakavarga', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"planets":{"type":"array","items":{"type":"object","properties":{"planetId":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"bindus":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"contributions":{"type":"array","items":{"type":"array","items":{"type":"boolean","nullable":true},"nullable":true},"nullable":true},"total":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"sarva":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"sarvaTotal":{"type":"number","nullable":true}}}}},"example":{"ok":true,"data":{"planets":[{"planetId":0,"planetName":"Sun","bindus":[2],"contributions":[[false]],"total":48}],"sarva":[26],"sarvaTotal":337}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/varga/D1":{"post":{"tags":["Vedic"],"summary":"Varga D1: Rashi","description":"Sidereal natal sign chart (Rashi). Foundation of Vedic analysis.","operationId":"vedic_varga_D1","x-quality":"green","x-source":"BPHS (Brihat Parashara Hora Shastra): canonical Sanskrit text PD with Sharma/Santhanam translations. Cross-validated against jhora, py-jhora, vargas-py.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/varga/D1 \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/varga/D1', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/varga/D1',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/varga/D1', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"varga":{"type":"string","nullable":true},"name":{"type":"object","properties":{"en":{"type":"string","nullable":true},"ru":{"type":"string","nullable":true},"uk":{"type":"string","nullable":true},"sanskrit":{"type":"string","nullable":true}},"nullable":true},"ayanamsa":{"type":"number","nullable":true},"lagna":{"type":"object","properties":{"longitude":{"type":"number","nullable":true},"sign":{"type":"number","nullable":true},"degreeInSign":{"type":"number","nullable":true}},"nullable":true},"planets":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"longitude":{"type":"number","nullable":true},"sign":{"type":"number","nullable":true},"degreeInSign":{"type":"number","nullable":true},"isRetrograde":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true},"julianDay":{"type":"number","nullable":true}}}}},"example":{"ok":true,"data":{"varga":"D1","name":{"en":"Rashi","ru":"Раши","uk":"Раші","sanskrit":"Раши"},"ayanamsa":23.72254952235926,"lagna":{"longitude":146.24540052582552,"sign":4,"degreeInSign":26.245400525825517},"planets":[{"id":0,"name":"Sun","longitude":30.650211922318967,"sign":1,"degreeInSign":0.6502119223189666,"isRetrograde":false}],"julianDay":2448026.9791666665}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/varga/D2":{"post":{"tags":["Vedic"],"summary":"Varga D2: Hora","description":"Hora chart (wealth analysis, half-sign Sun/Moon division).","operationId":"vedic_varga_D2","x-quality":"green","x-source":"BPHS (Brihat Parashara Hora Shastra): canonical Sanskrit text PD with Sharma/Santhanam translations. Cross-validated against jhora, py-jhora, vargas-py.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/varga/D2 \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/varga/D2', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/varga/D2',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/varga/D2', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"varga":{"type":"string","nullable":true},"name":{"type":"object","properties":{"en":{"type":"string","nullable":true},"ru":{"type":"string","nullable":true},"uk":{"type":"string","nullable":true},"sanskrit":{"type":"string","nullable":true}},"nullable":true},"ayanamsa":{"type":"number","nullable":true},"lagna":{"type":"object","properties":{"longitude":{"type":"number","nullable":true},"sign":{"type":"number","nullable":true},"degreeInSign":{"type":"number","nullable":true}},"nullable":true},"planets":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"longitude":{"type":"number","nullable":true},"sign":{"type":"number","nullable":true},"degreeInSign":{"type":"number","nullable":true},"isRetrograde":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true},"julianDay":{"type":"number","nullable":true}}}}},"example":{"ok":true,"data":{"varga":"D2","name":{"en":"Hora","ru":"Хора","uk":"Хора","sanskrit":"Хора"},"ayanamsa":23.72254952235926,"lagna":{"longitude":112.49080105165103,"sign":3,"degreeInSign":22.490801051651033},"planets":[{"id":0,"name":"Sun","longitude":91.30042384463793,"sign":3,"degreeInSign":1.3004238446379333,"isRetrograde":false}],"julianDay":2448026.9791666665}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/varga/D3":{"post":{"tags":["Vedic"],"summary":"Varga D3: Drekkana","description":"Drekkana chart (siblings, courage; trinal third-of-sign division).","operationId":"vedic_varga_D3","x-quality":"green","x-source":"BPHS (Brihat Parashara Hora Shastra): canonical Sanskrit text PD with Sharma/Santhanam translations. Cross-validated against jhora, py-jhora, vargas-py.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/varga/D3 \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/varga/D3', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/varga/D3',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/varga/D3', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"varga":{"type":"string","nullable":true},"name":{"type":"object","properties":{"en":{"type":"string","nullable":true},"ru":{"type":"string","nullable":true},"uk":{"type":"string","nullable":true},"sanskrit":{"type":"string","nullable":true}},"nullable":true},"ayanamsa":{"type":"number","nullable":true},"lagna":{"type":"object","properties":{"longitude":{"type":"number","nullable":true},"sign":{"type":"number","nullable":true},"degreeInSign":{"type":"number","nullable":true}},"nullable":true},"planets":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"longitude":{"type":"number","nullable":true},"sign":{"type":"number","nullable":true},"degreeInSign":{"type":"number","nullable":true},"isRetrograde":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true},"julianDay":{"type":"number","nullable":true}}}}},"example":{"ok":true,"data":{"varga":"D3","name":{"en":"Drekkana","ru":"Дрекана","uk":"Дрекана","sanskrit":"Дрекана"},"ayanamsa":23.72254952235926,"lagna":{"longitude":18.73620157747655,"sign":0,"degreeInSign":18.73620157747655},"planets":[{"id":0,"name":"Sun","longitude":31.9506357669569,"sign":1,"degreeInSign":1.9506357669568999,"isRetrograde":false}],"julianDay":2448026.9791666665}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/varga/D4":{"post":{"tags":["Vedic"],"summary":"Varga D4: Chaturthamsa","description":"Chaturthamsa chart (fortune, fixed assets, real estate).","operationId":"vedic_varga_D4","x-quality":"green","x-source":"BPHS (Brihat Parashara Hora Shastra): canonical Sanskrit text PD with Sharma/Santhanam translations. Cross-validated against jhora, py-jhora, vargas-py.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/varga/D4 \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/varga/D4', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/varga/D4',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/varga/D4', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"varga":{"type":"string","nullable":true},"name":{"type":"object","properties":{"en":{"type":"string","nullable":true},"ru":{"type":"string","nullable":true},"uk":{"type":"string","nullable":true},"sanskrit":{"type":"string","nullable":true}},"nullable":true},"ayanamsa":{"type":"number","nullable":true},"lagna":{"type":"object","properties":{"longitude":{"type":"number","nullable":true},"sign":{"type":"number","nullable":true},"degreeInSign":{"type":"number","nullable":true}},"nullable":true},"planets":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"longitude":{"type":"number","nullable":true},"sign":{"type":"number","nullable":true},"degreeInSign":{"type":"number","nullable":true},"isRetrograde":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true},"julianDay":{"type":"number","nullable":true}}}}},"example":{"ok":true,"data":{"varga":"D4","name":{"en":"Chaturthamsha","ru":"Чатуртамша","uk":"Чатуртамша","sanskrit":"Чатуртамша"},"ayanamsa":23.72254952235926,"lagna":{"longitude":44.981602103302066,"sign":1,"degreeInSign":14.981602103302066},"planets":[{"id":0,"name":"Sun","longitude":32.60084768927587,"sign":1,"degreeInSign":2.6008476892758665,"isRetrograde":false}],"julianDay":2448026.9791666665}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/varga/D7":{"post":{"tags":["Vedic"],"summary":"Varga D7: Saptamsa","description":"Saptamsa chart (children, progeny).","operationId":"vedic_varga_D7","x-quality":"green","x-source":"BPHS (Brihat Parashara Hora Shastra): canonical Sanskrit text PD with Sharma/Santhanam translations. Cross-validated against jhora, py-jhora, vargas-py.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/varga/D7 \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/varga/D7', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/varga/D7',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/varga/D7', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"varga":{"type":"string","nullable":true},"name":{"type":"object","properties":{"en":{"type":"string","nullable":true},"ru":{"type":"string","nullable":true},"uk":{"type":"string","nullable":true},"sanskrit":{"type":"string","nullable":true}},"nullable":true},"ayanamsa":{"type":"number","nullable":true},"lagna":{"type":"object","properties":{"longitude":{"type":"number","nullable":true},"sign":{"type":"number","nullable":true},"degreeInSign":{"type":"number","nullable":true}},"nullable":true},"planets":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"longitude":{"type":"number","nullable":true},"sign":{"type":"number","nullable":true},"degreeInSign":{"type":"number","nullable":true},"isRetrograde":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true},"julianDay":{"type":"number","nullable":true}}}}},"example":{"ok":true,"data":{"varga":"D7","name":{"en":"Saptamsha","ru":"Саптамша","uk":"Саптамша","sanskrit":"Саптамша"},"ayanamsa":23.72254952235926,"lagna":{"longitude":303.7178036807786,"sign":10,"degreeInSign":3.7178036807786157},"planets":[{"id":0,"name":"Sun","longitude":214.55148345623277,"sign":7,"degreeInSign":4.5514834562327735,"isRetrograde":false}],"julianDay":2448026.9791666665}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/varga/D9":{"post":{"tags":["Vedic"],"summary":"Varga D9: Navamsa","description":"Navamsa chart (spouse, dharma; the most important divisional chart in BPHS Vedic analysis).","operationId":"vedic_varga_D9","x-quality":"green","x-source":"BPHS (Brihat Parashara Hora Shastra): canonical Sanskrit text PD with Sharma/Santhanam translations. Cross-validated against jhora, py-jhora, vargas-py.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/varga/D9 \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/varga/D9', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/varga/D9',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/varga/D9', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"varga":{"type":"string","nullable":true},"name":{"type":"object","properties":{"en":{"type":"string","nullable":true},"ru":{"type":"string","nullable":true},"uk":{"type":"string","nullable":true},"sanskrit":{"type":"string","nullable":true}},"nullable":true},"ayanamsa":{"type":"number","nullable":true},"lagna":{"type":"object","properties":{"longitude":{"type":"number","nullable":true},"sign":{"type":"number","nullable":true},"degreeInSign":{"type":"number","nullable":true}},"nullable":true},"planets":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"longitude":{"type":"number","nullable":true},"sign":{"type":"number","nullable":true},"degreeInSign":{"type":"number","nullable":true},"isRetrograde":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true},"julianDay":{"type":"number","nullable":true}}}}},"example":{"ok":true,"data":{"varga":"D9","name":{"en":"Navamsha","ru":"Навамша","uk":"Навамша","sanskrit":"Навамша"},"ayanamsa":23.72254952235926,"lagna":{"longitude":236.20860473242962,"sign":7,"degreeInSign":26.20860473242962},"planets":[{"id":0,"name":"Sun","longitude":275.8519073008707,"sign":9,"degreeInSign":5.851907300870721,"isRetrograde":false}],"julianDay":2448026.9791666665}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/varga/D10":{"post":{"tags":["Vedic"],"summary":"Varga D10: Dasamsa","description":"Dasamsa chart (career, profession, public reputation).","operationId":"vedic_varga_D10","x-quality":"green","x-source":"BPHS (Brihat Parashara Hora Shastra): canonical Sanskrit text PD with Sharma/Santhanam translations. Cross-validated against jhora, py-jhora, vargas-py.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/varga/D10 \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/varga/D10', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/varga/D10',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/varga/D10', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"varga":{"type":"string","nullable":true},"name":{"type":"object","properties":{"en":{"type":"string","nullable":true},"ru":{"type":"string","nullable":true},"uk":{"type":"string","nullable":true},"sanskrit":{"type":"string","nullable":true}},"nullable":true},"ayanamsa":{"type":"number","nullable":true},"lagna":{"type":"object","properties":{"longitude":{"type":"number","nullable":true},"sign":{"type":"number","nullable":true},"degreeInSign":{"type":"number","nullable":true}},"nullable":true},"planets":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"longitude":{"type":"number","nullable":true},"sign":{"type":"number","nullable":true},"degreeInSign":{"type":"number","nullable":true},"isRetrograde":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true},"julianDay":{"type":"number","nullable":true}}}}},"example":{"ok":true,"data":{"varga":"D10","name":{"en":"Dashamsha","ru":"Дашамша","uk":"Дашамша","sanskrit":"Дашамша"},"ayanamsa":23.72254952235926,"lagna":{"longitude":22.454005258255165,"sign":0,"degreeInSign":22.454005258255165},"planets":[{"id":0,"name":"Sun","longitude":276.50211922318965,"sign":9,"degreeInSign":6.502119223189652,"isRetrograde":false}],"julianDay":2448026.9791666665}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/varga/D12":{"post":{"tags":["Vedic"],"summary":"Varga D12: Dwadasamsa","description":"Dwadasamsa chart (parents, ancestral karma).","operationId":"vedic_varga_D12","x-quality":"green","x-source":"BPHS (Brihat Parashara Hora Shastra): canonical Sanskrit text PD with Sharma/Santhanam translations. Cross-validated against jhora, py-jhora, vargas-py.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/varga/D12 \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/varga/D12', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/varga/D12',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/varga/D12', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"varga":{"type":"string","nullable":true},"name":{"type":"object","properties":{"en":{"type":"string","nullable":true},"ru":{"type":"string","nullable":true},"uk":{"type":"string","nullable":true},"sanskrit":{"type":"string","nullable":true}},"nullable":true},"ayanamsa":{"type":"number","nullable":true},"lagna":{"type":"object","properties":{"longitude":{"type":"number","nullable":true},"sign":{"type":"number","nullable":true},"degreeInSign":{"type":"number","nullable":true}},"nullable":true},"planets":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"longitude":{"type":"number","nullable":true},"sign":{"type":"number","nullable":true},"degreeInSign":{"type":"number","nullable":true},"isRetrograde":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true},"julianDay":{"type":"number","nullable":true}}}}},"example":{"ok":true,"data":{"varga":"D12","name":{"en":"Dwadashamsha","ru":"Двадашамша","uk":"Двадашамша","sanskrit":"Двадашамша"},"ayanamsa":23.72254952235926,"lagna":{"longitude":74.9448063099062,"sign":2,"degreeInSign":14.944806309906198},"planets":[{"id":0,"name":"Sun","longitude":37.8025430678276,"sign":1,"degreeInSign":7.8025430678275995,"isRetrograde":false}],"julianDay":2448026.9791666665}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/varga/D16":{"post":{"tags":["Vedic"],"summary":"Varga D16: Shodasamsa","description":"Shodasamsa chart (vehicles, comforts, conveyances).","operationId":"vedic_varga_D16","x-quality":"green","x-source":"BPHS (Brihat Parashara Hora Shastra): canonical Sanskrit text PD with Sharma/Santhanam translations. Cross-validated against jhora, py-jhora, vargas-py.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/varga/D16 \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/varga/D16', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/varga/D16',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/varga/D16', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"varga":{"type":"string","nullable":true},"name":{"type":"object","properties":{"en":{"type":"string","nullable":true},"ru":{"type":"string","nullable":true},"uk":{"type":"string","nullable":true},"sanskrit":{"type":"string","nullable":true}},"nullable":true},"ayanamsa":{"type":"number","nullable":true},"lagna":{"type":"object","properties":{"longitude":{"type":"number","nullable":true},"sign":{"type":"number","nullable":true},"degreeInSign":{"type":"number","nullable":true}},"nullable":true},"planets":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"longitude":{"type":"number","nullable":true},"sign":{"type":"number","nullable":true},"degreeInSign":{"type":"number","nullable":true},"isRetrograde":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true},"julianDay":{"type":"number","nullable":true}}}}},"example":{"ok":true,"data":{"varga":"D16","name":{"en":"Shodashamsha","ru":"Шодашамша","uk":"Шодашамша","sanskrit":"Шодашамша"},"ayanamsa":23.72254952235926,"lagna":{"longitude":179.92640841320826,"sign":5,"degreeInSign":29.926408413208264},"planets":[{"id":0,"name":"Sun","longitude":130.40339075710347,"sign":4,"degreeInSign":10.403390757103466,"isRetrograde":false}],"julianDay":2448026.9791666665}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/varga/D20":{"post":{"tags":["Vedic"],"summary":"Varga D20: Vimsamsa","description":"Vimsamsa chart (spiritual progress, sadhana, religious inclination).","operationId":"vedic_varga_D20","x-quality":"green","x-source":"BPHS (Brihat Parashara Hora Shastra): canonical Sanskrit text PD with Sharma/Santhanam translations. Cross-validated against jhora, py-jhora, vargas-py.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/varga/D20 \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/varga/D20', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/varga/D20',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/varga/D20', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"varga":{"type":"string","nullable":true},"name":{"type":"object","properties":{"en":{"type":"string","nullable":true},"ru":{"type":"string","nullable":true},"uk":{"type":"string","nullable":true},"sanskrit":{"type":"string","nullable":true}},"nullable":true},"ayanamsa":{"type":"number","nullable":true},"lagna":{"type":"object","properties":{"longitude":{"type":"number","nullable":true},"sign":{"type":"number","nullable":true},"degreeInSign":{"type":"number","nullable":true}},"nullable":true},"planets":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"longitude":{"type":"number","nullable":true},"sign":{"type":"number","nullable":true},"degreeInSign":{"type":"number","nullable":true},"isRetrograde":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true},"julianDay":{"type":"number","nullable":true}}}}},"example":{"ok":true,"data":{"varga":"D20","name":{"en":"Vimshamsha","ru":"Вимшамша","uk":"Вімшамша","sanskrit":"Вимшамша"},"ayanamsa":23.72254952235926,"lagna":{"longitude":44.90801051651033,"sign":1,"degreeInSign":14.90801051651033},"planets":[{"id":0,"name":"Sun","longitude":253.00423844637933,"sign":8,"degreeInSign":13.004238446379333,"isRetrograde":false}],"julianDay":2448026.9791666665}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/varga/D24":{"post":{"tags":["Vedic"],"summary":"Varga D24: Chaturvimsamsa","description":"Chaturvimsamsa / Siddhamsa chart (education, learning, academic achievement).","operationId":"vedic_varga_D24","x-quality":"green","x-source":"BPHS (Brihat Parashara Hora Shastra): canonical Sanskrit text PD with Sharma/Santhanam translations. Cross-validated against jhora, py-jhora, vargas-py.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/varga/D24 \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/varga/D24', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/varga/D24',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/varga/D24', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"varga":{"type":"string","nullable":true},"name":{"type":"object","properties":{"en":{"type":"string","nullable":true},"ru":{"type":"string","nullable":true},"uk":{"type":"string","nullable":true},"sanskrit":{"type":"string","nullable":true}},"nullable":true},"ayanamsa":{"type":"number","nullable":true},"lagna":{"type":"object","properties":{"longitude":{"type":"number","nullable":true},"sign":{"type":"number","nullable":true},"degreeInSign":{"type":"number","nullable":true}},"nullable":true},"planets":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"longitude":{"type":"number","nullable":true},"sign":{"type":"number","nullable":true},"degreeInSign":{"type":"number","nullable":true},"isRetrograde":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true},"julianDay":{"type":"number","nullable":true}}}}},"example":{"ok":true,"data":{"varga":"D24","name":{"en":"Chaturvimshamsha","ru":"Чатурвимшамша","uk":"Чатурвімшамша","sanskrit":"Чатурвимшамша"},"ayanamsa":23.72254952235926,"lagna":{"longitude":29.889612619812397,"sign":0,"degreeInSign":29.889612619812397},"planets":[{"id":0,"name":"Sun","longitude":105.6050861356552,"sign":3,"degreeInSign":15.605086135655199,"isRetrograde":false}],"julianDay":2448026.9791666665}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/varga/D27":{"post":{"tags":["Vedic"],"summary":"Varga D27: Saptavimsamsa","description":"Saptavimsamsa / Bhamsa chart (strengths, weaknesses, stamina).","operationId":"vedic_varga_D27","x-quality":"green","x-source":"BPHS (Brihat Parashara Hora Shastra): canonical Sanskrit text PD with Sharma/Santhanam translations. Cross-validated against jhora, py-jhora, vargas-py.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/varga/D27 \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/varga/D27', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/varga/D27',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/varga/D27', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"varga":{"type":"string","nullable":true},"name":{"type":"object","properties":{"en":{"type":"string","nullable":true},"ru":{"type":"string","nullable":true},"uk":{"type":"string","nullable":true},"sanskrit":{"type":"string","nullable":true}},"nullable":true},"ayanamsa":{"type":"number","nullable":true},"lagna":{"type":"object","properties":{"longitude":{"type":"number","nullable":true},"sign":{"type":"number","nullable":true},"degreeInSign":{"type":"number","nullable":true}},"nullable":true},"planets":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"longitude":{"type":"number","nullable":true},"sign":{"type":"number","nullable":true},"degreeInSign":{"type":"number","nullable":true},"isRetrograde":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true},"julianDay":{"type":"number","nullable":true}}}}},"example":{"ok":true,"data":{"varga":"D27","name":{"en":"Saptavimshamsha","ru":"Саптавимшамша","uk":"Саптавімшамша","sanskrit":"Саптавимшамша"},"ayanamsa":23.72254952235926,"lagna":{"longitude":348.6258141972889,"sign":11,"degreeInSign":18.62581419728889},"planets":[{"id":0,"name":"Sun","longitude":107.55572190261209,"sign":3,"degreeInSign":17.555721902612092,"isRetrograde":false}],"julianDay":2448026.9791666665}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/varga/D30":{"post":{"tags":["Vedic"],"summary":"Varga D30: Trimsamsa","description":"Trimsamsa chart (misfortunes, evils; uses Parashara unequal-segments formula).","operationId":"vedic_varga_D30","x-quality":"green","x-source":"BPHS (Brihat Parashara Hora Shastra): canonical Sanskrit text PD with Sharma/Santhanam translations. Cross-validated against jhora, py-jhora, vargas-py.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/varga/D30 \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/varga/D30', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/varga/D30',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/varga/D30', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"varga":{"type":"string","nullable":true},"name":{"type":"object","properties":{"en":{"type":"string","nullable":true},"ru":{"type":"string","nullable":true},"uk":{"type":"string","nullable":true},"sanskrit":{"type":"string","nullable":true}},"nullable":true},"ayanamsa":{"type":"number","nullable":true},"lagna":{"type":"object","properties":{"longitude":{"type":"number","nullable":true},"sign":{"type":"number","nullable":true},"degreeInSign":{"type":"number","nullable":true}},"nullable":true},"planets":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"longitude":{"type":"number","nullable":true},"sign":{"type":"number","nullable":true},"degreeInSign":{"type":"number","nullable":true},"isRetrograde":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true},"julianDay":{"type":"number","nullable":true}}}}},"example":{"ok":true,"data":{"varga":"D30","name":{"en":"Trimshamsha","ru":"Тримшамша","uk":"Тримшамша","sanskrit":"Тримшамша"},"ayanamsa":23.72254952235926,"lagna":{"longitude":187.4724031549531,"sign":6,"degreeInSign":7.472403154953099},"planets":[{"id":0,"name":"Sun","longitude":33.9012715339138,"sign":1,"degreeInSign":3.9012715339137998,"isRetrograde":false}],"julianDay":2448026.9791666665}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/varga/D40":{"post":{"tags":["Vedic"],"summary":"Varga D40: Khavedamsa","description":"Khavedamsa chart (auspicious & inauspicious effects, maternal lineage).","operationId":"vedic_varga_D40","x-quality":"green","x-source":"BPHS (Brihat Parashara Hora Shastra): canonical Sanskrit text PD with Sharma/Santhanam translations. Cross-validated against jhora, py-jhora, vargas-py.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/varga/D40 \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/varga/D40', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/varga/D40',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/varga/D40', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"varga":{"type":"string","nullable":true},"name":{"type":"object","properties":{"en":{"type":"string","nullable":true},"ru":{"type":"string","nullable":true},"uk":{"type":"string","nullable":true},"sanskrit":{"type":"string","nullable":true}},"nullable":true},"ayanamsa":{"type":"number","nullable":true},"lagna":{"type":"object","properties":{"longitude":{"type":"number","nullable":true},"sign":{"type":"number","nullable":true},"degreeInSign":{"type":"number","nullable":true}},"nullable":true},"planets":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"longitude":{"type":"number","nullable":true},"sign":{"type":"number","nullable":true},"degreeInSign":{"type":"number","nullable":true},"isRetrograde":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true},"julianDay":{"type":"number","nullable":true}}}}},"example":{"ok":true,"data":{"varga":"D40","name":{"en":"Khavedamsha","ru":"Кхаведамша","uk":"Кхаведамша","sanskrit":"Кхаведамша"},"ayanamsa":23.72254952235926,"lagna":{"longitude":329.81602103302066,"sign":10,"degreeInSign":29.81602103302066},"planets":[{"id":0,"name":"Sun","longitude":206.00847689275867,"sign":6,"degreeInSign":26.008476892758665,"isRetrograde":false}],"julianDay":2448026.9791666665}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/varga/D45":{"post":{"tags":["Vedic"],"summary":"Varga D45: Akshavedamsa","description":"Akshavedamsa chart (general life patterns, paternal lineage).","operationId":"vedic_varga_D45","x-quality":"green","x-source":"BPHS (Brihat Parashara Hora Shastra): canonical Sanskrit text PD with Sharma/Santhanam translations. Cross-validated against jhora, py-jhora, vargas-py.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/varga/D45 \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/varga/D45', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/varga/D45',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/varga/D45', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"varga":{"type":"string","nullable":true},"name":{"type":"object","properties":{"en":{"type":"string","nullable":true},"ru":{"type":"string","nullable":true},"uk":{"type":"string","nullable":true},"sanskrit":{"type":"string","nullable":true}},"nullable":true},"ayanamsa":{"type":"number","nullable":true},"lagna":{"type":"object","properties":{"longitude":{"type":"number","nullable":true},"sign":{"type":"number","nullable":true},"degreeInSign":{"type":"number","nullable":true}},"nullable":true},"planets":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"longitude":{"type":"number","nullable":true},"sign":{"type":"number","nullable":true},"degreeInSign":{"type":"number","nullable":true},"isRetrograde":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true},"julianDay":{"type":"number","nullable":true}}}}},"example":{"ok":true,"data":{"varga":"D45","name":{"en":"Akshavedamsha","ru":"Акшаведамша","uk":"Акшаведамша","sanskrit":"Акшаведамша"},"ayanamsa":23.72254952235926,"lagna":{"longitude":221.04302366214824,"sign":7,"degreeInSign":11.043023662148244},"planets":[{"id":0,"name":"Sun","longitude":149.2595365043535,"sign":4,"degreeInSign":29.25953650435349,"isRetrograde":false}],"julianDay":2448026.9791666665}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/varga/D60":{"post":{"tags":["Vedic"],"summary":"Varga D60: Shashtiamsa","description":"Shashtiamsa chart (past karma, the most subtle divisional; high precision needed in birth time).","operationId":"vedic_varga_D60","x-quality":"green","x-source":"BPHS (Brihat Parashara Hora Shastra): canonical Sanskrit text PD with Sharma/Santhanam translations. Cross-validated against jhora, py-jhora, vargas-py.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/varga/D60 \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/varga/D60', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/varga/D60',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/varga/D60', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"varga":{"type":"string","nullable":true},"name":{"type":"object","properties":{"en":{"type":"string","nullable":true},"ru":{"type":"string","nullable":true},"uk":{"type":"string","nullable":true},"sanskrit":{"type":"string","nullable":true}},"nullable":true},"ayanamsa":{"type":"number","nullable":true},"lagna":{"type":"object","properties":{"longitude":{"type":"number","nullable":true},"sign":{"type":"number","nullable":true},"degreeInSign":{"type":"number","nullable":true}},"nullable":true},"planets":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"longitude":{"type":"number","nullable":true},"sign":{"type":"number","nullable":true},"degreeInSign":{"type":"number","nullable":true},"isRetrograde":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true},"julianDay":{"type":"number","nullable":true}}}}},"example":{"ok":true,"data":{"varga":"D60","name":{"en":"Shashtiamsha","ru":"Шаштиамша","uk":"Шаштіамша","sanskrit":"Шаштиамша"},"ayanamsa":23.72254952235926,"lagna":{"longitude":254.724031549531,"sign":8,"degreeInSign":14.724031549530991},"planets":[{"id":0,"name":"Sun","longitude":69.012715339138,"sign":2,"degreeInSign":9.012715339137998,"isRetrograde":false}],"julianDay":2448026.9791666665}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/panchang/full":{"post":{"tags":["Vedic"],"summary":"Panchang: full","description":"Complete daily Panchang: Tithi, Vara, Karana, Yoga, Nakshatra + Choghadia + Rahu Kaal + Yamaganda + Gulika + Abhijit Muhurat. Single call. Tithi, karana, yoga and nakshatra carry `endsAt` (local ISO time with offset); `sunNakshatra`, `moonrise` and `moonset` (first after sunrise, disc centre on the horizon as panchangs count it; null when the Moon does not rise or set within 30 hours). `muhurtas`: Brahma Muhurta, Pratah and Sayahna Sandhya, Vijaya, Godhuli, Nishita, `durMuhurtam`, `amritKalam` and `varjyam` (lists), each `{ start, end }` in local ISO time. `chandrabalam` and `tarabalam`: from sunrise to the next sunrise, one entry per Moon sign or nakshatra with `from`, `until` and `favourableFor` (birth rashis or nakshatras), Chandrabalam also `ashtamaFor`. All null where the Sun does not rise.","operationId":"vedic_panchang_full","x-quality":"green","x-source":"BPHS (Brihat Parashara Hora Shastra): canonical Sanskrit text PD with Sharma/Santhanam translations. Cross-validated against jhora, py-jhora, vargas-py.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PanchangInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/panchang/full \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/panchang/full', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/panchang/full',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/panchang/full', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"jd":{"type":"number","nullable":true},"ayanamsa":{"type":"number","nullable":true},"sunrise":{"type":"string","nullable":true},"sunset":{"type":"string","nullable":true},"tithi":{"type":"object","properties":{"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"paksha":{"type":"string","nullable":true},"indexInPaksha":{"type":"number","nullable":true},"elongation":{"type":"number","nullable":true},"percentComplete":{"type":"number","nullable":true}},"nullable":true},"vara":{"type":"object","properties":{"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"ruler":{"type":"string","nullable":true}},"nullable":true},"karana":{"type":"object","properties":{"index":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"isFixed":{"type":"boolean","nullable":true}},"nullable":true},"yoga":{"type":"object","properties":{"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"sumLongitude":{"type":"number","nullable":true}},"nullable":true},"nakshatra":{"type":"object","properties":{"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"nameRu":{"type":"string","nullable":true},"nameUk":{"type":"string","nullable":true},"ruler":{"type":"string","nullable":true},"startDeg":{"type":"number","nullable":true},"endDeg":{"type":"number","nullable":true},"pada":{"type":"number","nullable":true},"longitude":{"type":"number","nullable":true}},"nullable":true},"choghadia":{"type":"object","properties":{"daytime":{"type":"array","items":{"type":"object","properties":{"index":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"quality":{"type":"string","nullable":true},"startHour":{"type":"number","nullable":true},"endHour":{"type":"number","nullable":true},"isDaytime":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true},"nighttime":{"type":"array","items":{"type":"object","properties":{"index":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"quality":{"type":"string","nullable":true},"startHour":{"type":"number","nullable":true},"endHour":{"type":"number","nullable":true},"isDaytime":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true}},"nullable":true},"rahuKaal":{"type":"object","properties":{"name":{"type":"string","nullable":true},"weekdaySlot":{"type":"number","nullable":true},"startHour":{"type":"number","nullable":true},"endHour":{"type":"number","nullable":true},"startTime":{"type":"string","nullable":true},"endTime":{"type":"string","nullable":true}},"nullable":true},"yamaganda":{"type":"object","properties":{"name":{"type":"string","nullable":true},"weekdaySlot":{"type":"number","nullable":true},"startHour":{"type":"number","nullable":true},"endHour":{"type":"number","nullable":true},"startTime":{"type":"string","nullable":true},"endTime":{"type":"string","nullable":true}},"nullable":true},"gulika":{"type":"object","properties":{"name":{"type":"string","nullable":true},"weekdaySlot":{"type":"number","nullable":true},"startHour":{"type":"number","nullable":true},"endHour":{"type":"number","nullable":true},"startTime":{"type":"string","nullable":true},"endTime":{"type":"string","nullable":true}},"nullable":true},"abhijitMuhurat":{"type":"object","properties":{"startHour":{"type":"number","nullable":true},"endHour":{"type":"number","nullable":true},"midHour":{"type":"number","nullable":true},"muhurtaMinutes":{"type":"number","nullable":true},"startTime":{"type":"string","nullable":true},"endTime":{"type":"string","nullable":true}},"nullable":true},"muhurtas":{"type":"object","properties":{"brahmaMuhurta":{"type":"object","properties":{"start":{"type":"string","nullable":true},"end":{"type":"string","nullable":true}},"nullable":true},"pratahSandhya":{"type":"object","properties":{"start":{"type":"string","nullable":true},"end":{"type":"string","nullable":true}},"nullable":true},"vijayaMuhurta":{"type":"object","properties":{"start":{"type":"string","nullable":true},"end":{"type":"string","nullable":true}},"nullable":true},"godhuliMuhurta":{"type":"object","properties":{"start":{"type":"string","nullable":true},"end":{"type":"string","nullable":true}},"nullable":true},"sayahnaSandhya":{"type":"object","properties":{"start":{"type":"string","nullable":true},"end":{"type":"string","nullable":true}},"nullable":true},"nishitaMuhurta":{"type":"object","properties":{"start":{"type":"string","nullable":true},"end":{"type":"string","nullable":true}},"nullable":true},"durMuhurtam":{"type":"array","items":{"type":"object","properties":{"start":{"type":"string","nullable":true},"end":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"amritKalam":{"type":"array","items":{"type":"object","properties":{"start":{"type":"string","nullable":true},"end":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"varjyam":{"type":"array","items":{"type":"object","properties":{"start":{"type":"string","nullable":true},"end":{"type":"string","nullable":true}},"nullable":true},"nullable":true}},"nullable":true},"chandrabalam":{"type":"array","items":{"type":"object","properties":{"from":{"type":"string","nullable":true},"until":{"type":"string","nullable":true},"moonSign":{"type":"string","nullable":true},"favourableFor":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"ashtamaFor":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"tarabalam":{"type":"array","items":{"type":"object","properties":{"from":{"type":"string","nullable":true},"until":{"type":"string","nullable":true},"nakshatra":{"type":"string","nullable":true},"favourableFor":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"jd":2448026.9791666665,"ayanamsa":23.72254952235926,"sunrise":"06:10:54","sunset":"21:38:29","tithi":{"number":21,"name":"Shashthi","paksha":"krishna","indexInPaksha":6,"elongation":242.52866797484398,"percentComplete":0.21072233123699866},"vara":{"number":2,"name":"Mangalvara","ruler":"Mars"},"karana":{"index":41,"name":"Garaja","isFixed":false},"yoga":{"number":23,"name":"Shubha","sumLongitude":303.82909181948196},"nakshatra":{"number":21,"name":"Uttara Ashadha","nameRu":"Уттара Ашадха","nameUk":"Уттара Ашадха","ruler":"Sun","startDeg":266.6667,"endDeg":280,"pada":2,"longitude":273.178879897163},"choghadia":{"daytime":[{"index":1,"name":"Rog","quality":"bad","startHour":6.1816186010837555,"endHour":8.114082143642008,"isDaytime":true}],"nighttime":[{"index":9,"name":"Kaal","quality":"bad","startHour":21.641326941549778,"endHour":22.705915165133774,"isDaytime":false}]},"rahuKaal":{"name":"Rahu Kaal","weekdaySlot":7,"startHour":17.776399856433272,"endHour":19.708863398991525,"startTime":"17:46:35","endTime":"19:42:32"},"yamaganda":{"name":"Yamaganda","weekdaySlot":3,"startHour":10.046545686200261,"endHour":11.979009228758514,"startTime":"10:02:48","endTime":"11:58:44"},"gulika":{"name":"Gulika","weekdaySlot":5,"startHour":13.911472771316767,"endHour":15.84393631387502,"startTime":"13:54:41","endTime":"15:50:38"},"abhijitMuhurat":{"startHour":13.3961491599679,"endHour":14.426796382665634,"midHour":13.911472771316767,"muhurtaMinutes":61.83883336186409,"startTime":"13:23:46","endTime":"14:25:36"},"muhurtas":{"brahmaMuhurta":{"start":"1990-05-15T05:02:23+04:00","end":"1990-05-15T05:36:38+04:00"},"pratahSandhya":{"start":"1990-05-15T05:19:31+04:00","end":"1990-05-15T06:10:54+04:00"},"vijayaMuhurta":{"start":"1990-05-15T16:29:17+04:00","end":"1990-05-15T17:31:07+04:00"},"godhuliMuhurta":{"start":"1990-05-15T21:38:29+04:00","end":"1990-05-15T21:55:31+04:00"},"sayahnaSandhya":{"start":"1990-05-15T21:38:29+04:00","end":"1990-05-15T22:29:35+04:00"},"nishitaMuhurta":{"start":"1990-05-16T01:36:57+04:00","end":"1990-05-16T02:11:01+04:00"},"durMuhurtam":[{"start":"1990-05-15T09:16:25+04:00","end":"1990-05-15T10:18:15+04:00"},{"start":"1990-05-16T01:02:53+04:00","end":"1990-05-16T01:36:57+04:00"}],"amritKalam":[{"start":"1990-05-15T21:46:42+04:00","end":"1990-05-15T23:30:18+04:00"}],"varjyam":[{"start":"1990-05-15T11:25:05+04:00","end":"1990-05-15T13:08:42+04:00"}]},"chandrabalam":[{"from":"1990-05-15T06:10:54+04:00","until":"1990-05-15T09:18:28+04:00","moonSign":"Dhanu","favourableFor":["Mithuna","Karka","Tula","Dhanu","Kumbha","Meena"],"ashtamaFor":"Vrishabha"}],"tarabalam":[{"from":"1990-05-15T06:10:54+04:00","until":"1990-05-16T04:41:06+04:00","nakshatra":"Uttara Ashadha","favourableFor":["Bharani","Rohini","Mrigashira","Punarvasu","Ashlesha","Purva Phalguni","Hasta","Chitra","Vishakha","Jyeshtha","Purva Ashadha","Shravana","Dhanishtha","Purva Bhadrapada","Revati"]}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/panchang/tithi":{"post":{"tags":["Vedic"],"summary":"Panchang: Tithi","description":"Lunar day (1-30): Moon-Sun elongation / 12°. Returns paksha (shukla/krishna), tithi name, % complete.","operationId":"vedic_panchang_tithi","x-quality":"green","x-source":"BPHS (Brihat Parashara Hora Shastra): canonical Sanskrit text PD with Sharma/Santhanam translations. Cross-validated against jhora, py-jhora, vargas-py.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/panchang/tithi \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/panchang/tithi', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/panchang/tithi',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/panchang/tithi', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"paksha":{"type":"string","nullable":true},"indexInPaksha":{"type":"number","nullable":true},"elongation":{"type":"number","nullable":true},"percentComplete":{"type":"number","nullable":true}}}}},"example":{"ok":true,"data":{"number":21,"name":"Shashthi","paksha":"krishna","indexInPaksha":6,"elongation":242.52866797484398,"percentComplete":0.21072233123699866}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/panchang/karana":{"post":{"tags":["Vedic"],"summary":"Panchang: Karana","description":"Half-tithi (1-60). 7 movable (Bava-Vishti) + 4 fixed (Kimstughna, Shakuni, Naga, Chatushpada).","operationId":"vedic_panchang_karana","x-quality":"green","x-source":"BPHS (Brihat Parashara Hora Shastra): canonical Sanskrit text PD with Sharma/Santhanam translations. Cross-validated against jhora, py-jhora, vargas-py.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/panchang/karana \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/panchang/karana', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/panchang/karana',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/panchang/karana', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"index":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"isFixed":{"type":"boolean","nullable":true}}}}},"example":{"ok":true,"data":{"index":41,"name":"Garaja","isFixed":false}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/panchang/yoga":{"post":{"tags":["Vedic"],"summary":"Panchang: Yoga","description":"Surya-Chandra Yoga (1-27). Sum of Sun + Moon longitudes / (360/27).","operationId":"vedic_panchang_yoga","x-quality":"green","x-source":"BPHS (Brihat Parashara Hora Shastra): canonical Sanskrit text PD with Sharma/Santhanam translations. Cross-validated against jhora, py-jhora, vargas-py.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/panchang/yoga \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/panchang/yoga', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/panchang/yoga',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/panchang/yoga', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"sumLongitude":{"type":"number","nullable":true}}}}},"example":{"ok":true,"data":{"number":23,"name":"Shubha","sumLongitude":303.82909181948196}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/panchang/nakshatra-of-day":{"post":{"tags":["Vedic"],"summary":"Panchang: Nakshatra of Day","description":"Moon's sidereal Nakshatra (lunar mansion) at the given moment, with Pada (1-4) and percent-complete.","operationId":"vedic_panchang_nakshatra-of-day","x-quality":"green","x-source":"BPHS (Brihat Parashara Hora Shastra): canonical Sanskrit text PD with Sharma/Santhanam translations. Cross-validated against jhora, py-jhora, vargas-py.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/panchang/nakshatra-of-day \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/panchang/nakshatra-of-day', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/panchang/nakshatra-of-day',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/panchang/nakshatra-of-day', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"moonSiderealLongitude":{"type":"number","nullable":true},"nakshatra":{"type":"object","properties":{"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"ruler":{"type":"string","nullable":true}},"nullable":true},"pada":{"type":"number","nullable":true},"percentComplete":{"type":"number","nullable":true}}}}},"example":{"ok":true,"data":{"moonSiderealLongitude":273.178879897163,"nakshatra":{"number":21,"name":"Uttara Ashadha","ruler":"Sun"},"pada":2,"percentComplete":0.4884159922872221}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/panchang/choghadia":{"post":{"tags":["Vedic"],"summary":"Panchang: Choghadia","description":"8 day + 8 night Choghadia divisions. Each ~1.5h, marked good/bad/neutral. Cycle: Udveg, Char, Labh, Amrit, Kaal, Shubh, Rog. Day-start by weekday.","operationId":"vedic_panchang_choghadia","x-quality":"green","x-source":"BPHS (Brihat Parashara Hora Shastra): canonical Sanskrit text PD with Sharma/Santhanam translations. Cross-validated against jhora, py-jhora, vargas-py.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/panchang/choghadia \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/panchang/choghadia', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/panchang/choghadia',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/panchang/choghadia', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"sunrise":{"type":"string","nullable":true},"sunset":{"type":"string","nullable":true},"daytime":{"type":"array","items":{"type":"object","properties":{"index":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"quality":{"type":"string","nullable":true},"startHour":{"type":"number","nullable":true},"endHour":{"type":"number","nullable":true},"isDaytime":{"type":"boolean","nullable":true},"startTime":{"type":"string","nullable":true},"endTime":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"nighttime":{"type":"array","items":{"type":"object","properties":{"index":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"quality":{"type":"string","nullable":true},"startHour":{"type":"number","nullable":true},"endHour":{"type":"number","nullable":true},"isDaytime":{"type":"boolean","nullable":true},"startTime":{"type":"string","nullable":true},"endTime":{"type":"string","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"sunrise":"06:10:54","sunset":"21:38:29","daytime":[{"index":1,"name":"Rog","quality":"bad","startHour":6.1816186010837555,"endHour":8.114082143642008,"isDaytime":true,"startTime":"06:10:54","endTime":"08:06:51"}],"nighttime":[{"index":9,"name":"Kaal","quality":"bad","startHour":21.641326941549778,"endHour":22.705915165133774,"isDaytime":false,"startTime":"21:38:29","endTime":"22:42:21"}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/panchang/hora":{"post":{"tags":["Vedic"],"summary":"Panchang: Hora","description":"24 planetary hours per Chaldean order, with sunrise/sunset and day ruler.","operationId":"vedic_panchang_hora","x-quality":"green","x-source":"BPHS (Brihat Parashara Hora Shastra): canonical Sanskrit text PD with Sharma/Santhanam translations. Cross-validated against jhora, py-jhora, vargas-py.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/panchang/hora \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/panchang/hora', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/panchang/hora',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/panchang/hora', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"date":{"type":"string","nullable":true},"latitude":{"type":"number","nullable":true},"longitude":{"type":"number","nullable":true},"timezone":{"type":"number","nullable":true},"sunTimes":{"type":"object","properties":{"riseJD":{"type":"number","nullable":true},"setJD":{"type":"number","nullable":true},"riseHour":{"type":"number","nullable":true},"setHour":{"type":"number","nullable":true},"polarState":{"type":"string","nullable":true}},"nullable":true},"dayRulerPlanetId":{"type":"number","nullable":true},"dayRulerPlanetName":{"type":"string","nullable":true},"dayOfWeek":{"type":"number","nullable":true},"hours":{"type":"array","items":{"type":"object","properties":{"number":{"type":"number","nullable":true},"planetId":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"startHour":{"type":"number","nullable":true},"endHour":{"type":"number","nullable":true},"isDaytime":{"type":"boolean","nullable":true},"isCurrent":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"date":"1990-05-15","latitude":50.45,"longitude":30.52,"timezone":4,"sunTimes":{"riseJD":2448026.590900775,"setJD":2448027.235055289,"riseHour":6.1816186010837555,"setHour":21.641326941549778,"polarState":"normal"},"dayRulerPlanetId":4,"dayRulerPlanetName":"Mars","dayOfWeek":2,"hours":[{"number":1,"planetId":4,"planetName":"Mars","startHour":6.1816186010837555,"endHour":7.469927629455924,"isDaytime":true,"isCurrent":false}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/panchang/rahu-kaal":{"post":{"tags":["Vedic"],"summary":"Panchang: Rahu Kaal block","description":"Three inauspicious 1.5h-windows (Rahu Kaal + Yamaganda + Gulika) + Abhijit Muhurat. Position depends on weekday and sunrise/sunset.","operationId":"vedic_panchang_rahu-kaal","x-quality":"green","x-source":"BPHS (Brihat Parashara Hora Shastra): canonical Sanskrit text PD with Sharma/Santhanam translations. Cross-validated against jhora, py-jhora, vargas-py.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/panchang/rahu-kaal \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/panchang/rahu-kaal', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/panchang/rahu-kaal',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/panchang/rahu-kaal', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"sunrise":{"type":"string","nullable":true},"sunset":{"type":"string","nullable":true},"rahuKaal":{"type":"object","properties":{"name":{"type":"string","nullable":true},"weekdaySlot":{"type":"number","nullable":true},"startHour":{"type":"number","nullable":true},"endHour":{"type":"number","nullable":true},"startTime":{"type":"string","nullable":true},"endTime":{"type":"string","nullable":true}},"nullable":true},"yamaganda":{"type":"object","properties":{"name":{"type":"string","nullable":true},"weekdaySlot":{"type":"number","nullable":true},"startHour":{"type":"number","nullable":true},"endHour":{"type":"number","nullable":true},"startTime":{"type":"string","nullable":true},"endTime":{"type":"string","nullable":true}},"nullable":true},"gulika":{"type":"object","properties":{"name":{"type":"string","nullable":true},"weekdaySlot":{"type":"number","nullable":true},"startHour":{"type":"number","nullable":true},"endHour":{"type":"number","nullable":true},"startTime":{"type":"string","nullable":true},"endTime":{"type":"string","nullable":true}},"nullable":true},"abhijitMuhurat":{"type":"object","properties":{"startHour":{"type":"number","nullable":true},"endHour":{"type":"number","nullable":true},"midHour":{"type":"number","nullable":true},"muhurtaMinutes":{"type":"number","nullable":true},"startTime":{"type":"string","nullable":true},"endTime":{"type":"string","nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"sunrise":"06:10:54","sunset":"21:38:29","rahuKaal":{"name":"Rahu Kaal","weekdaySlot":7,"startHour":17.776399856433272,"endHour":19.708863398991525,"startTime":"17:46:35","endTime":"19:42:32"},"yamaganda":{"name":"Yamaganda","weekdaySlot":3,"startHour":10.046545686200261,"endHour":11.979009228758514,"startTime":"10:02:48","endTime":"11:58:44"},"gulika":{"name":"Gulika","weekdaySlot":5,"startHour":13.911472771316767,"endHour":15.84393631387502,"startTime":"13:54:41","endTime":"15:50:38"},"abhijitMuhurat":{"startHour":13.3961491599679,"endHour":14.426796382665634,"midHour":13.911472771316767,"muhurtaMinutes":61.83883336186409,"startTime":"13:23:46","endTime":"14:25:36"}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/shadbala/sthana":{"post":{"tags":["Vedic"],"summary":"Shadbala: Sthana (positional)","description":"Sthana Bala, the sum of 5 sub-strengths: Ucchabala (exaltation), Saptavargaja (sum across 7 vargas D1/D2/D3/D7/D9/D12/D30 with Mulatrikona+Own/Friend/Neutral/Enemy weights per BPHS A.27.10-19), Ojhayugmarasyamsa (odd/even sign suitability D1+D9), Kendradi (60/30/15 angular/succedent/cadent), Drekkana (1st/2nd/3rd third gender match).","operationId":"vedic_shadbala_sthana","x-quality":"green","x-source":"BPHS Adhyaya 27.4-27: Mulatrikona segments + 7-tier sign relationships per Sharma translation. Verified vs Saravali tables.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/shadbala/sthana \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/shadbala/sthana', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/shadbala/sthana',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/shadbala/sthana', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"type":{"type":"string","nullable":true},"unit":{"type":"string","nullable":true},"items":{"type":"array","items":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"ucchabala":{"type":"number","nullable":true},"saptavargaja":{"type":"number","nullable":true},"ojhayugmarasyamsa":{"type":"number","nullable":true},"kendradi":{"type":"number","nullable":true},"drekkana":{"type":"number","nullable":true},"total":{"type":"number","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"type":"sthana","unit":"virupa","items":[{"planet":0,"planetName":"Sun","ucchabala":53.11659602589367,"saptavargaja":48.75,"ojhayugmarasyamsa":0,"kendradi":15,"drekkana":15,"total":131.86659602589367}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/shadbala/dig":{"post":{"tags":["Vedic"],"summary":"Shadbala: Dig (directional)","description":"Dig Bala: directional strength. 60v at preferred kendra cusp, 0v at opposite point, linear gradient. Sun/Mars→10th, Moon/Venus→4th, Jupiter/Mercury→1st, Saturn→7th.","operationId":"vedic_shadbala_dig","x-quality":"green","x-source":"BPHS Adhyaya 27.28-31: pure formula.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/shadbala/dig \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/shadbala/dig', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/shadbala/dig',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/shadbala/dig', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"type":{"type":"string","nullable":true},"unit":{"type":"string","nullable":true},"items":{"type":"array","items":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"value":{"type":"number","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"type":"dig","unit":"virupa","items":[{"planet":0,"planetName":"Sun","value":52.43283314314894}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/shadbala/kala":{"post":{"tags":["Vedic"],"summary":"Shadbala: Kala (temporal)","description":"Kala Bala, sum of Nathonnatha (continuous time-from-midnight/noon), Paksha (continuous Moon-Sun elongation, Moon-doubled per BPHS), Tribhaga (3-fold split of day/night), Abda+Masa+Vara+Hora rulers, Ayana (declination-based, Sun-doubled, Mercury bidirectional). Yuddha (planetary war) deferred. Abda/Masa rulers require Vedic calendar lookup, currently zeroed (no contribution) to avoid double-counting Vara.","operationId":"vedic_shadbala_kala","x-quality":"green","x-source":"BPHS Adhyaya 27.32-A.28.18: continuous formulas per Saravali. Yuddha (rare, planetary conjunctions <1°) and Vedic-calendar Abda/Masa lookup are not computed yet.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/shadbala/kala \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/shadbala/kala', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/shadbala/kala',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/shadbala/kala', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"type":{"type":"string","nullable":true},"unit":{"type":"string","nullable":true},"items":{"type":"array","items":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"nathonnatha":{"type":"number","nullable":true},"paksha":{"type":"number","nullable":true},"tribhaga":{"type":"number","nullable":true},"abdaMasaVaraHora":{"type":"number","nullable":true},"ayana":{"type":"number","nullable":true},"total":{"type":"number","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"type":"kala","unit":"virupa","items":[{"planet":0,"planetName":"Sun","nathonnatha":42.5,"paksha":20.842889324947997,"tribhaga":60,"abdaMasaVaraHora":0,"ayana":108.37701319751226,"total":231.71990252246025}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/shadbala/cheshta":{"post":{"tags":["Vedic"],"summary":"Shadbala: Cheshta (motional)","description":"Cheshta Bala, motional strength via simplified retrograde+speed model: retrograde=60v, direct slow=ratio*60, direct fast=(2-ratio)*60. Sun=0 (handled via Ayana with ×2), Moon=0 (handled via Paksha with ×2). Full BPHS Cheshta-Kendra method (mean-longitude based) is not implemented yet; current divergence vs jhora ≤30v on non-stationary dates.","operationId":"vedic_shadbala_cheshta","x-quality":"yellow","x-source":"BPHS Adhyaya 27.44-45: simplified retrograde/speed model, full Cheshta-Kendra anomaly-based method is not implemented yet.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/shadbala/cheshta \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/shadbala/cheshta', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/shadbala/cheshta',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/shadbala/cheshta', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"type":{"type":"string","nullable":true},"unit":{"type":"string","nullable":true},"items":{"type":"array","items":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"value":{"type":"number","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"type":"cheshta","unit":"virupa","items":[{"planet":0,"planetName":"Sun","value":0}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/shadbala/naisargika":{"post":{"tags":["Vedic"],"summary":"Shadbala: Naisargika (natural)","description":"Naisargika Bala: fixed natural strength per planet. Sun=60v, Moon=51.43, Venus=42.85, Jupiter=34.28, Mercury=25.71, Mars=17.14, Saturn=8.57.","operationId":"vedic_shadbala_naisargika","x-quality":"green","x-source":"BPHS Adhyaya 27.27: fixed canonical constants.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/shadbala/naisargika \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/shadbala/naisargika', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/shadbala/naisargika',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/shadbala/naisargika', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"type":{"type":"string","nullable":true},"unit":{"type":"string","nullable":true},"items":{"type":"array","items":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"value":{"type":"number","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"type":"naisargika","unit":"virupa","items":[{"planet":0,"planetName":"Sun","value":60}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/shadbala/drik":{"post":{"tags":["Vedic"],"summary":"Shadbala: Drik (aspectual)","description":"Drik Bala, net aspectual strength per BPHS A.27.49: (benefic_drishti − malefic_drishti) / 4 + full Mercury_drishti + full Jupiter_drishti. Mercury and Jupiter aspects super-add (full weight). Vedic full drishti: 7th for all + Mars 4/8, Jupiter 5/9, Saturn 3/10.","operationId":"vedic_shadbala_drik","x-quality":"green","x-source":"BPHS Adhyaya 27.46-49: canonical /4 weighting + Mercury/Jupiter super-add. Partial graded drishti (degree-based decay) is a refinement not implemented yet.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/shadbala/drik \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/shadbala/drik', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/shadbala/drik',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/shadbala/drik', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"type":{"type":"string","nullable":true},"unit":{"type":"string","nullable":true},"items":{"type":"array","items":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"value":{"type":"number","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"type":"drik","unit":"virupa","items":[{"planet":0,"planetName":"Sun","value":-15}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/shadbala/full":{"post":{"tags":["Vedic"],"summary":"Shadbala: full summary","description":"Combined Shadbala: всі 6 типів strength + total Virupa + total Rupa per planet. Single call. Useful for Vedic chart strength dashboards.","operationId":"vedic_shadbala_full","x-quality":"green","x-source":"Composite: Sthana/Dig/Kala/Naisargika/Drik are GREEN (canonical BPHS); Cheshta is YELLOW (simplified model). Honest disclaimer per component.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/shadbala/full \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/shadbala/full', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/shadbala/full',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/shadbala/full', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"type":{"type":"string","nullable":true},"unit":{"type":"string","nullable":true},"items":{"type":"array","items":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"sthana":{"type":"number","nullable":true},"dig":{"type":"number","nullable":true},"kala":{"type":"number","nullable":true},"cheshta":{"type":"number","nullable":true},"naisargika":{"type":"number","nullable":true},"drik":{"type":"number","nullable":true},"totalVirupa":{"type":"number","nullable":true},"totalRupa":{"type":"number","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"type":"shadbala-summary","unit":"virupa","items":[{"planet":0,"planetName":"Sun","sthana":131.86659602589367,"dig":52.43283314314894,"kala":231.71990252246025,"cheshta":0,"naisargika":60,"drik":-15,"totalVirupa":461.0193316915029,"totalRupa":7.683655528191715}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/bhavabala":{"post":{"tags":["Vedic"],"summary":"Bhava Bala: house strength","description":"Strength of the twelve houses per BPHS Adhyaya 27: Bhavadhipati Bala (the Shadbala of the house lord), Bhava Digbala (the four rasi classes, each strong in one direction), and Bhava Drishti Bala (net benefic minus malefic aspect on the bhava). Components returned separately, plus rank, strongest and weakest house.","operationId":"vedic_bhavabala","x-quality":"yellow","x-source":"BPHS Adhyaya 27 (Bhava Bala section) + B.V. Raman \"Graha and Bhava Balas\" (1996). Digbala and the rasi classes are exact by construction; Bhavadhipati Bala is the lord Shadbala verbatim. YELLOW is inherited from shadbala.ts, whose whole-sign drishti model and jhora cross-validation are not done yet.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/bhavabala \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/bhavabala', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/bhavabala',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/bhavabala', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"type":{"type":"string","nullable":true},"unit":{"type":"string","nullable":true},"houses":{"type":"array","items":{"type":"object","properties":{"house":{"type":"number","nullable":true},"madhyaLon":{"type":"number","nullable":true},"sign":{"type":"number","nullable":true},"signClass":{"type":"string","nullable":true},"direction":{"type":"string","nullable":true},"lord":{"type":"number","nullable":true},"bhavadhipatiBala":{"type":"number","nullable":true},"bhavaDigBala":{"type":"number","nullable":true},"bhavaDrishtiBala":{"type":"number","nullable":true},"totalVirupas":{"type":"number","nullable":true},"totalRupas":{"type":"number","nullable":true},"rank":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"strongest":{"type":"object","properties":{"house":{"type":"number","nullable":true},"totalVirupas":{"type":"number","nullable":true}},"nullable":true},"weakest":{"type":"object","properties":{"house":{"type":"number","nullable":true},"totalVirupas":{"type":"number","nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"type":"bhava-bala","unit":"virupa","houses":[{"house":1,"madhyaLon":157.69,"sign":5,"signClass":"nara","direction":"east","lord":2,"bhavadhipatiBala":409.52,"bhavaDigBala":60,"bhavaDrishtiBala":0,"totalVirupas":469.52,"totalRupas":7.83,"rank":7}],"strongest":{"house":4,"totalVirupas":599.61},"weakest":{"house":11,"totalVirupas":409.64}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/gemstones":{"post":{"tags":["Vedic"],"summary":"Gemstone (ratna) recommendation","description":"Which of the nine gems to wear, from the sidereal lagna. Two schools are implemented: `lagna-lord` (default) prescribes the gems of the 1st, 9th and 5th lords as the life, lucky and benefic stones; `functional-benefic` classifies every graha by the houses it owns from the lagna, prescribes only for functional benefics led by the yogakaraka, and names the functional malefics as gems to avoid. Both reach the same three gems, because a functional benefic is a graha owning a trikona and the trikona lords are the 1st, 5th and 9th: the school changes the ordering, the role each gem carries, and the avoid list. The response always reports which one produced it. Coordinates are required, since the whole answer is derived from the lagna. Each gem carries its substitutes, day, finger, metal, weight range in ratti/grams/carats, and beeja mantra. Planet dignity is returned as context and does not change the list.","operationId":"vedic_gemstones","x-quality":"green","x-source":"Gem-to-graha mapping: Garuda Purana (Acharakanda, ratna-pariksha) + Varahamihira, Brihat Samhita ch. 80. Functional classification: Bepin Behari, \"Fundamentals of Vedic Astrology\"; the yogakaraka rule is BPHS. The rule set is validated by reproducing the published per-lagna prescriptions (the classical yogakaraka six, and the avoid lists for Aries, Taurus, Cancer and Leo) without them being hardcoded. Remedy, not medical or purchasing advice: every response carries the gemmologist/physician boundary.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Gemstone"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52,"school":"lagna-lord"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/gemstones \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52, \"school\": \"lagna-lord\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/gemstones', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52,\n    \"school\": \"lagna-lord\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/gemstones',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52,\n      'school': \"lagna-lord\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/gemstones', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n        'school' => 'lagna-lord',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"type":{"type":"string","nullable":true},"school":{"type":"string","nullable":true},"schoolNote":{"type":"string","nullable":true},"ayanamsa":{"type":"number","nullable":true},"lagna":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"longitude":{"type":"number","nullable":true},"lord":{"type":"number","nullable":true},"lordName":{"type":"string","nullable":true}},"nullable":true},"recommended":{"type":"array","items":{"type":"object","properties":{"role":{"type":"string","nullable":true},"graha":{"type":"number","nullable":true},"housesOwned":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"basis":{"type":"string","nullable":true},"grahaName":{"type":"string","nullable":true},"grahaSanskrit":{"type":"string","nullable":true},"gem":{"type":"string","nullable":true},"gemSanskrit":{"type":"string","nullable":true},"mineral":{"type":"string","nullable":true},"substitutes":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"wearing":{"type":"object","properties":{"day":{"type":"string","nullable":true},"finger":{"type":"string","nullable":true},"fingerVariants":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"metals":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"minWeight":{"type":"object","properties":{"ratti":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"grams":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"carats":{"type":"array","items":{"type":"number","nullable":true},"nullable":true}},"nullable":true},"mantra":{"type":"string","nullable":true},"japaCount":{"type":"number","nullable":true}},"nullable":true}},"nullable":true},"nullable":true},"avoid":{"type":"array","items":{"type":"object","properties":{"role":{"type":"string","nullable":true},"graha":{"type":"number","nullable":true},"housesOwned":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"basis":{"type":"string","nullable":true},"grahaName":{"type":"string","nullable":true},"grahaSanskrit":{"type":"string","nullable":true},"gem":{"type":"string","nullable":true},"gemSanskrit":{"type":"string","nullable":true},"mineral":{"type":"string","nullable":true},"substitutes":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"wearing":{"type":"object","properties":{"day":{"type":"string","nullable":true},"finger":{"type":"string","nullable":true},"fingerVariants":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"metals":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"minWeight":{"type":"object","properties":{"ratti":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"grams":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"carats":{"type":"array","items":{"type":"number","nullable":true},"nullable":true}},"nullable":true},"mantra":{"type":"string","nullable":true},"japaCount":{"type":"number","nullable":true}},"nullable":true}},"nullable":true},"nullable":true},"cautions":{"type":"array","items":{"type":"object","properties":{"role":{"type":"string","nullable":true},"graha":{"type":"number","nullable":true},"housesOwned":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"basis":{"type":"string","nullable":true},"grahaName":{"type":"string","nullable":true},"grahaSanskrit":{"type":"string","nullable":true},"gem":{"type":"string","nullable":true},"gemSanskrit":{"type":"string","nullable":true},"mineral":{"type":"string","nullable":true},"substitutes":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"wearing":{"type":"object","properties":{"day":{"type":"string","nullable":true},"finger":{"type":"string","nullable":true},"fingerVariants":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"metals":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"minWeight":{"type":"object","properties":{"ratti":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"grams":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"carats":{"type":"array","items":{"type":"number","nullable":true},"nullable":true}},"nullable":true},"mantra":{"type":"string","nullable":true},"japaCount":{"type":"number","nullable":true}},"nullable":true}},"nullable":true},"nullable":true},"nodesNote":{"type":"string","nullable":true},"condition":{"type":"object","properties":{"Sun":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"degreeInSign":{"type":"number","nullable":true},"house":{"type":"number","nullable":true},"dignity":{"type":"string","nullable":true},"isRetrograde":{"type":"boolean","nullable":true},"isCombust":{"type":"boolean","nullable":true}},"nullable":true},"Moon":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"degreeInSign":{"type":"number","nullable":true},"house":{"type":"number","nullable":true},"dignity":{"type":"string","nullable":true},"isRetrograde":{"type":"boolean","nullable":true},"isCombust":{"type":"boolean","nullable":true}},"nullable":true},"Mercury":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"degreeInSign":{"type":"number","nullable":true},"house":{"type":"number","nullable":true},"dignity":{"type":"string","nullable":true},"isRetrograde":{"type":"boolean","nullable":true},"isCombust":{"type":"boolean","nullable":true}},"nullable":true},"Venus":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"degreeInSign":{"type":"number","nullable":true},"house":{"type":"number","nullable":true},"dignity":{"type":"string","nullable":true},"isRetrograde":{"type":"boolean","nullable":true},"isCombust":{"type":"boolean","nullable":true}},"nullable":true},"Mars":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"degreeInSign":{"type":"number","nullable":true},"house":{"type":"number","nullable":true},"dignity":{"type":"string","nullable":true},"isRetrograde":{"type":"boolean","nullable":true},"isCombust":{"type":"boolean","nullable":true}},"nullable":true},"Jupiter":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"degreeInSign":{"type":"number","nullable":true},"house":{"type":"number","nullable":true},"dignity":{"type":"string","nullable":true},"isRetrograde":{"type":"boolean","nullable":true},"isCombust":{"type":"boolean","nullable":true}},"nullable":true},"Saturn":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"degreeInSign":{"type":"number","nullable":true},"house":{"type":"number","nullable":true},"dignity":{"type":"string","nullable":true},"isRetrograde":{"type":"boolean","nullable":true},"isCombust":{"type":"boolean","nullable":true}},"nullable":true}},"nullable":true},"conditionNote":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"type":"gemstone-recommendation","school":"lagna-lord","schoolNote":"Prescribes the gems of the 1st, 9th and 5th lords as the life, lucky and benefic stones. Strengthening the lagna lord is safe for the native by definition, which is the argument for the school. It withholds a gem only when its graha owns nothing but dusthanas, so the avoid list is usually empty. Same three gems as functional-benefic, ordered by role rather than by strength of the yoga.","ayanamsa":23.7225,"lagna":{"sign":4,"signName":"Leo","longitude":146.2454,"lord":0,"lordName":"Sun"},"recommended":[{"role":"life stone (jeevan ratna)","graha":0,"housesOwned":[1],"basis":"lord of the 1st house (Leo)","grahaName":"Sun","grahaSanskrit":"Surya","gem":"Ruby","gemSanskrit":"Manikya","mineral":"Corundum (red)","substitutes":["Red spinel"],"wearing":{"day":"Sunday","finger":"Ring finger","fingerVariants":["Ring finger"],"metals":["Gold"],"minWeight":{"ratti":[3],"grams":[0.364],"carats":[1.82]},"mantra":"Om Hraam Hreem Hraum Sah Suryaya Namah","japaCount":6000}}],"avoid":[{"role":"withheld","graha":1,"housesOwned":[12],"basis":"owns only 12th (dusthana)","grahaName":"Moon","grahaSanskrit":"Chandra","gem":"Pearl","gemSanskrit":"Moti","mineral":"Natural nacre (Pinctada)","substitutes":["Moonstone"],"wearing":{"day":"Monday","finger":"Little finger","fingerVariants":["Little finger"],"metals":["Silver"],"minWeight":{"ratti":[4],"grams":[0.486],"carats":[2.43]},"mantra":"Om Shraam Shreem Shraum Sah Chandraya Namah","japaCount":11000}}],"cautions":[{"role":"maraka caution","graha":2,"housesOwned":[2],"basis":"owns the 2nd (maraka)","grahaName":"Mercury","grahaSanskrit":"Budha","gem":"Emerald","gemSanskrit":"Panna","mineral":"Beryl (green)","substitutes":["Peridot"],"wearing":{"day":"Wednesday","finger":"Little finger","fingerVariants":["Little finger"],"metals":["Gold"],"minWeight":{"ratti":[3],"grams":[0.364],"carats":[1.82]},"mantra":"Om Braam Breem Braum Sah Budhaya Namah","japaCount":9000}}],"nodesNote":"Rahu and Ketu own no sign, so neither school reaches hessonite or cat's eye from the lagna. They are prescribed on a specific reason (a running dasha, a conjunction, an affliction), which is a separate judgement from the one this endpoint makes.","condition":{"Sun":{"sign":1,"signName":"Taurus","degreeInSign":0.6502119223189666,"house":10,"dignity":"neutral","isRetrograde":false,"isCombust":false},"Moon":{"sign":9,"signName":"Capricorn","degreeInSign":3.1788798971629717,"house":6,"dignity":"neutral","isRetrograde":false,"isCombust":false},"Mercury":{"sign":0,"signName":"Aries","degreeInSign":14.28917860756014,"house":9,"dignity":"neutral","isRetrograde":true,"isCombust":false},"Venus":{"sign":11,"signName":"Pisces","degreeInSign":19.06874274676204,"house":8,"dignity":"exalted","isRetrograde":false,"isCombust":false},"Mars":{"sign":10,"signName":"Aquarius","degreeInSign":24.592569875940683,"house":7,"dignity":"neutral","isRetrograde":false,"isCombust":false},"Jupiter":{"sign":2,"signName":"Gemini","degreeInSign":15.811997278981366,"house":11,"dignity":"neutral","isRetrograde":false,"isCombust":false},"Saturn":{"sign":9,"signName":"Capricorn","degreeInSign":1.523954056640207,"house":6,"dignity":"own sign","isRetrograde":true,"isCombust":false}},"conditionNote":"Context only. Both schools prescribe by house ownership, not by strength, so dignity and combustion do not change the list above.","disclaimer":"Traditional Jyotish remedy, informational only. Gem identity, treatment and weight must be confirmed by a qualified gemmologist or jeweller before purchase, and no gemstone is a substitute for medical care: consult a licensed physician for any health concern."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/gemstones/navaratna":{"get":{"tags":["Vedic"],"summary":"Navaratna reference table","description":"The nine gems and their graha, with substitutes (upa-ratna), weekday, finger and its variants, metals, minimum weight range in ratti with gram and carat conversions, beeja mantra and japa count. Static lookup, no chart needed.","operationId":"vedic_gemstones_navaratna_get","x-quality":"green","x-source":"Gem-to-graha mapping is classical (Garuda Purana + Brihat Samhita ch. 80) and stable across schools. Day, finger, metal, weight and mantra are modern practice, not scripture: manuals disagree, so variants and a range are returned rather than one number presented as canon.","security":[{"ApiKeyAuth":[]}],"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X GET https://api.astroway.info/v1/vedic/gemstones/navaratna \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/gemstones/navaratna', {\n  method: 'GET',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.get(\n    'https://api.astroway.info/v1/vedic/gemstones/navaratna',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->get('vedic/gemstones/navaratna', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"count":{"type":"number","nullable":true},"conversions":{"type":"object","properties":{"rattiGrams":{"type":"number","nullable":true},"rattiCarats":{"type":"number","nullable":true}},"nullable":true},"gems":{"type":"array","items":{"type":"object","properties":{"graha":{"type":"number","nullable":true},"grahaName":{"type":"string","nullable":true},"grahaSanskrit":{"type":"string","nullable":true},"gem":{"type":"string","nullable":true},"gemSanskrit":{"type":"string","nullable":true},"mineral":{"type":"string","nullable":true},"substitutes":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"wearing":{"type":"object","properties":{"day":{"type":"string","nullable":true},"finger":{"type":"string","nullable":true},"fingerVariants":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"metals":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"minWeight":{"type":"object","properties":{"ratti":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"grams":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"carats":{"type":"array","items":{"type":"number","nullable":true},"nullable":true}},"nullable":true},"mantra":{"type":"string","nullable":true},"japaCount":{"type":"number","nullable":true}},"nullable":true}},"nullable":true},"nullable":true},"sources":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"count":9,"conversions":{"rattiGrams":0.1215,"rattiCarats":0.6075},"gems":[{"graha":0,"grahaName":"Sun","grahaSanskrit":"Surya","gem":"Ruby","gemSanskrit":"Manikya","mineral":"Corundum (red)","substitutes":["Red spinel"],"wearing":{"day":"Sunday","finger":"Ring finger","fingerVariants":["Ring finger"],"metals":["Gold"],"minWeight":{"ratti":[3],"grams":[0.364],"carats":[1.82]},"mantra":"Om Hraam Hreem Hraum Sah Suryaya Namah","japaCount":6000}}],"sources":"Gem-to-graha mapping: Garuda Purana (ratna-pariksha) and Brihat Samhita ch. 80. Day, finger, metal, weight and mantra are modern practice, not scripture, and manuals disagree: variants and a range are returned rather than one number presented as canon.","disclaimer":"Traditional Jyotish remedy, informational only. Gem identity, treatment and weight must be confirmed by a qualified gemmologist or jeweller before purchase, and no gemstone is a substitute for medical care: consult a licensed physician for any health concern."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/varshaphal":{"post":{"tags":["Vedic"],"summary":"Varshaphal: Tajika annual chart","description":"The Tajika annual chart for one year of life. Cast on the moment the SIDEREAL Sun returns to its natal longitude, which for an adult sits many hours away from the tropical solar return and therefore on a different ascendant: the gap runs 0.4 h at age 1, 3.3 h at 10, 7.0 h at 20, 12.5 h at 36 and 17.2 h at 50. Returns the year entry to the second, the sidereal annual chart, the muntha (the natal lagna advanced one sign per completed year) with its house and lord, Panchavargiya bala for all seven grahas (griha, uchcha, hadda, drekkana, navamsa, summed and quartered into Vishwa out of 20), the five office bearers a year lord is chosen from, and five sahams. The year lord comes back twice, because the sources disagree: `varshesha` follows the Hayanaratna, which requires an aspect to the annual ascendant before strength is consulted and carries the reason it chose; `varsheshaByStrength` is the modern shortcut of taking the strongest candidate outright. Pass `entryLatitude`/`entryLongitude` to enter the year somewhere other than the birthplace, which moves the ascendant and the houses but not the planets or the muntha. Coordinates are required.","operationId":"vedic_varshaphal","x-quality":"yellow","x-source":"Balabhadra, *Hayanaratna* (1629) tr. Martin Gansten: munthaha 5.1, triplicity rulers 5.7, ruler of the year 5.8, orbs of light 3.1, saham rule 4.2. K. S. Charak, *A Textbook of Varshaphala*, for the Panchavargiya unit values and the strength-only year lord. The Egyptian bounds are cross-checked against a second, non-Tajika source. The year entry is exact by construction and asserted: the sidereal Sun is back on its natal longitude to under 1e-6 degrees from age 1 to 50. The saham engine and its added-sign correction are pinned to the two worked examples in the Hayanaratna itself. YELLOW is doctrinal: the year lord has two readings, only five of the circulated thirty-five sahams have a second source, and Mudda dasha is deliberately absent because the sources split on its first lord.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Varshaphal"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52,"year":2026}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/varshaphal \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52, \"year\": 2026 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/varshaphal', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52,\n    \"year\": 2026\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/varshaphal',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52,\n      'year': 2026\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/varshaphal', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n        'year' => 2026,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"year":{"type":"number","nullable":true},"yearsElapsed":{"type":"number","nullable":true},"pravesh":{"type":"object","properties":{"julianDay":{"type":"number","nullable":true},"utc":{"type":"string","nullable":true}},"nullable":true},"isDayBirth":{"type":"boolean","nullable":true},"ayanamsa":{"type":"number","nullable":true},"ayanamsaName":{"type":"string","nullable":true},"ascendant":{"type":"object","properties":{"longitude":{"type":"number","nullable":true},"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"degreeInSign":{"type":"number","nullable":true}},"nullable":true},"cusps":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"planets":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"longitude":{"type":"number","nullable":true},"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"degreeInSign":{"type":"number","nullable":true},"house":{"type":"number","nullable":true},"isRetrograde":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true},"muntha":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"degree":{"type":"number","nullable":true},"house":{"type":"number","nullable":true},"lord":{"type":"number","nullable":true},"lordName":{"type":"string","nullable":true}},"nullable":true},"bala":{"type":"object","properties":{"3":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"griha":{"type":"number","nullable":true},"grihaRelation":{"type":"string","nullable":true},"uchcha":{"type":"number","nullable":true},"hadda":{"type":"number","nullable":true},"haddaLord":{"type":"number","nullable":true},"drekkana":{"type":"number","nullable":true},"drekkanaLord":{"type":"number","nullable":true},"navamsa":{"type":"number","nullable":true},"navamsaLord":{"type":"number","nullable":true},"total":{"type":"number","nullable":true},"vishwa":{"type":"number","nullable":true},"classification":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"sahams":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"of":{"type":"string","nullable":true},"longitude":{"type":"number","nullable":true},"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"degreeInSign":{"type":"number","nullable":true},"house":{"type":"number","nullable":true},"lord":{"type":"number","nullable":true},"lordName":{"type":"string","nullable":true},"signAdded":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true},"candidates":{"type":"array","items":{"type":"object","properties":{"role":{"type":"string","nullable":true},"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"vishwaBala":{"type":"number","nullable":true},"aspectToVarshaLagna":{"type":"object","properties":{"kind":{"type":"string","nullable":true},"strength":{"type":"string","nullable":true},"nature":{"type":"string","nullable":true},"signDistance":{"type":"number","nullable":true},"separation":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true},"withinOrb":{"type":"boolean","nullable":true}},"nullable":true},"qualifies":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true},"varshesha":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"role":{"type":"string","nullable":true},"school":{"type":"string","nullable":true},"reason":{"type":"string","nullable":true}},"nullable":true},"varsheshaByStrength":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"role":{"type":"string","nullable":true},"school":{"type":"string","nullable":true}},"nullable":true},"note":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"year":2026,"yearsElapsed":36,"pravesh":{"julianDay":2461176.210015529,"utc":"2026-05-15T17:02:25.341Z"},"isDayBirth":true,"ayanamsa":24.23,"ayanamsaName":"Lahiri","ascendant":{"longitude":205.22,"sign":6,"signName":"Libra","degreeInSign":25.22},"cusps":[205.22,235.56,274.27,313.67,344.64,7.5,25.22,55.56,94.27,133.67,164.64,187.5],"planets":[{"id":0,"name":"Sun","longitude":30.65,"sign":1,"signName":"Taurus","degreeInSign":0.65,"house":8,"isRetrograde":false}],"muntha":{"sign":4,"signName":"Leo","degree":26.25,"house":11,"lord":0,"lordName":"Sun"},"bala":{"3":{"planet":3,"griha":22.5,"grihaRelation":"greatFriend","uchcha":12.8,"hadda":11.25,"haddaLord":2,"drekkana":7.5,"drekkanaLord":2,"navamsa":5,"navamsaLord":3,"total":59.05,"vishwa":14.76,"classification":"poorna-bali"}},"sahams":[{"id":"punya","name":"Punya","of":"merit, protection, the tone of the whole year","longitude":189.32,"sign":6,"signName":"Libra","degreeInSign":9.32,"house":1,"lord":3,"lordName":"Venus","signAdded":false}],"candidates":[{"role":"munthesha","planet":0,"planetName":"Sun","vishwaBala":8.18,"aspectToVarshaLagna":{"kind":"none","strength":"none","nature":"neutral","signDistance":8,"separation":174.57,"orb":15,"withinOrb":false},"qualifies":false}],"varshesha":{"planet":3,"planetName":"Venus","role":"varsha-lagnesha","school":"hayanaratna","reason":"aspects the annual ascendant by trine and is the strongest of the 3 that do (Vishwa 14.76)"},"varsheshaByStrength":{"planet":3,"planetName":"Venus","role":"varsha-lagnesha","school":"charak"},"note":"Tajika is a separate school from Parashari..."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/yogas/parashara/raja":{"post":{"tags":["Vedic"],"summary":"Yogas: Raja (royal)","description":"Raja Yoga detection per BPHS A.36-37: sambandha between kendra-lord (1/4/7/10) and trikona-lord (1/5/9) via 1) conjunction, 2) mutual graha drishti (full Vedic aspects: 7th universal + Mars 4/8, Jupiter 5/9, Saturn 3/10), or 3) strict parivartana (specific pair-swap of houses).","operationId":"vedic_yogas_parashara_raja","x-quality":"green","x-source":"BPHS Adhyaya 36-37: canonical sambandha (conjunction + mutual drishti + strict pair-swap parivartana).","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/yogas/parashara/raja \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/yogas/parashara/raja', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/yogas/parashara/raja',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/yogas/parashara/raja', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"yoga":{"type":"string","nullable":true},"school":{"type":"string","nullable":true},"lagnaSign":{"type":"number","nullable":true},"present":{"type":"boolean","nullable":true},"contributingPlanets":{"type":"array","items":{},"nullable":true},"details":{"type":"array","items":{},"nullable":true}}}}},"example":{"ok":true,"data":{"yoga":"Raja","school":"parashara","lagnaSign":4,"present":false,"contributingPlanets":[],"details":[]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/yogas/parashara/dhana":{"post":{"tags":["Vedic"],"summary":"Yogas: Dhana (wealth)","description":"Dhana Yoga: lords of wealth houses (1, 2, 5, 9, 11) connected via conjunction, mutual graha drishti, or strict parivartana.","operationId":"vedic_yogas_parashara_dhana","x-quality":"green","x-source":"BPHS Adhyaya 39 + standard wealth-yoga texts.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/yogas/parashara/dhana \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/yogas/parashara/dhana', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/yogas/parashara/dhana',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/yogas/parashara/dhana', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"yoga":{"type":"string","nullable":true},"school":{"type":"string","nullable":true},"lagnaSign":{"type":"number","nullable":true},"present":{"type":"boolean","nullable":true},"contributingPlanets":{"type":"array","items":{},"nullable":true},"details":{"type":"array","items":{},"nullable":true}}}}},"example":{"ok":true,"data":{"yoga":"Dhana","school":"parashara","lagnaSign":4,"present":false,"contributingPlanets":[],"details":[]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/yogas/parashara/dharma-karmadhipati":{"post":{"tags":["Vedic"],"summary":"Yogas: Dharma-Karmadhipati","description":"Dharma-Karmadhipati Yoga: lord of 9th (Dharma) and lord of 10th (Karma) conjunct, in mutual graha drishti (full Vedic aspects), or single planet rules both. Exceptionally fortunate combination.","operationId":"vedic_yogas_parashara_dharma-karmadhipati","x-quality":"green","x-source":"BPHS Adhyaya 36.7.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/yogas/parashara/dharma-karmadhipati \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/yogas/parashara/dharma-karmadhipati', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/yogas/parashara/dharma-karmadhipati',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/yogas/parashara/dharma-karmadhipati', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"yoga":{"type":"string","nullable":true},"school":{"type":"string","nullable":true},"lagnaSign":{"type":"number","nullable":true},"present":{"type":"boolean","nullable":true},"contributingPlanets":{"type":"array","items":{},"nullable":true},"details":{"type":"array","items":{},"nullable":true}}}}},"example":{"ok":true,"data":{"yoga":"Dharma-Karmadhipati","school":"parashara","lagnaSign":4,"present":false,"contributingPlanets":[],"details":[]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/yogas/parashara/pancha-mahapurusha":{"post":{"tags":["Vedic"],"summary":"Yogas: Pancha Mahapurusha (5 great)","description":"5 Mahapurusha yogas: Ruchaka (Mars), Bhadra (Mercury), Hamsa (Jupiter), Malavya (Venus), Sasha (Saturn). Each formed when respective planet is in its own/exalted sign AND in a kendra (1/4/7/10).","operationId":"vedic_yogas_parashara_pancha-mahapurusha","x-quality":"green","x-source":"BPHS Adhyaya 36.36-40: clear pattern, well-cross-validated.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/yogas/parashara/pancha-mahapurusha \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/yogas/parashara/pancha-mahapurusha', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/yogas/parashara/pancha-mahapurusha',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/yogas/parashara/pancha-mahapurusha', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"school":{"type":"string","nullable":true},"lagnaSign":{"type":"number","nullable":true},"yogas":{"type":"array","items":{"type":"object","properties":{"yogaName":{"type":"string","nullable":true},"graha":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"present":{"type":"boolean","nullable":true},"sign":{"type":"number","nullable":true},"house":{"type":"number","nullable":true},"reason":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"presentCount":{"type":"number","nullable":true}}}}},"example":{"ok":true,"data":{"school":"parashara","lagnaSign":4,"yogas":[{"yogaName":"Ruchaka","graha":4,"planetName":"Mars","present":false,"sign":10,"house":7,"reason":"not in own/exalted sign (currently in sign 11)"}],"presentCount":0}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/yogas/parashara/gajakesari":{"post":{"tags":["Vedic"],"summary":"Yogas: Gajakesari","description":"Gajakesari Yoga: Jupiter in a kendra (1, 4, 7, 10) from Moon. One of the most-cited classical combinations.","operationId":"vedic_yogas_parashara_gajakesari","x-quality":"green","x-source":"BPHS Adhyaya 36.34: single-rule simple detection.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/yogas/parashara/gajakesari \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/yogas/parashara/gajakesari', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/yogas/parashara/gajakesari',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/yogas/parashara/gajakesari', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"yoga":{"type":"string","nullable":true},"school":{"type":"string","nullable":true},"present":{"type":"boolean","nullable":true},"contributingPlanets":{"type":"array","items":{"type":"object","properties":{"graha":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"details":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"yoga":"Gajakesari","school":"parashara","present":false,"contributingPlanets":[{"graha":1,"planetName":"Moon"},{"graha":5,"planetName":"Jupiter"}],"details":["Jupiter in house 6 from Moon (not kendra): Gajakesari not formed"]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/yogas/parashara/adhi":{"post":{"tags":["Vedic"],"summary":"Yogas: Adhi","description":"Adhi Yoga: benefics (Mercury, Venus, Jupiter) in 6th, 7th, 8th houses from Moon. Maha Adhi Yoga when all three benefics are positioned там. Powerful for status and prosperity.","operationId":"vedic_yogas_parashara_adhi","x-quality":"green","x-source":"BPHS Adhyaya 36.32.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/yogas/parashara/adhi \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/yogas/parashara/adhi', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/yogas/parashara/adhi',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/yogas/parashara/adhi', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"yoga":{"type":"string","nullable":true},"school":{"type":"string","nullable":true},"lagnaSign":{"type":"number","nullable":true},"present":{"type":"boolean","nullable":true},"contributingPlanets":{"type":"array","items":{"type":"object","properties":{"graha":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"sign":{"type":"number","nullable":true},"house":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"details":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"strength":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"yoga":"Adhi","school":"parashara","lagnaSign":4,"present":false,"contributingPlanets":[{"graha":5,"planetName":"Jupiter","sign":2,"house":11}],"details":["Jupiter in house 6 from Moon"],"strength":"partial"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/yogas/parashara/full":{"post":{"tags":["Vedic"],"summary":"Yogas: Parashara full report","description":"Combined Parashara yoga report: runs all 6 detectors (Raja/Dhana/Dharma-Karmadhipati/Pancha-Mahapurusha/Gajakesari/Adhi) and returns one structured response.","operationId":"vedic_yogas_parashara_full","x-quality":"green","x-source":"Composite: all 6 detectors GREEN per BPHS A.36-39.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/yogas/parashara/full \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/yogas/parashara/full', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/yogas/parashara/full',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/yogas/parashara/full', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"school":{"type":"string","nullable":true},"lagnaSign":{"type":"number","nullable":true},"raja":{"type":"object","properties":{"present":{"type":"boolean","nullable":true},"contributingPlanets":{"type":"array","items":{},"nullable":true},"details":{"type":"array","items":{},"nullable":true}},"nullable":true},"dhana":{"type":"object","properties":{"present":{"type":"boolean","nullable":true},"contributingPlanets":{"type":"array","items":{},"nullable":true},"details":{"type":"array","items":{},"nullable":true}},"nullable":true},"dharmaKarmadhipati":{"type":"object","properties":{"present":{"type":"boolean","nullable":true},"contributingPlanets":{"type":"array","items":{},"nullable":true},"details":{"type":"array","items":{},"nullable":true}},"nullable":true},"panchaMahapurusha":{"type":"object","properties":{"yogas":{"type":"array","items":{"type":"object","properties":{"yogaName":{"type":"string","nullable":true},"graha":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"present":{"type":"boolean","nullable":true},"sign":{"type":"number","nullable":true},"house":{"type":"number","nullable":true},"reason":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"presentCount":{"type":"number","nullable":true}},"nullable":true},"gajakesari":{"type":"object","properties":{"present":{"type":"boolean","nullable":true},"contributingPlanets":{"type":"array","items":{},"nullable":true},"details":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}},"nullable":true},"adhi":{"type":"object","properties":{"present":{"type":"boolean","nullable":true},"contributingPlanets":{"type":"array","items":{"type":"object","properties":{"graha":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"sign":{"type":"number","nullable":true},"house":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"details":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"strength":{"type":"string","nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"school":"parashara","lagnaSign":4,"raja":{"present":false,"contributingPlanets":[],"details":[]},"dhana":{"present":false,"contributingPlanets":[],"details":[]},"dharmaKarmadhipati":{"present":false,"contributingPlanets":[],"details":[]},"panchaMahapurusha":{"yogas":[{"yogaName":"Ruchaka","graha":4,"planetName":"Mars","present":false,"sign":10,"house":7,"reason":"not in own/exalted sign (currently in sign 11)"}],"presentCount":0},"gajakesari":{"present":false,"contributingPlanets":[],"details":["Jupiter in house 6 from Moon (not kendra): Gajakesari not formed"]},"adhi":{"present":false,"contributingPlanets":[{"graha":5,"planetName":"Jupiter","sign":2,"house":11}],"details":["Jupiter in house 6 from Moon"],"strength":"partial"}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/doshas/parashara/mangal":{"post":{"tags":["Vedic"],"summary":"Doshas: Mangal (Mars affliction)","description":"Mangal Dosha detection with school selection (`school` body param: `strict` BPHS verse 1/4/7/8/12 from Lagna only; `north` 1/2/4/7/8/12 from Lagna+Moon; `south` 1/2/4/7/8/12 from Lagna+Moon+Venus, default). Canonical sign-based cancellations applied: Mars in own (Aries/Scorpio) or exalted (Capricorn) sign cancels; per-house cancellations (house 2: Gemini/Virgo; house 4: Taurus/Libra; house 12: Taurus/Libra/Gemini/Virgo).","operationId":"vedic_doshas_parashara_mangal","x-quality":"green","x-source":"BPHS + Phaladeepika + Sanjay Rath. Three school conventions exposed via `school` parameter. Sign-based cancellations per AstroSight/HoraSarvam canon.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52,"school":"south"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/doshas/parashara/mangal \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52, \"school\": \"south\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/doshas/parashara/mangal', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52,\n    \"school\": \"south\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/doshas/parashara/mangal',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52,\n      'school': \"south\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/doshas/parashara/mangal', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n        'school' => 'south',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"dosha":{"type":"string","nullable":true},"school":{"type":"string","nullable":true},"mangalSchool":{"type":"string","nullable":true},"lagnaSign":{"type":"number","nullable":true},"present":{"type":"boolean","nullable":true},"severity":{"type":"string","nullable":true},"affectedHouses":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"contributingPlanets":{"type":"array","items":{"type":"object","properties":{"graha":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"sign":{"type":"number","nullable":true},"house":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"details":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"dosha":"Mangal","school":"parashara","mangalSchool":"south","lagnaSign":4,"present":true,"severity":"strong","affectedHouses":[7],"contributingPlanets":[{"graha":4,"planetName":"Mars","sign":10,"house":7}],"details":["School: south (houses checked: 1,2,4,7,8,12 from Lagna+Moon+Venus)"]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/doshas/parashara/kaal-sarp":{"post":{"tags":["Vedic"],"summary":"Doshas: Kaal Sarp","description":"Kaal Sarp Dosha: all 7 classical grahas on one side of the Rahu-Ketu axis. Returns 12 sub-types by Rahu house position (Anant=1H, Kulik=2H, Vasuki=3H, Shankhpal=4H, Padma=5H, Mahapadma=6H, Takshak=7H, Karkotak=8H, Shankhachud=9H, Ghatak=10H, Vishdhar=11H, Sheshnag=12H). Also `partial: true` flag when 6 of 7 grahas on one side.","operationId":"vedic_doshas_parashara_kaal-sarp","x-quality":"green","x-source":"Astro Arun Pandit + Eshwar Bhakti: 12 sub-types canonical naming + clear hemisphere check.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/doshas/parashara/kaal-sarp \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/doshas/parashara/kaal-sarp', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/doshas/parashara/kaal-sarp',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/doshas/parashara/kaal-sarp', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"dosha":{"type":"string","nullable":true},"school":{"type":"string","nullable":true},"present":{"type":"boolean","nullable":true},"subType":{"nullable":true},"partial":{"type":"boolean","nullable":true},"severity":{"type":"string","nullable":true},"affectedHouses":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"details":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"dosha":"Kaal Sarp","school":"parashara","present":false,"subType":null,"partial":false,"severity":"none","affectedHouses":[6,12],"details":["5 grahas on Rahu-side, 2 on Ketu-side: Kaal Sarp not formed"]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/doshas/parashara/pitru":{"post":{"tags":["Vedic"],"summary":"Doshas: Pitru (ancestral)","description":"Pitru Dosha: Sun + Rahu or Sun + Saturn conjunct, plus Sun in 9th house as auxiliary marker. Note: BPHS lists 14 patterns of Pitru Dosha; this endpoint detects 3 most-cited conjunction patterns. Full canonical detection (9th-lord placement, malefic in 9H) is not done yet.","operationId":"vedic_doshas_parashara_pitru","x-quality":"yellow","x-source":"BPHS + Saptarishis Astrology. Intrinsically multi-canonical-pattern (14 distinct BPHS patterns); we detect 3 most-common, document in response.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/doshas/parashara/pitru \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/doshas/parashara/pitru', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/doshas/parashara/pitru',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/doshas/parashara/pitru', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"dosha":{"type":"string","nullable":true},"school":{"type":"string","nullable":true},"lagnaSign":{"type":"number","nullable":true},"present":{"type":"boolean","nullable":true},"severity":{"type":"string","nullable":true},"affectedHouses":{"type":"array","items":{},"nullable":true},"contributingPlanets":{"type":"array","items":{},"nullable":true},"details":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"dosha":"Pitru","school":"parashara","lagnaSign":4,"present":false,"severity":"none","affectedHouses":[],"contributingPlanets":[],"details":["No Sun+Rahu/Saturn conjunction: Pitru Dosha not formed"]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/doshas/parashara/shrapit":{"post":{"tags":["Vedic"],"summary":"Doshas: Shrapit (curse)","description":"Shrapit Dosha: Saturn + Rahu conjunct in any sign. Signifies inherited curse/blockage in life.","operationId":"vedic_doshas_parashara_shrapit","x-quality":"green","x-source":"Standard Vedic definition: single conjunction check.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/doshas/parashara/shrapit \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/doshas/parashara/shrapit', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/doshas/parashara/shrapit',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/doshas/parashara/shrapit', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"dosha":{"type":"string","nullable":true},"school":{"type":"string","nullable":true},"lagnaSign":{"type":"number","nullable":true},"present":{"type":"boolean","nullable":true},"severity":{"type":"string","nullable":true},"affectedHouses":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"contributingPlanets":{"type":"array","items":{"type":"object","properties":{"graha":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"sign":{"type":"number","nullable":true},"house":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"details":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"dosha":"Shrapit","school":"parashara","lagnaSign":4,"present":true,"severity":"strong","affectedHouses":[6],"contributingPlanets":[{"graha":6,"planetName":"Saturn","sign":9,"house":6}],"details":["Saturn + Rahu conjunct in sign 10, house 6: Shrapit Dosha formed"]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/doshas/parashara/grahan":{"post":{"tags":["Vedic"],"summary":"Doshas: Grahan (eclipse-like)","description":"Grahan Dosha: Sun + Rahu/Ketu or Moon + Rahu/Ketu conjunct (eclipse-mimicking position). Up to 4 sub-patterns possible (Surya-Rahu / Surya-Ketu / Chandra-Rahu / Chandra-Ketu).","operationId":"vedic_doshas_parashara_grahan","x-quality":"green","x-source":"Standard Vedic eclipse-conjunction definition.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/doshas/parashara/grahan \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/doshas/parashara/grahan', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/doshas/parashara/grahan',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/doshas/parashara/grahan', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"dosha":{"type":"string","nullable":true},"school":{"type":"string","nullable":true},"lagnaSign":{"type":"number","nullable":true},"present":{"type":"boolean","nullable":true},"severity":{"type":"string","nullable":true},"affectedHouses":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"contributingPlanets":{"type":"array","items":{"type":"object","properties":{"graha":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"sign":{"type":"number","nullable":true},"house":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"details":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"dosha":"Grahan","school":"parashara","lagnaSign":4,"present":true,"severity":"moderate","affectedHouses":[6],"contributingPlanets":[{"graha":1,"planetName":"Moon","sign":9,"house":6}],"details":["Moon + Rahu conjunct in sign 10: Chandra-Rahu Grahan"]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/doshas/parashara/guru-chandal":{"post":{"tags":["Vedic"],"summary":"Doshas: Guru-Chandal","description":"Guru-Chandal Dosha: Jupiter + Rahu or Jupiter + Ketu conjunct. Wisdom-confusion affliction.","operationId":"vedic_doshas_parashara_guru-chandal","x-quality":"green","x-source":"Standard Vedic conjunction definition.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/doshas/parashara/guru-chandal \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/doshas/parashara/guru-chandal', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/doshas/parashara/guru-chandal',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/doshas/parashara/guru-chandal', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"dosha":{"type":"string","nullable":true},"school":{"type":"string","nullable":true},"lagnaSign":{"type":"number","nullable":true},"present":{"type":"boolean","nullable":true},"severity":{"type":"string","nullable":true},"affectedHouses":{"type":"array","items":{},"nullable":true},"contributingPlanets":{"type":"array","items":{},"nullable":true},"details":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"dosha":"Guru-Chandal","school":"parashara","lagnaSign":4,"present":false,"severity":"none","affectedHouses":[],"contributingPlanets":[],"details":["Jupiter not conjunct Rahu or Ketu: Guru-Chandal not formed"]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/doshas/parashara/full":{"post":{"tags":["Vedic"],"summary":"Doshas: Parashara full report","description":"Combined Parashara dosha report: runs all 6 detectors (Mangal/Kaal Sarp/Pitru/Shrapit/Grahan/Guru-Chandal).","operationId":"vedic_doshas_parashara_full","x-quality":"green","x-source":"Composite: 5 GREEN (Mangal, Kaal Sarp, Shrapit, Grahan, Guru-Chandal) + 1 honest YELLOW (Pitru, multi-canonical-pattern intrinsic).","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/doshas/parashara/full \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/doshas/parashara/full', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/doshas/parashara/full',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/doshas/parashara/full', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"school":{"type":"string","nullable":true},"lagnaSign":{"type":"number","nullable":true},"mangal":{"type":"object","properties":{"present":{"type":"boolean","nullable":true},"severity":{"type":"string","nullable":true},"affectedHouses":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"contributingPlanets":{"type":"array","items":{"type":"object","properties":{"graha":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"sign":{"type":"number","nullable":true},"house":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"details":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}},"nullable":true},"kaalSarp":{"type":"object","properties":{"present":{"type":"boolean","nullable":true},"subType":{"nullable":true},"partial":{"type":"boolean","nullable":true},"severity":{"type":"string","nullable":true},"affectedHouses":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"contributingPlanets":{"type":"array","items":{},"nullable":true},"details":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}},"nullable":true},"pitru":{"type":"object","properties":{"present":{"type":"boolean","nullable":true},"severity":{"type":"string","nullable":true},"affectedHouses":{"type":"array","items":{},"nullable":true},"contributingPlanets":{"type":"array","items":{},"nullable":true},"details":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}},"nullable":true},"shrapit":{"type":"object","properties":{"present":{"type":"boolean","nullable":true},"severity":{"type":"string","nullable":true},"affectedHouses":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"contributingPlanets":{"type":"array","items":{"type":"object","properties":{"graha":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"sign":{"type":"number","nullable":true},"house":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"details":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}},"nullable":true},"grahan":{"type":"object","properties":{"present":{"type":"boolean","nullable":true},"severity":{"type":"string","nullable":true},"affectedHouses":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"contributingPlanets":{"type":"array","items":{"type":"object","properties":{"graha":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"sign":{"type":"number","nullable":true},"house":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"details":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}},"nullable":true},"guruChandal":{"type":"object","properties":{"present":{"type":"boolean","nullable":true},"severity":{"type":"string","nullable":true},"affectedHouses":{"type":"array","items":{},"nullable":true},"contributingPlanets":{"type":"array","items":{},"nullable":true},"details":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"school":"parashara","lagnaSign":4,"mangal":{"present":true,"severity":"strong","affectedHouses":[7],"contributingPlanets":[{"graha":4,"planetName":"Mars","sign":10,"house":7}],"details":["School: south (houses checked: 1,2,4,7,8,12 from Lagna+Moon+Venus)"]},"kaalSarp":{"present":false,"subType":null,"partial":false,"severity":"none","affectedHouses":[6],"contributingPlanets":[],"details":["5 grahas on Rahu-side, 2 on Ketu-side: Kaal Sarp not formed"]},"pitru":{"present":false,"severity":"none","affectedHouses":[],"contributingPlanets":[],"details":["No Sun+Rahu/Saturn conjunction: Pitru Dosha not formed"]},"shrapit":{"present":true,"severity":"strong","affectedHouses":[6],"contributingPlanets":[{"graha":6,"planetName":"Saturn","sign":9,"house":6}],"details":["Saturn + Rahu conjunct in sign 10, house 6: Shrapit Dosha formed"]},"grahan":{"present":true,"severity":"moderate","affectedHouses":[6],"contributingPlanets":[{"graha":1,"planetName":"Moon","sign":9,"house":6}],"details":["Moon + Rahu conjunct in sign 10: Chandra-Rahu Grahan"]},"guruChandal":{"present":false,"severity":"none","affectedHouses":[],"contributingPlanets":[],"details":["Jupiter not conjunct Rahu or Ketu: Guru-Chandal not formed"]}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/compatibility/ashtakoot":{"post":{"tags":["Vedic"],"summary":"Compatibility: Ashtakoot Guna Milan (8-fold 36-point)","description":"Canonical 8-Kuta matchmaking out of 36 points: Varna(1) + Vashya(2) + Tara(3) + Yoni(4) + Graha-Maitri(5) + Gana(6) + Bhakoot(7) + Nadi(8). Threshold 18+ traditionally acceptable; 24+ good; 32+ excellent. Returns per-Kuta scores + Bhakoot/Nadi dosha flags + threshold verdict.","operationId":"vedic_compatibility_ashtakoot","x-quality":"green","x-source":"BPHS Adhyaya 39 + B.V.Raman *Muhurta* + Saravali + drikpanchang Kuta tables. Yoni table follows B.V.Raman canonical (lion-elephant, horse-buffalo, cow-tigress enemy pairs; horse-elephant, cow-buffalo friend pairs).","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwoChart"},"example":{"chart1":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52},"chart2":{"date":"1985-11-03","time":"09:15:00","timezone":"Europe/Kyiv","latitude":48.46,"longitude":35.04}}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/compatibility/ashtakoot \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"chart1\": { \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }, \"chart2\": { \"date\": \"1985-11-03\", \"time\": \"09:15:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 48.46, \"longitude\": 35.04 } }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/compatibility/ashtakoot', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"chart1\": {\n      \"date\": \"1990-05-15\",\n      \"time\": \"15:30:00\",\n      \"timezone\": \"Europe/Kyiv\",\n      \"latitude\": 50.45,\n      \"longitude\": 30.52\n    },\n    \"chart2\": {\n      \"date\": \"1985-11-03\",\n      \"time\": \"09:15:00\",\n      \"timezone\": \"Europe/Kyiv\",\n      \"latitude\": 48.46,\n      \"longitude\": 35.04\n    }\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/compatibility/ashtakoot',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'chart1': {\n        'date': \"1990-05-15\",\n        'time': \"15:30:00\",\n        'timezone': \"Europe/Kyiv\",\n        'latitude': 50.45,\n        'longitude': 30.52\n      },\n      'chart2': {\n        'date': \"1985-11-03\",\n        'time': \"09:15:00\",\n        'timezone': \"Europe/Kyiv\",\n        'latitude': 48.46,\n        'longitude': 35.04\n      }\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/compatibility/ashtakoot', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'chart1' => [\n            'date' => '1990-05-15',\n            'time' => '15:30:00',\n            'timezone' => 'Europe/Kyiv',\n            'latitude' => 50.45,\n            'longitude' => 30.52,\n        ],\n        'chart2' => [\n            'date' => '1985-11-03',\n            'time' => '09:15:00',\n            'timezone' => 'Europe/Kyiv',\n            'latitude' => 48.46,\n            'longitude' => 35.04,\n        ],\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"method":{"type":"string","nullable":true},"school":{"type":"string","nullable":true},"boy":{"type":"object","properties":{"moonLongitude":{"type":"number","nullable":true},"nakshatra":{"type":"number","nullable":true}},"nullable":true},"girl":{"type":"object","properties":{"moonLongitude":{"type":"number","nullable":true},"nakshatra":{"type":"number","nullable":true}},"nullable":true},"total":{"type":"number","nullable":true},"max":{"type":"number","nullable":true},"threshold":{"type":"string","nullable":true},"points":{"type":"object","properties":{"varna":{"type":"object","properties":{"score":{"type":"number","nullable":true},"max":{"type":"number","nullable":true},"boy":{"type":"string","nullable":true},"girl":{"type":"string","nullable":true},"rule":{"type":"string","nullable":true}},"nullable":true},"vashya":{"type":"object","properties":{"score":{"type":"number","nullable":true},"max":{"type":"number","nullable":true},"boyGroup":{"type":"string","nullable":true},"girlGroup":{"type":"string","nullable":true}},"nullable":true},"tara":{"type":"object","properties":{"score":{"type":"number","nullable":true},"max":{"type":"number","nullable":true},"fromBoyToGirl":{"type":"number","nullable":true},"fromGirlToBoy":{"type":"number","nullable":true}},"nullable":true},"yoni":{"type":"object","properties":{"score":{"type":"number","nullable":true},"max":{"type":"number","nullable":true},"boyYoni":{"type":"string","nullable":true},"girlYoni":{"type":"string","nullable":true},"relationship":{"type":"string","nullable":true}},"nullable":true},"grahaMaitri":{"type":"object","properties":{"score":{"type":"number","nullable":true},"max":{"type":"number","nullable":true},"boyRuler":{"type":"string","nullable":true},"girlRuler":{"type":"string","nullable":true},"relationship":{"type":"string","nullable":true}},"nullable":true},"gana":{"type":"object","properties":{"score":{"type":"number","nullable":true},"max":{"type":"number","nullable":true},"boyGana":{"type":"string","nullable":true},"girlGana":{"type":"string","nullable":true}},"nullable":true},"bhakoot":{"type":"object","properties":{"score":{"type":"number","nullable":true},"max":{"type":"number","nullable":true},"fromBoyToGirl":{"type":"number","nullable":true},"fromGirlToBoy":{"type":"number","nullable":true},"dosha":{"type":"string","nullable":true}},"nullable":true},"nadi":{"type":"object","properties":{"score":{"type":"number","nullable":true},"max":{"type":"number","nullable":true},"boyNadi":{"type":"string","nullable":true},"girlNadi":{"type":"string","nullable":true},"dosha":{"nullable":true},"cancelled":{"nullable":true}},"nullable":true}},"nullable":true},"doshas":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"recommendation":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"method":"ashtakoot","school":"parashara","boy":{"moonLongitude":273.178879897163,"nakshatra":21},"girl":{"moonLongitude":77.32226130757923,"nakshatra":6},"total":24,"max":36,"threshold":"good","points":{"varna":{"score":1,"max":1,"boy":"vaishya","girl":"shudra","rule":"boy varna >= girl varna → 1pt"},"vashya":{"score":1.5,"max":2,"boyGroup":"jalachara","girlGroup":"manava"},"tara":{"score":1.5,"max":3,"fromBoyToGirl":3,"fromGirlToBoy":6},"yoni":{"score":2,"max":4,"boyYoni":"mongoose","girlYoni":"dog","relationship":"neutral"},"grahaMaitri":{"score":4,"max":5,"boyRuler":"Saturn","girlRuler":"Mercury","relationship":"F-N"},"gana":{"score":6,"max":6,"boyGana":"manushya","girlGana":"manushya"},"bhakoot":{"score":0,"max":7,"fromBoyToGirl":6,"fromGirlToBoy":8,"dosha":"6-8"},"nadi":{"score":8,"max":8,"boyNadi":"antya","girlNadi":"adi","dosha":null,"cancelled":null}},"doshas":["Bhakoot Dosha: 6-8"],"recommendation":"good (24/36), note: Bhakoot Dosha: 6-8; cancellation rules may apply (same-Moon-sign or same-nakshatra exempts Nadi)."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/compatibility/dashakoota":{"post":{"tags":["Vedic"],"summary":"Compatibility: Dashakoota (10-fold 39-point)","description":"Extended matchmaking adding Mahendra(2) + Vedha(1) on top of Ashtakoot 36 = 39 max. Mahendra: birth-star count 4/7/10/13/16/19/22/25 → 2pt; else 0. Vedha: 13 canonical mutually-obstructing nakshatra pairs → 0pt blocked, 1pt clear.","operationId":"vedic_compatibility_dashakoota","x-quality":"green","x-source":"Hora Sara + B.V.Raman + findyourfate/cafeastrology Vedha canonical 13-pair list. Mahendra: standard 4/7/10/13/16/19/22/25 distance set.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwoChart"},"example":{"chart1":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52},"chart2":{"date":"1985-11-03","time":"09:15:00","timezone":"Europe/Kyiv","latitude":48.46,"longitude":35.04}}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/compatibility/dashakoota \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"chart1\": { \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }, \"chart2\": { \"date\": \"1985-11-03\", \"time\": \"09:15:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 48.46, \"longitude\": 35.04 } }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/compatibility/dashakoota', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"chart1\": {\n      \"date\": \"1990-05-15\",\n      \"time\": \"15:30:00\",\n      \"timezone\": \"Europe/Kyiv\",\n      \"latitude\": 50.45,\n      \"longitude\": 30.52\n    },\n    \"chart2\": {\n      \"date\": \"1985-11-03\",\n      \"time\": \"09:15:00\",\n      \"timezone\": \"Europe/Kyiv\",\n      \"latitude\": 48.46,\n      \"longitude\": 35.04\n    }\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/compatibility/dashakoota',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'chart1': {\n        'date': \"1990-05-15\",\n        'time': \"15:30:00\",\n        'timezone': \"Europe/Kyiv\",\n        'latitude': 50.45,\n        'longitude': 30.52\n      },\n      'chart2': {\n        'date': \"1985-11-03\",\n        'time': \"09:15:00\",\n        'timezone': \"Europe/Kyiv\",\n        'latitude': 48.46,\n        'longitude': 35.04\n      }\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/compatibility/dashakoota', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'chart1' => [\n            'date' => '1990-05-15',\n            'time' => '15:30:00',\n            'timezone' => 'Europe/Kyiv',\n            'latitude' => 50.45,\n            'longitude' => 30.52,\n        ],\n        'chart2' => [\n            'date' => '1985-11-03',\n            'time' => '09:15:00',\n            'timezone' => 'Europe/Kyiv',\n            'latitude' => 48.46,\n            'longitude' => 35.04,\n        ],\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"method":{"type":"string","nullable":true},"school":{"type":"string","nullable":true},"boy":{"type":"object","properties":{"moonLongitude":{"type":"number","nullable":true},"nakshatra":{"type":"number","nullable":true}},"nullable":true},"girl":{"type":"object","properties":{"moonLongitude":{"type":"number","nullable":true},"nakshatra":{"type":"number","nullable":true}},"nullable":true},"total":{"type":"number","nullable":true},"max":{"type":"number","nullable":true},"threshold":{"type":"string","nullable":true},"points":{"type":"object","properties":{"varna":{"type":"object","properties":{"score":{"type":"number","nullable":true},"max":{"type":"number","nullable":true},"boy":{"type":"string","nullable":true},"girl":{"type":"string","nullable":true},"rule":{"type":"string","nullable":true}},"nullable":true},"vashya":{"type":"object","properties":{"score":{"type":"number","nullable":true},"max":{"type":"number","nullable":true},"boyGroup":{"type":"string","nullable":true},"girlGroup":{"type":"string","nullable":true}},"nullable":true},"tara":{"type":"object","properties":{"score":{"type":"number","nullable":true},"max":{"type":"number","nullable":true},"fromBoyToGirl":{"type":"number","nullable":true},"fromGirlToBoy":{"type":"number","nullable":true}},"nullable":true},"yoni":{"type":"object","properties":{"score":{"type":"number","nullable":true},"max":{"type":"number","nullable":true},"boyYoni":{"type":"string","nullable":true},"girlYoni":{"type":"string","nullable":true},"relationship":{"type":"string","nullable":true}},"nullable":true},"grahaMaitri":{"type":"object","properties":{"score":{"type":"number","nullable":true},"max":{"type":"number","nullable":true},"boyRuler":{"type":"string","nullable":true},"girlRuler":{"type":"string","nullable":true},"relationship":{"type":"string","nullable":true}},"nullable":true},"gana":{"type":"object","properties":{"score":{"type":"number","nullable":true},"max":{"type":"number","nullable":true},"boyGana":{"type":"string","nullable":true},"girlGana":{"type":"string","nullable":true}},"nullable":true},"bhakoot":{"type":"object","properties":{"score":{"type":"number","nullable":true},"max":{"type":"number","nullable":true},"fromBoyToGirl":{"type":"number","nullable":true},"fromGirlToBoy":{"type":"number","nullable":true},"dosha":{"type":"string","nullable":true}},"nullable":true},"nadi":{"type":"object","properties":{"score":{"type":"number","nullable":true},"max":{"type":"number","nullable":true},"boyNadi":{"type":"string","nullable":true},"girlNadi":{"type":"string","nullable":true},"dosha":{"nullable":true},"cancelled":{"nullable":true}},"nullable":true}},"nullable":true},"doshas":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"recommendation":{"type":"string","nullable":true},"mahendra":{"type":"object","properties":{"score":{"type":"number","nullable":true},"max":{"type":"number","nullable":true},"distance":{"type":"number","nullable":true}},"nullable":true},"vedha":{"type":"object","properties":{"score":{"type":"number","nullable":true},"max":{"type":"number","nullable":true},"blocked":{"type":"boolean","nullable":true}},"nullable":true},"dashakootaTotal":{"type":"number","nullable":true},"dashakootaMax":{"type":"number","nullable":true}}}}},"example":{"ok":true,"data":{"method":"dashakoota","school":"parashara","boy":{"moonLongitude":273.178879897163,"nakshatra":21},"girl":{"moonLongitude":77.32226130757923,"nakshatra":6},"total":24,"max":36,"threshold":"good","points":{"varna":{"score":1,"max":1,"boy":"vaishya","girl":"shudra","rule":"boy varna >= girl varna → 1pt"},"vashya":{"score":1.5,"max":2,"boyGroup":"jalachara","girlGroup":"manava"},"tara":{"score":1.5,"max":3,"fromBoyToGirl":3,"fromGirlToBoy":6},"yoni":{"score":2,"max":4,"boyYoni":"mongoose","girlYoni":"dog","relationship":"neutral"},"grahaMaitri":{"score":4,"max":5,"boyRuler":"Saturn","girlRuler":"Mercury","relationship":"F-N"},"gana":{"score":6,"max":6,"boyGana":"manushya","girlGana":"manushya"},"bhakoot":{"score":0,"max":7,"fromBoyToGirl":6,"fromGirlToBoy":8,"dosha":"6-8"},"nadi":{"score":8,"max":8,"boyNadi":"antya","girlNadi":"adi","dosha":null,"cancelled":null}},"doshas":["Bhakoot Dosha: 6-8"],"recommendation":"good (24/36), note: Bhakoot Dosha: 6-8; cancellation rules may apply (same-Moon-sign or same-nakshatra exempts Nadi).","mahendra":{"score":2,"max":2,"distance":13},"vedha":{"score":1,"max":1,"blocked":false},"dashakootaTotal":27,"dashakootaMax":39}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/compatibility/manglik-check":{"post":{"tags":["Vedic"],"summary":"Compatibility: Manglik check (single chart)","description":"Detects Manglik status for a single chart with school selection (strict/north/south, default south). Same canon as `/vedic/doshas/parashara/mangal`; surfaced here in compatibility context for matchmaking flows.","operationId":"vedic_compatibility_manglik-check","x-quality":"green","x-source":"Wraps Mangal Dosha detector; same BPHS/Phaladeepika cancellation rules.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52,"school":"south"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/compatibility/manglik-check \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52, \"school\": \"south\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/compatibility/manglik-check', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52,\n    \"school\": \"south\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/compatibility/manglik-check',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52,\n      'school': \"south\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/compatibility/manglik-check', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n        'school' => 'south',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"method":{"type":"string","nullable":true},"school":{"type":"string","nullable":true},"mangalSchool":{"type":"string","nullable":true},"lagnaSign":{"type":"number","nullable":true},"manglik":{"type":"boolean","nullable":true},"severity":{"type":"string","nullable":true},"present":{"type":"boolean","nullable":true},"affectedHouses":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"contributingPlanets":{"type":"array","items":{"type":"object","properties":{"graha":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"sign":{"type":"number","nullable":true},"house":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"details":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"method":"manglik-check","school":"parashara","mangalSchool":"south","lagnaSign":4,"manglik":true,"severity":"strong","present":true,"affectedHouses":[7],"contributingPlanets":[{"graha":4,"planetName":"Mars","sign":10,"house":7}],"details":["School: south (houses checked: 1,2,4,7,8,12 from Lagna+Moon+Venus)"]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/compatibility/mangal-match":{"post":{"tags":["Vedic"],"summary":"Compatibility: Mangal-match (Manglik between partners)","description":"Compares Manglik status of both partners and applies BPHS A.39 cancellation rule: if both partners are Manglik, the dosha is mutually cancelled. Returns verdict {compatible|cancelled|incompatible}.","operationId":"vedic_compatibility_mangal-match","x-quality":"green","x-source":"BPHS Adhyaya 39 cancellation rule.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwoChart"},"example":{"chart1":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52},"chart2":{"date":"1985-11-03","time":"09:15:00","timezone":"Europe/Kyiv","latitude":48.46,"longitude":35.04}}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/compatibility/mangal-match \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"chart1\": { \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }, \"chart2\": { \"date\": \"1985-11-03\", \"time\": \"09:15:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 48.46, \"longitude\": 35.04 } }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/compatibility/mangal-match', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"chart1\": {\n      \"date\": \"1990-05-15\",\n      \"time\": \"15:30:00\",\n      \"timezone\": \"Europe/Kyiv\",\n      \"latitude\": 50.45,\n      \"longitude\": 30.52\n    },\n    \"chart2\": {\n      \"date\": \"1985-11-03\",\n      \"time\": \"09:15:00\",\n      \"timezone\": \"Europe/Kyiv\",\n      \"latitude\": 48.46,\n      \"longitude\": 35.04\n    }\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/compatibility/mangal-match',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'chart1': {\n        'date': \"1990-05-15\",\n        'time': \"15:30:00\",\n        'timezone': \"Europe/Kyiv\",\n        'latitude': 50.45,\n        'longitude': 30.52\n      },\n      'chart2': {\n        'date': \"1985-11-03\",\n        'time': \"09:15:00\",\n        'timezone': \"Europe/Kyiv\",\n        'latitude': 48.46,\n        'longitude': 35.04\n      }\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/compatibility/mangal-match', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'chart1' => [\n            'date' => '1990-05-15',\n            'time' => '15:30:00',\n            'timezone' => 'Europe/Kyiv',\n            'latitude' => 50.45,\n            'longitude' => 30.52,\n        ],\n        'chart2' => [\n            'date' => '1985-11-03',\n            'time' => '09:15:00',\n            'timezone' => 'Europe/Kyiv',\n            'latitude' => 48.46,\n            'longitude' => 35.04,\n        ],\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"method":{"type":"string","nullable":true},"school":{"type":"string","nullable":true},"mangalSchool":{"type":"string","nullable":true},"verdict":{"type":"string","nullable":true},"explanation":{"type":"string","nullable":true},"partner1":{"type":"object","properties":{"manglik":{"type":"boolean","nullable":true},"severity":{"type":"string","nullable":true},"affectedHouses":{"type":"array","items":{"type":"number","nullable":true},"nullable":true}},"nullable":true},"partner2":{"type":"object","properties":{"manglik":{"type":"boolean","nullable":true},"severity":{"type":"string","nullable":true},"affectedHouses":{"type":"array","items":{"type":"number","nullable":true},"nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"method":"mangal-match","school":"parashara","mangalSchool":"south","verdict":"cancelled","explanation":"Both partners are Manglik: per BPHS A.39, the dosha is mutually cancelled.","partner1":{"manglik":true,"severity":"strong","affectedHouses":[7]},"partner2":{"manglik":true,"severity":"moderate","affectedHouses":[4]}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/compatibility/bhrigu-match":{"post":{"tags":["Vedic"],"summary":"Compatibility: Bhrigu-match (7H placement)","description":"Bhrigu Sanhita-style structured 7th-house planetary placement summary for both partners. Counts benefic/malefic planets in each partner's 7H from Lagna and labels status {beneficial|challenging|neutral}. NOT a numerical match score.","operationId":"vedic_compatibility_bhrigu-match","x-quality":"yellow","x-source":"Bhrigu Sanhita is single-tradition (no canonical text, guru-shishya only); this endpoint provides structured 7H placement only, not a numerical match score.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwoChart"},"example":{"chart1":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52},"chart2":{"date":"1985-11-03","time":"09:15:00","timezone":"Europe/Kyiv","latitude":48.46,"longitude":35.04}}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/compatibility/bhrigu-match \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"chart1\": { \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }, \"chart2\": { \"date\": \"1985-11-03\", \"time\": \"09:15:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 48.46, \"longitude\": 35.04 } }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/compatibility/bhrigu-match', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"chart1\": {\n      \"date\": \"1990-05-15\",\n      \"time\": \"15:30:00\",\n      \"timezone\": \"Europe/Kyiv\",\n      \"latitude\": 50.45,\n      \"longitude\": 30.52\n    },\n    \"chart2\": {\n      \"date\": \"1985-11-03\",\n      \"time\": \"09:15:00\",\n      \"timezone\": \"Europe/Kyiv\",\n      \"latitude\": 48.46,\n      \"longitude\": 35.04\n    }\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/compatibility/bhrigu-match',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'chart1': {\n        'date': \"1990-05-15\",\n        'time': \"15:30:00\",\n        'timezone': \"Europe/Kyiv\",\n        'latitude': 50.45,\n        'longitude': 30.52\n      },\n      'chart2': {\n        'date': \"1985-11-03\",\n        'time': \"09:15:00\",\n        'timezone': \"Europe/Kyiv\",\n        'latitude': 48.46,\n        'longitude': 35.04\n      }\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/compatibility/bhrigu-match', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'chart1' => [\n            'date' => '1990-05-15',\n            'time' => '15:30:00',\n            'timezone' => 'Europe/Kyiv',\n            'latitude' => 50.45,\n            'longitude' => 30.52,\n        ],\n        'chart2' => [\n            'date' => '1985-11-03',\n            'time' => '09:15:00',\n            'timezone' => 'Europe/Kyiv',\n            'latitude' => 48.46,\n            'longitude' => 35.04,\n        ],\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"method":{"type":"string","nullable":true},"school":{"type":"string","nullable":true},"partner1":{"type":"object","properties":{"lagnaSign":{"type":"number","nullable":true},"seventhHouse":{"type":"array","items":{"type":"object","properties":{"graha":{"type":"number","nullable":true},"sign":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"score":{"type":"number","nullable":true},"status":{"type":"string","nullable":true}},"nullable":true},"partner2":{"type":"object","properties":{"lagnaSign":{"type":"number","nullable":true},"seventhHouse":{"type":"array","items":{},"nullable":true},"score":{"type":"number","nullable":true},"status":{"type":"string","nullable":true}},"nullable":true},"summary":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"method":"bhrigu-match","school":"parashara","partner1":{"lagnaSign":4,"seventhHouse":[{"graha":4,"sign":10}],"score":-1,"status":"challenging"},"partner2":{"lagnaSign":7,"seventhHouse":[],"score":0,"status":"neutral"},"summary":"Partner 1 7H: challenging; Partner 2 7H: neutral.","disclaimer":"Bhrigu Sanhita is an oral guru-shishya tradition without canonical text; this endpoint provides structured 7H placement only."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/compatibility/full":{"post":{"tags":["Vedic"],"summary":"Compatibility: Parashara full report","description":"Combined matchmaking response: Ashtakoot total + threshold + Manglik check for both partners + per-Kuta sub-scores + recommendation in one call.","operationId":"vedic_compatibility_full","x-quality":"green","x-source":"Composite: Ashtakoot (GREEN) + Manglik (GREEN) + Bhrigu summary (YELLOW intrinsic).","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwoChart"},"example":{"chart1":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52},"chart2":{"date":"1985-11-03","time":"09:15:00","timezone":"Europe/Kyiv","latitude":48.46,"longitude":35.04}}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/compatibility/full \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"chart1\": { \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }, \"chart2\": { \"date\": \"1985-11-03\", \"time\": \"09:15:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 48.46, \"longitude\": 35.04 } }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/compatibility/full', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"chart1\": {\n      \"date\": \"1990-05-15\",\n      \"time\": \"15:30:00\",\n      \"timezone\": \"Europe/Kyiv\",\n      \"latitude\": 50.45,\n      \"longitude\": 30.52\n    },\n    \"chart2\": {\n      \"date\": \"1985-11-03\",\n      \"time\": \"09:15:00\",\n      \"timezone\": \"Europe/Kyiv\",\n      \"latitude\": 48.46,\n      \"longitude\": 35.04\n    }\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/compatibility/full',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'chart1': {\n        'date': \"1990-05-15\",\n        'time': \"15:30:00\",\n        'timezone': \"Europe/Kyiv\",\n        'latitude': 50.45,\n        'longitude': 30.52\n      },\n      'chart2': {\n        'date': \"1985-11-03\",\n        'time': \"09:15:00\",\n        'timezone': \"Europe/Kyiv\",\n        'latitude': 48.46,\n        'longitude': 35.04\n      }\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/compatibility/full', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'chart1' => [\n            'date' => '1990-05-15',\n            'time' => '15:30:00',\n            'timezone' => 'Europe/Kyiv',\n            'latitude' => 50.45,\n            'longitude' => 30.52,\n        ],\n        'chart2' => [\n            'date' => '1985-11-03',\n            'time' => '09:15:00',\n            'timezone' => 'Europe/Kyiv',\n            'latitude' => 48.46,\n            'longitude' => 35.04,\n        ],\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"method":{"type":"string","nullable":true},"school":{"type":"string","nullable":true},"ashtakoot":{"type":"object","properties":{"total":{"type":"number","nullable":true},"threshold":{"type":"string","nullable":true},"doshas":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}},"nullable":true},"manglik":{"type":"object","properties":{"partner1":{"type":"boolean","nullable":true},"partner2":{"type":"boolean","nullable":true},"verdict":{"type":"string","nullable":true}},"nullable":true},"points":{"type":"object","properties":{"varna":{"type":"object","properties":{"score":{"type":"number","nullable":true},"max":{"type":"number","nullable":true},"boy":{"type":"string","nullable":true},"girl":{"type":"string","nullable":true},"rule":{"type":"string","nullable":true}},"nullable":true},"vashya":{"type":"object","properties":{"score":{"type":"number","nullable":true},"max":{"type":"number","nullable":true},"boyGroup":{"type":"string","nullable":true},"girlGroup":{"type":"string","nullable":true}},"nullable":true},"tara":{"type":"object","properties":{"score":{"type":"number","nullable":true},"max":{"type":"number","nullable":true},"fromBoyToGirl":{"type":"number","nullable":true},"fromGirlToBoy":{"type":"number","nullable":true}},"nullable":true},"yoni":{"type":"object","properties":{"score":{"type":"number","nullable":true},"max":{"type":"number","nullable":true},"boyYoni":{"type":"string","nullable":true},"girlYoni":{"type":"string","nullable":true},"relationship":{"type":"string","nullable":true}},"nullable":true},"grahaMaitri":{"type":"object","properties":{"score":{"type":"number","nullable":true},"max":{"type":"number","nullable":true},"boyRuler":{"type":"string","nullable":true},"girlRuler":{"type":"string","nullable":true},"relationship":{"type":"string","nullable":true}},"nullable":true},"gana":{"type":"object","properties":{"score":{"type":"number","nullable":true},"max":{"type":"number","nullable":true},"boyGana":{"type":"string","nullable":true},"girlGana":{"type":"string","nullable":true}},"nullable":true},"bhakoot":{"type":"object","properties":{"score":{"type":"number","nullable":true},"max":{"type":"number","nullable":true},"fromBoyToGirl":{"type":"number","nullable":true},"fromGirlToBoy":{"type":"number","nullable":true},"dosha":{"type":"string","nullable":true}},"nullable":true},"nadi":{"type":"object","properties":{"score":{"type":"number","nullable":true},"max":{"type":"number","nullable":true},"boyNadi":{"type":"string","nullable":true},"girlNadi":{"type":"string","nullable":true},"dosha":{"nullable":true},"cancelled":{"nullable":true}},"nullable":true}},"nullable":true},"recommendation":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"method":"compatibility-full","school":"parashara","ashtakoot":{"total":24,"threshold":"good","doshas":["Bhakoot Dosha: 6-8"]},"manglik":{"partner1":true,"partner2":true,"verdict":"cancelled"},"points":{"varna":{"score":1,"max":1,"boy":"vaishya","girl":"shudra","rule":"boy varna >= girl varna → 1pt"},"vashya":{"score":1.5,"max":2,"boyGroup":"jalachara","girlGroup":"manava"},"tara":{"score":1.5,"max":3,"fromBoyToGirl":3,"fromGirlToBoy":6},"yoni":{"score":2,"max":4,"boyYoni":"mongoose","girlYoni":"dog","relationship":"neutral"},"grahaMaitri":{"score":4,"max":5,"boyRuler":"Saturn","girlRuler":"Mercury","relationship":"F-N"},"gana":{"score":6,"max":6,"boyGana":"manushya","girlGana":"manushya"},"bhakoot":{"score":0,"max":7,"fromBoyToGirl":6,"fromGirlToBoy":8,"dosha":"6-8"},"nadi":{"score":8,"max":8,"boyNadi":"antya","girlNadi":"adi","dosha":null,"cancelled":null}},"recommendation":"good (24/36), note: Bhakoot Dosha: 6-8; cancellation rules may apply (same-Moon-sign or same-nakshatra exempts Nadi)."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/muhurat/marriage":{"post":{"tags":["Vedic"],"summary":"Muhurat: Marriage (Vivah)","description":"Auspicious-window scanner for marriage (Vivah Muhurat) over a date range. Scores each day by Tithi + Vara + Nakshatra + Yoga + Karana per Muhurta Chintamani Adhyaya 5 + B.V.Raman *Muhurta* Ch.6. Preferred nakshatras: Rohini/Mrigashira/Magha/Hasta/Swati/Anuradha/Mula/U.Phalguni/U.Ashadha/U.Bhadrapada/Revati. Avoid Sun/Tue/Sat. Returns top-N days sorted by score with per-day Abhijit Muhurat sub-window.","operationId":"vedic_muhurat_marriage","x-quality":"green","x-source":"Muhurta Chintamani Adh.5 + B.V.Raman *Muhurta* Ch.6 + drikpanchang Vivah tables.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MuhuratWindow"},"example":{"search_window_start":"2026-05-15","search_window_end":"2026-05-31","latitude":28.61,"longitude":77.21,"timezoneOffset":5.5,"topN":10}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/muhurat/marriage \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"search_window_start\": \"2026-05-15\", \"search_window_end\": \"2026-05-31\", \"latitude\": 28.61, \"longitude\": 77.21, \"timezoneOffset\": 5.5, \"topN\": 10 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/muhurat/marriage', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"search_window_start\": \"2026-05-15\",\n    \"search_window_end\": \"2026-05-31\",\n    \"latitude\": 28.61,\n    \"longitude\": 77.21,\n    \"timezoneOffset\": 5.5,\n    \"topN\": 10\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/muhurat/marriage',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'search_window_start': \"2026-05-15\",\n      'search_window_end': \"2026-05-31\",\n      'latitude': 28.61,\n      'longitude': 77.21,\n      'timezoneOffset': 5.5,\n      'topN': 10\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/muhurat/marriage', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'search_window_start' => '2026-05-15',\n        'search_window_end' => '2026-05-31',\n        'latitude' => 28.61,\n        'longitude' => 77.21,\n        'timezoneOffset' => 5.5,\n        'topN' => 10,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"activity":{"type":"string","nullable":true},"search_window":{"type":"object","properties":{"start":{"type":"string","nullable":true},"end":{"type":"string","nullable":true},"daysScanned":{"type":"number","nullable":true}},"nullable":true},"location":{"type":"object","properties":{"latitude":{"type":"number","nullable":true},"longitude":{"type":"number","nullable":true},"timezoneOffset":{"type":"number","nullable":true}},"nullable":true},"ayanamsa":{"type":"number","nullable":true},"auspiciousWindows":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string","nullable":true},"weekday":{"type":"number","nullable":true},"weekdayName":{"type":"string","nullable":true},"panchang":{"type":"object","properties":{"tithi":{"type":"number","nullable":true},"tithiName":{"type":"string","nullable":true},"paksha":{"type":"string","nullable":true},"vara":{"type":"number","nullable":true},"varaName":{"type":"string","nullable":true},"nakshatra":{"type":"number","nullable":true},"nakshatraName":{"type":"string","nullable":true},"yoga":{"type":"number","nullable":true},"yogaName":{"type":"string","nullable":true},"karana":{"type":"string","nullable":true},"karanaIndex":{"type":"number","nullable":true},"pada":{"type":"number","nullable":true}},"nullable":true},"abhijitMuhurat":{"type":"object","properties":{"startTime":{"type":"string","nullable":true},"endTime":{"type":"string","nullable":true},"midHour":{"type":"number","nullable":true}},"nullable":true},"score":{"type":"number","nullable":true},"rating":{"type":"string","nullable":true},"factors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string","nullable":true},"delta":{"type":"number","nullable":true},"note":{"type":"string","nullable":true}},"nullable":true},"nullable":true}},"nullable":true},"nullable":true},"nextAuspiciousWindow":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"activity":"marriage","search_window":{"start":"2026-05-15","end":"2026-05-31","daysScanned":17},"location":{"latitude":28.61,"longitude":77.21,"timezoneOffset":5.5},"ayanamsa":24.225448485258198,"auspiciousWindows":[{"date":"2026-05-29","weekday":5,"weekdayName":"Shukravara","panchang":{"tithi":13,"tithiName":"Trayodashi","paksha":"shukla","vara":5,"varaName":"Shukravara","nakshatra":15,"nakshatraName":"Swati","yoga":22,"yogaName":"Sadhya","karana":"Taitila","karanaIndex":26,"pada":4},"abhijitMuhurat":{"startTime":"11:51:03","endTime":"12:46:17","midHour":12.311103828251362},"score":9,"rating":"excellent","factors":[{"field":"nakshatra","delta":3,"note":"Swati: auspicious for marriage"}]}],"nextAuspiciousWindow":"2026-05-29"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/muhurat/vehicle-purchase":{"post":{"tags":["Vedic"],"summary":"Muhurat: Vehicle purchase","description":"Auspicious-window scanner for buying a new vehicle. Preferred nakshatras: Ashwini/Pushya/Hasta/Chitra/Anuradha/Revati/U.Phalguni/U.Ashadha/U.Bhadrapada/Sravana. Avoid Sun/Sat. Same scoring shape as /vedic/muhurat/marriage.","operationId":"vedic_muhurat_vehicle-purchase","x-quality":"green","x-source":"Drik Panchang Vahana Muhurat tables + Muhurta Chintamani Adh.10.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MuhuratWindow"},"example":{"search_window_start":"2026-05-15","search_window_end":"2026-06-15","latitude":28.61,"longitude":77.21,"timezoneOffset":5.5}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/muhurat/vehicle-purchase \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"search_window_start\": \"2026-05-15\", \"search_window_end\": \"2026-06-15\", \"latitude\": 28.61, \"longitude\": 77.21, \"timezoneOffset\": 5.5 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/muhurat/vehicle-purchase', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"search_window_start\": \"2026-05-15\",\n    \"search_window_end\": \"2026-06-15\",\n    \"latitude\": 28.61,\n    \"longitude\": 77.21,\n    \"timezoneOffset\": 5.5\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/muhurat/vehicle-purchase',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'search_window_start': \"2026-05-15\",\n      'search_window_end': \"2026-06-15\",\n      'latitude': 28.61,\n      'longitude': 77.21,\n      'timezoneOffset': 5.5\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/muhurat/vehicle-purchase', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'search_window_start' => '2026-05-15',\n        'search_window_end' => '2026-06-15',\n        'latitude' => 28.61,\n        'longitude' => 77.21,\n        'timezoneOffset' => 5.5,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"activity":{"type":"string","nullable":true},"search_window":{"type":"object","properties":{"start":{"type":"string","nullable":true},"end":{"type":"string","nullable":true},"daysScanned":{"type":"number","nullable":true}},"nullable":true},"location":{"type":"object","properties":{"latitude":{"type":"number","nullable":true},"longitude":{"type":"number","nullable":true},"timezoneOffset":{"type":"number","nullable":true}},"nullable":true},"ayanamsa":{"type":"number","nullable":true},"auspiciousWindows":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string","nullable":true},"weekday":{"type":"number","nullable":true},"weekdayName":{"type":"string","nullable":true},"panchang":{"type":"object","properties":{"tithi":{"type":"number","nullable":true},"tithiName":{"type":"string","nullable":true},"paksha":{"type":"string","nullable":true},"vara":{"type":"number","nullable":true},"varaName":{"type":"string","nullable":true},"nakshatra":{"type":"number","nullable":true},"nakshatraName":{"type":"string","nullable":true},"yoga":{"type":"number","nullable":true},"yogaName":{"type":"string","nullable":true},"karana":{"type":"string","nullable":true},"karanaIndex":{"type":"number","nullable":true},"pada":{"type":"number","nullable":true}},"nullable":true},"abhijitMuhurat":{"type":"object","properties":{"startTime":{"type":"string","nullable":true},"endTime":{"type":"string","nullable":true},"midHour":{"type":"number","nullable":true}},"nullable":true},"score":{"type":"number","nullable":true},"rating":{"type":"string","nullable":true},"factors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string","nullable":true},"delta":{"type":"number","nullable":true},"note":{"type":"string","nullable":true}},"nullable":true},"nullable":true}},"nullable":true},"nullable":true},"nextAuspiciousWindow":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"activity":"vehicle-purchase","search_window":{"start":"2026-05-15","end":"2026-06-15","daysScanned":32},"location":{"latitude":28.61,"longitude":77.21,"timezoneOffset":5.5},"ayanamsa":24.225448485258198,"auspiciousWindows":[{"date":"2026-05-21","weekday":4,"weekdayName":"Guruvara","panchang":{"tithi":5,"tithiName":"Panchami","paksha":"shukla","vara":4,"varaName":"Guruvara","nakshatra":8,"nakshatraName":"Pushya","yoga":14,"yogaName":"Harshana","karana":"Balava","karanaIndex":10,"pada":1},"abhijitMuhurat":{"startTime":"11:50:32","endTime":"12:45:16","midHour":12.298277013003826},"score":9,"rating":"excellent","factors":[{"field":"nakshatra","delta":3,"note":"Pushya: auspicious for vehicle-purchase"}]}],"nextAuspiciousWindow":"2026-05-21"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/muhurat/business-start":{"post":{"tags":["Vedic"],"summary":"Muhurat: Business start (Vyapara)","description":"Auspicious-window scanner for starting a business / new venture. Preferred nakshatras: Pushya/Hasta/Chitra/Anuradha/U.Phalguni/U.Ashadha/U.Bhadrapada/Sravana/Punarvasu. Avoid Sun/Tue/Sat. Same scoring shape.","operationId":"vedic_muhurat_business-start","x-quality":"green","x-source":"Muhurta Chintamani Adh.11 Vyapara Arambha + B.V.Raman *Muhurta* Ch.10.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MuhuratWindow"},"example":{"search_window_start":"2026-05-15","search_window_end":"2026-06-15","latitude":28.61,"longitude":77.21,"timezoneOffset":5.5}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/muhurat/business-start \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"search_window_start\": \"2026-05-15\", \"search_window_end\": \"2026-06-15\", \"latitude\": 28.61, \"longitude\": 77.21, \"timezoneOffset\": 5.5 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/muhurat/business-start', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"search_window_start\": \"2026-05-15\",\n    \"search_window_end\": \"2026-06-15\",\n    \"latitude\": 28.61,\n    \"longitude\": 77.21,\n    \"timezoneOffset\": 5.5\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/muhurat/business-start',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'search_window_start': \"2026-05-15\",\n      'search_window_end': \"2026-06-15\",\n      'latitude': 28.61,\n      'longitude': 77.21,\n      'timezoneOffset': 5.5\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/muhurat/business-start', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'search_window_start' => '2026-05-15',\n        'search_window_end' => '2026-06-15',\n        'latitude' => 28.61,\n        'longitude' => 77.21,\n        'timezoneOffset' => 5.5,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"activity":{"type":"string","nullable":true},"search_window":{"type":"object","properties":{"start":{"type":"string","nullable":true},"end":{"type":"string","nullable":true},"daysScanned":{"type":"number","nullable":true}},"nullable":true},"location":{"type":"object","properties":{"latitude":{"type":"number","nullable":true},"longitude":{"type":"number","nullable":true},"timezoneOffset":{"type":"number","nullable":true}},"nullable":true},"ayanamsa":{"type":"number","nullable":true},"auspiciousWindows":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string","nullable":true},"weekday":{"type":"number","nullable":true},"weekdayName":{"type":"string","nullable":true},"panchang":{"type":"object","properties":{"tithi":{"type":"number","nullable":true},"tithiName":{"type":"string","nullable":true},"paksha":{"type":"string","nullable":true},"vara":{"type":"number","nullable":true},"varaName":{"type":"string","nullable":true},"nakshatra":{"type":"number","nullable":true},"nakshatraName":{"type":"string","nullable":true},"yoga":{"type":"number","nullable":true},"yogaName":{"type":"string","nullable":true},"karana":{"type":"string","nullable":true},"karanaIndex":{"type":"number","nullable":true},"pada":{"type":"number","nullable":true}},"nullable":true},"abhijitMuhurat":{"type":"object","properties":{"startTime":{"type":"string","nullable":true},"endTime":{"type":"string","nullable":true},"midHour":{"type":"number","nullable":true}},"nullable":true},"score":{"type":"number","nullable":true},"rating":{"type":"string","nullable":true},"factors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string","nullable":true},"delta":{"type":"number","nullable":true},"note":{"type":"string","nullable":true}},"nullable":true},"nullable":true}},"nullable":true},"nullable":true},"nextAuspiciousWindow":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"activity":"business-start","search_window":{"start":"2026-05-15","end":"2026-06-15","daysScanned":32},"location":{"latitude":28.61,"longitude":77.21,"timezoneOffset":5.5},"ayanamsa":24.225448485258198,"auspiciousWindows":[{"date":"2026-05-21","weekday":4,"weekdayName":"Guruvara","panchang":{"tithi":5,"tithiName":"Panchami","paksha":"shukla","vara":4,"varaName":"Guruvara","nakshatra":8,"nakshatraName":"Pushya","yoga":14,"yogaName":"Harshana","karana":"Balava","karanaIndex":10,"pada":1},"abhijitMuhurat":{"startTime":"11:50:32","endTime":"12:45:16","midHour":12.298277013003826},"score":9,"rating":"excellent","factors":[{"field":"nakshatra","delta":3,"note":"Pushya: auspicious for business-start"}]}],"nextAuspiciousWindow":"2026-05-21"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/muhurat/travel":{"post":{"tags":["Vedic"],"summary":"Muhurat: Travel (short Yatra)","description":"Auspicious-window scanner for short / daily travel. Preferred nakshatras: Ashwini/Pushya/Anuradha/Hasta/Sravana/Mrigashira/Punarvasu/Revati. Avoid Sun/Tue/Sat.","operationId":"vedic_muhurat_travel","x-quality":"green","x-source":"Muhurta Chintamani Adh.12 Yatra + B.V.Raman *Muhurta* Ch.7.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MuhuratWindow"},"example":{"search_window_start":"2026-05-15","search_window_end":"2026-05-31","latitude":28.61,"longitude":77.21,"timezoneOffset":5.5}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/muhurat/travel \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"search_window_start\": \"2026-05-15\", \"search_window_end\": \"2026-05-31\", \"latitude\": 28.61, \"longitude\": 77.21, \"timezoneOffset\": 5.5 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/muhurat/travel', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"search_window_start\": \"2026-05-15\",\n    \"search_window_end\": \"2026-05-31\",\n    \"latitude\": 28.61,\n    \"longitude\": 77.21,\n    \"timezoneOffset\": 5.5\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/muhurat/travel',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'search_window_start': \"2026-05-15\",\n      'search_window_end': \"2026-05-31\",\n      'latitude': 28.61,\n      'longitude': 77.21,\n      'timezoneOffset': 5.5\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/muhurat/travel', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'search_window_start' => '2026-05-15',\n        'search_window_end' => '2026-05-31',\n        'latitude' => 28.61,\n        'longitude' => 77.21,\n        'timezoneOffset' => 5.5,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"activity":{"type":"string","nullable":true},"search_window":{"type":"object","properties":{"start":{"type":"string","nullable":true},"end":{"type":"string","nullable":true},"daysScanned":{"type":"number","nullable":true}},"nullable":true},"location":{"type":"object","properties":{"latitude":{"type":"number","nullable":true},"longitude":{"type":"number","nullable":true},"timezoneOffset":{"type":"number","nullable":true}},"nullable":true},"ayanamsa":{"type":"number","nullable":true},"auspiciousWindows":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string","nullable":true},"weekday":{"type":"number","nullable":true},"weekdayName":{"type":"string","nullable":true},"panchang":{"type":"object","properties":{"tithi":{"type":"number","nullable":true},"tithiName":{"type":"string","nullable":true},"paksha":{"type":"string","nullable":true},"vara":{"type":"number","nullable":true},"varaName":{"type":"string","nullable":true},"nakshatra":{"type":"number","nullable":true},"nakshatraName":{"type":"string","nullable":true},"yoga":{"type":"number","nullable":true},"yogaName":{"type":"string","nullable":true},"karana":{"type":"string","nullable":true},"karanaIndex":{"type":"number","nullable":true},"pada":{"type":"number","nullable":true}},"nullable":true},"abhijitMuhurat":{"type":"object","properties":{"startTime":{"type":"string","nullable":true},"endTime":{"type":"string","nullable":true},"midHour":{"type":"number","nullable":true}},"nullable":true},"score":{"type":"number","nullable":true},"rating":{"type":"string","nullable":true},"factors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string","nullable":true},"delta":{"type":"number","nullable":true},"note":{"type":"string","nullable":true}},"nullable":true},"nullable":true}},"nullable":true},"nullable":true},"nextAuspiciousWindow":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"activity":"travel","search_window":{"start":"2026-05-15","end":"2026-05-31","daysScanned":17},"location":{"latitude":28.61,"longitude":77.21,"timezoneOffset":5.5},"ayanamsa":24.225448485258198,"auspiciousWindows":[{"date":"2026-05-21","weekday":4,"weekdayName":"Guruvara","panchang":{"tithi":5,"tithiName":"Panchami","paksha":"shukla","vara":4,"varaName":"Guruvara","nakshatra":8,"nakshatraName":"Pushya","yoga":14,"yogaName":"Harshana","karana":"Balava","karanaIndex":10,"pada":1},"abhijitMuhurat":{"startTime":"11:50:32","endTime":"12:45:16","midHour":12.298277013003826},"score":9,"rating":"excellent","factors":[{"field":"nakshatra","delta":3,"note":"Pushya: auspicious for travel"}]}],"nextAuspiciousWindow":"2026-05-21"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/muhurat/naming-ceremony":{"post":{"tags":["Vedic"],"summary":"Muhurat: Naming ceremony (Namkaran)","description":"Auspicious-window scanner for Namkaran (naming ceremony). Wide nakshatra acceptance per classical text. Note: orthodox practice schedules Namkaran on the 11th or 12th day after birth; this scan returns top auspicious days within any caller-supplied window.","operationId":"vedic_muhurat_naming-ceremony","x-quality":"green","x-source":"Muhurta Chintamani Adh.7 Namkaran + B.V.Raman *Muhurta* Ch.13.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MuhuratWindow"},"example":{"search_window_start":"2026-05-15","search_window_end":"2026-05-31","latitude":28.61,"longitude":77.21,"timezoneOffset":5.5}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/muhurat/naming-ceremony \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"search_window_start\": \"2026-05-15\", \"search_window_end\": \"2026-05-31\", \"latitude\": 28.61, \"longitude\": 77.21, \"timezoneOffset\": 5.5 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/muhurat/naming-ceremony', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"search_window_start\": \"2026-05-15\",\n    \"search_window_end\": \"2026-05-31\",\n    \"latitude\": 28.61,\n    \"longitude\": 77.21,\n    \"timezoneOffset\": 5.5\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/muhurat/naming-ceremony',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'search_window_start': \"2026-05-15\",\n      'search_window_end': \"2026-05-31\",\n      'latitude': 28.61,\n      'longitude': 77.21,\n      'timezoneOffset': 5.5\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/muhurat/naming-ceremony', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'search_window_start' => '2026-05-15',\n        'search_window_end' => '2026-05-31',\n        'latitude' => 28.61,\n        'longitude' => 77.21,\n        'timezoneOffset' => 5.5,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"activity":{"type":"string","nullable":true},"search_window":{"type":"object","properties":{"start":{"type":"string","nullable":true},"end":{"type":"string","nullable":true},"daysScanned":{"type":"number","nullable":true}},"nullable":true},"location":{"type":"object","properties":{"latitude":{"type":"number","nullable":true},"longitude":{"type":"number","nullable":true},"timezoneOffset":{"type":"number","nullable":true}},"nullable":true},"ayanamsa":{"type":"number","nullable":true},"auspiciousWindows":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string","nullable":true},"weekday":{"type":"number","nullable":true},"weekdayName":{"type":"string","nullable":true},"panchang":{"type":"object","properties":{"tithi":{"type":"number","nullable":true},"tithiName":{"type":"string","nullable":true},"paksha":{"type":"string","nullable":true},"vara":{"type":"number","nullable":true},"varaName":{"type":"string","nullable":true},"nakshatra":{"type":"number","nullable":true},"nakshatraName":{"type":"string","nullable":true},"yoga":{"type":"number","nullable":true},"yogaName":{"type":"string","nullable":true},"karana":{"type":"string","nullable":true},"karanaIndex":{"type":"number","nullable":true},"pada":{"type":"number","nullable":true}},"nullable":true},"abhijitMuhurat":{"type":"object","properties":{"startTime":{"type":"string","nullable":true},"endTime":{"type":"string","nullable":true},"midHour":{"type":"number","nullable":true}},"nullable":true},"score":{"type":"number","nullable":true},"rating":{"type":"string","nullable":true},"factors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string","nullable":true},"delta":{"type":"number","nullable":true},"note":{"type":"string","nullable":true}},"nullable":true},"nullable":true}},"nullable":true},"nullable":true},"nextAuspiciousWindow":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"activity":"naming-ceremony","search_window":{"start":"2026-05-15","end":"2026-05-31","daysScanned":17},"location":{"latitude":28.61,"longitude":77.21,"timezoneOffset":5.5},"ayanamsa":24.225448485258198,"auspiciousWindows":[{"date":"2026-05-21","weekday":4,"weekdayName":"Guruvara","panchang":{"tithi":5,"tithiName":"Panchami","paksha":"shukla","vara":4,"varaName":"Guruvara","nakshatra":8,"nakshatraName":"Pushya","yoga":14,"yogaName":"Harshana","karana":"Balava","karanaIndex":10,"pada":1},"abhijitMuhurat":{"startTime":"11:50:32","endTime":"12:45:16","midHour":12.298277013003826},"score":9,"rating":"excellent","factors":[{"field":"nakshatra","delta":3,"note":"Pushya: auspicious for naming-ceremony"}]}],"nextAuspiciousWindow":"2026-05-21"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/muhurat/surgery":{"post":{"tags":["Vedic"],"summary":"Muhurat: Surgery (Shastrakarma)","description":"Auspicious-window scanner for elective surgery. Inverted polarity vs benefic activities: Tue/Sat (Mars/Saturn) preferred for cutting work; Sun/Mon/Thu/Fri avoided. Output is advisory only, and modern medical scheduling takes precedence.","operationId":"vedic_muhurat_surgery","x-quality":"yellow","x-source":"Muhurta Chintamani Adh.16 Shastrakarma + Brihat Samhita Ch.85. YELLOW because canonical Shastrakarma rules diverge across schools (Sushruta-Samhita vs Muhurta-Chintamani lists do not fully agree on permitted nakshatras).","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MuhuratWindow"},"example":{"search_window_start":"2026-05-15","search_window_end":"2026-05-31","latitude":28.61,"longitude":77.21,"timezoneOffset":5.5}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/muhurat/surgery \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"search_window_start\": \"2026-05-15\", \"search_window_end\": \"2026-05-31\", \"latitude\": 28.61, \"longitude\": 77.21, \"timezoneOffset\": 5.5 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/muhurat/surgery', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"search_window_start\": \"2026-05-15\",\n    \"search_window_end\": \"2026-05-31\",\n    \"latitude\": 28.61,\n    \"longitude\": 77.21,\n    \"timezoneOffset\": 5.5\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/muhurat/surgery',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'search_window_start': \"2026-05-15\",\n      'search_window_end': \"2026-05-31\",\n      'latitude': 28.61,\n      'longitude': 77.21,\n      'timezoneOffset': 5.5\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/muhurat/surgery', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'search_window_start' => '2026-05-15',\n        'search_window_end' => '2026-05-31',\n        'latitude' => 28.61,\n        'longitude' => 77.21,\n        'timezoneOffset' => 5.5,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"activity":{"type":"string","nullable":true},"search_window":{"type":"object","properties":{"start":{"type":"string","nullable":true},"end":{"type":"string","nullable":true},"daysScanned":{"type":"number","nullable":true}},"nullable":true},"location":{"type":"object","properties":{"latitude":{"type":"number","nullable":true},"longitude":{"type":"number","nullable":true},"timezoneOffset":{"type":"number","nullable":true}},"nullable":true},"ayanamsa":{"type":"number","nullable":true},"auspiciousWindows":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string","nullable":true},"weekday":{"type":"number","nullable":true},"weekdayName":{"type":"string","nullable":true},"panchang":{"type":"object","properties":{"tithi":{"type":"number","nullable":true},"tithiName":{"type":"string","nullable":true},"paksha":{"type":"string","nullable":true},"vara":{"type":"number","nullable":true},"varaName":{"type":"string","nullable":true},"nakshatra":{"type":"number","nullable":true},"nakshatraName":{"type":"string","nullable":true},"yoga":{"type":"number","nullable":true},"yogaName":{"type":"string","nullable":true},"karana":{"type":"string","nullable":true},"karanaIndex":{"type":"number","nullable":true},"pada":{"type":"number","nullable":true}},"nullable":true},"abhijitMuhurat":{"type":"object","properties":{"startTime":{"type":"string","nullable":true},"endTime":{"type":"string","nullable":true},"midHour":{"type":"number","nullable":true}},"nullable":true},"score":{"type":"number","nullable":true},"rating":{"type":"string","nullable":true},"factors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string","nullable":true},"delta":{"type":"number","nullable":true},"note":{"type":"string","nullable":true}},"nullable":true},"nullable":true}},"nullable":true},"nullable":true},"nextAuspiciousWindow":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"activity":"surgery","search_window":{"start":"2026-05-15","end":"2026-05-31","daysScanned":17},"location":{"latitude":28.61,"longitude":77.21,"timezoneOffset":5.5},"ayanamsa":24.225448485258198,"auspiciousWindows":[{"date":"2026-05-19","weekday":2,"weekdayName":"Mangalvara","panchang":{"tithi":3,"tithiName":"Tritiya","paksha":"shukla","vara":2,"varaName":"Mangalvara","nakshatra":5,"nakshatraName":"Mrigashira","yoga":12,"yogaName":"Dhruva","karana":"Garaja","karanaIndex":6,"pada":4},"abhijitMuhurat":{"startTime":"11:50:30","endTime":"12:45:05","midHour":12.296419113874435},"score":6,"rating":"good","factors":[{"field":"nakshatra","delta":0,"note":"Mrigashira: not in preferred set"}]}],"nextAuspiciousWindow":"2026-05-19"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/muhurat/education-start":{"post":{"tags":["Vedic"],"summary":"Muhurat: Education start (Vidyarambha)","description":"Auspicious-window scanner for starting formal education / Vidyarambha ceremony. Preferred nakshatras: Hasta/Chitra/Swati/Pushya/Sravana/Revati/Anuradha/Punarvasu/U.Phalguni/U.Ashadha/U.Bhadrapada. Avoid Sun/Tue/Sat.","operationId":"vedic_muhurat_education-start","x-quality":"green","x-source":"Muhurta Chintamani Adh.7 Vidyarambha + B.V.Raman *Muhurta* Ch.13.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MuhuratWindow"},"example":{"search_window_start":"2026-05-15","search_window_end":"2026-06-15","latitude":28.61,"longitude":77.21,"timezoneOffset":5.5}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/muhurat/education-start \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"search_window_start\": \"2026-05-15\", \"search_window_end\": \"2026-06-15\", \"latitude\": 28.61, \"longitude\": 77.21, \"timezoneOffset\": 5.5 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/muhurat/education-start', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"search_window_start\": \"2026-05-15\",\n    \"search_window_end\": \"2026-06-15\",\n    \"latitude\": 28.61,\n    \"longitude\": 77.21,\n    \"timezoneOffset\": 5.5\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/muhurat/education-start',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'search_window_start': \"2026-05-15\",\n      'search_window_end': \"2026-06-15\",\n      'latitude': 28.61,\n      'longitude': 77.21,\n      'timezoneOffset': 5.5\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/muhurat/education-start', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'search_window_start' => '2026-05-15',\n        'search_window_end' => '2026-06-15',\n        'latitude' => 28.61,\n        'longitude' => 77.21,\n        'timezoneOffset' => 5.5,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"activity":{"type":"string","nullable":true},"search_window":{"type":"object","properties":{"start":{"type":"string","nullable":true},"end":{"type":"string","nullable":true},"daysScanned":{"type":"number","nullable":true}},"nullable":true},"location":{"type":"object","properties":{"latitude":{"type":"number","nullable":true},"longitude":{"type":"number","nullable":true},"timezoneOffset":{"type":"number","nullable":true}},"nullable":true},"ayanamsa":{"type":"number","nullable":true},"auspiciousWindows":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string","nullable":true},"weekday":{"type":"number","nullable":true},"weekdayName":{"type":"string","nullable":true},"panchang":{"type":"object","properties":{"tithi":{"type":"number","nullable":true},"tithiName":{"type":"string","nullable":true},"paksha":{"type":"string","nullable":true},"vara":{"type":"number","nullable":true},"varaName":{"type":"string","nullable":true},"nakshatra":{"type":"number","nullable":true},"nakshatraName":{"type":"string","nullable":true},"yoga":{"type":"number","nullable":true},"yogaName":{"type":"string","nullable":true},"karana":{"type":"string","nullable":true},"karanaIndex":{"type":"number","nullable":true},"pada":{"type":"number","nullable":true}},"nullable":true},"abhijitMuhurat":{"type":"object","properties":{"startTime":{"type":"string","nullable":true},"endTime":{"type":"string","nullable":true},"midHour":{"type":"number","nullable":true}},"nullable":true},"score":{"type":"number","nullable":true},"rating":{"type":"string","nullable":true},"factors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string","nullable":true},"delta":{"type":"number","nullable":true},"note":{"type":"string","nullable":true}},"nullable":true},"nullable":true}},"nullable":true},"nullable":true},"nextAuspiciousWindow":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"activity":"education-start","search_window":{"start":"2026-05-15","end":"2026-06-15","daysScanned":32},"location":{"latitude":28.61,"longitude":77.21,"timezoneOffset":5.5},"ayanamsa":24.225448485258198,"auspiciousWindows":[{"date":"2026-05-21","weekday":4,"weekdayName":"Guruvara","panchang":{"tithi":5,"tithiName":"Panchami","paksha":"shukla","vara":4,"varaName":"Guruvara","nakshatra":8,"nakshatraName":"Pushya","yoga":14,"yogaName":"Harshana","karana":"Balava","karanaIndex":10,"pada":1},"abhijitMuhurat":{"startTime":"11:50:32","endTime":"12:45:16","midHour":12.298277013003826},"score":9,"rating":"excellent","factors":[{"field":"nakshatra","delta":3,"note":"Pushya: auspicious for education-start"}]}],"nextAuspiciousWindow":"2026-05-21"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/muhurat/investment":{"post":{"tags":["Vedic"],"summary":"Muhurat: Investment / Dhana Sthapana","description":"Auspicious-window scanner for major investments and financial commitments (deposits, share/bond purchase, lending). Preferred nakshatras: Pushya/Anuradha/U.Phalguni/U.Ashadha/U.Bhadrapada/Hasta/Sravana. Avoid Sun/Tue/Sat.","operationId":"vedic_muhurat_investment","x-quality":"green","x-source":"Drik Panchang Dhanteras / Pushya tradition + Muhurta Chintamani Adh.11.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MuhuratWindow"},"example":{"search_window_start":"2026-05-15","search_window_end":"2026-06-15","latitude":28.61,"longitude":77.21,"timezoneOffset":5.5}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/muhurat/investment \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"search_window_start\": \"2026-05-15\", \"search_window_end\": \"2026-06-15\", \"latitude\": 28.61, \"longitude\": 77.21, \"timezoneOffset\": 5.5 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/muhurat/investment', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"search_window_start\": \"2026-05-15\",\n    \"search_window_end\": \"2026-06-15\",\n    \"latitude\": 28.61,\n    \"longitude\": 77.21,\n    \"timezoneOffset\": 5.5\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/muhurat/investment',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'search_window_start': \"2026-05-15\",\n      'search_window_end': \"2026-06-15\",\n      'latitude': 28.61,\n      'longitude': 77.21,\n      'timezoneOffset': 5.5\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/muhurat/investment', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'search_window_start' => '2026-05-15',\n        'search_window_end' => '2026-06-15',\n        'latitude' => 28.61,\n        'longitude' => 77.21,\n        'timezoneOffset' => 5.5,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"activity":{"type":"string","nullable":true},"search_window":{"type":"object","properties":{"start":{"type":"string","nullable":true},"end":{"type":"string","nullable":true},"daysScanned":{"type":"number","nullable":true}},"nullable":true},"location":{"type":"object","properties":{"latitude":{"type":"number","nullable":true},"longitude":{"type":"number","nullable":true},"timezoneOffset":{"type":"number","nullable":true}},"nullable":true},"ayanamsa":{"type":"number","nullable":true},"auspiciousWindows":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string","nullable":true},"weekday":{"type":"number","nullable":true},"weekdayName":{"type":"string","nullable":true},"panchang":{"type":"object","properties":{"tithi":{"type":"number","nullable":true},"tithiName":{"type":"string","nullable":true},"paksha":{"type":"string","nullable":true},"vara":{"type":"number","nullable":true},"varaName":{"type":"string","nullable":true},"nakshatra":{"type":"number","nullable":true},"nakshatraName":{"type":"string","nullable":true},"yoga":{"type":"number","nullable":true},"yogaName":{"type":"string","nullable":true},"karana":{"type":"string","nullable":true},"karanaIndex":{"type":"number","nullable":true},"pada":{"type":"number","nullable":true}},"nullable":true},"abhijitMuhurat":{"type":"object","properties":{"startTime":{"type":"string","nullable":true},"endTime":{"type":"string","nullable":true},"midHour":{"type":"number","nullable":true}},"nullable":true},"score":{"type":"number","nullable":true},"rating":{"type":"string","nullable":true},"factors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string","nullable":true},"delta":{"type":"number","nullable":true},"note":{"type":"string","nullable":true}},"nullable":true},"nullable":true}},"nullable":true},"nullable":true},"nextAuspiciousWindow":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"activity":"investment","search_window":{"start":"2026-05-15","end":"2026-06-15","daysScanned":32},"location":{"latitude":28.61,"longitude":77.21,"timezoneOffset":5.5},"ayanamsa":24.225448485258198,"auspiciousWindows":[{"date":"2026-05-21","weekday":4,"weekdayName":"Guruvara","panchang":{"tithi":5,"tithiName":"Panchami","paksha":"shukla","vara":4,"varaName":"Guruvara","nakshatra":8,"nakshatraName":"Pushya","yoga":14,"yogaName":"Harshana","karana":"Balava","karanaIndex":10,"pada":1},"abhijitMuhurat":{"startTime":"11:50:32","endTime":"12:45:16","midHour":12.298277013003826},"score":9,"rating":"excellent","factors":[{"field":"nakshatra","delta":3,"note":"Pushya: auspicious for investment"}]}],"nextAuspiciousWindow":"2026-05-21"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/muhurat/property-purchase":{"post":{"tags":["Vedic"],"summary":"Muhurat: Property purchase / Griha Pravesh","description":"Auspicious-window scanner for purchasing or moving into property (Griha Pravesh). Preferred nakshatras: Anuradha/U.Phalguni/U.Ashadha/U.Bhadrapada/Mrigashira/Rohini/Pushya/Hasta/Sravana/Dhanishta/Shatabhisha/Revati. Avoid Sun/Tue/Sat.","operationId":"vedic_muhurat_property-purchase","x-quality":"green","x-source":"Muhurta Chintamani Adh.10 Griha + B.V.Raman *Muhurta* Ch.11.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MuhuratWindow"},"example":{"search_window_start":"2026-05-15","search_window_end":"2026-06-15","latitude":28.61,"longitude":77.21,"timezoneOffset":5.5}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/muhurat/property-purchase \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"search_window_start\": \"2026-05-15\", \"search_window_end\": \"2026-06-15\", \"latitude\": 28.61, \"longitude\": 77.21, \"timezoneOffset\": 5.5 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/muhurat/property-purchase', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"search_window_start\": \"2026-05-15\",\n    \"search_window_end\": \"2026-06-15\",\n    \"latitude\": 28.61,\n    \"longitude\": 77.21,\n    \"timezoneOffset\": 5.5\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/muhurat/property-purchase',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'search_window_start': \"2026-05-15\",\n      'search_window_end': \"2026-06-15\",\n      'latitude': 28.61,\n      'longitude': 77.21,\n      'timezoneOffset': 5.5\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/muhurat/property-purchase', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'search_window_start' => '2026-05-15',\n        'search_window_end' => '2026-06-15',\n        'latitude' => 28.61,\n        'longitude' => 77.21,\n        'timezoneOffset' => 5.5,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"activity":{"type":"string","nullable":true},"search_window":{"type":"object","properties":{"start":{"type":"string","nullable":true},"end":{"type":"string","nullable":true},"daysScanned":{"type":"number","nullable":true}},"nullable":true},"location":{"type":"object","properties":{"latitude":{"type":"number","nullable":true},"longitude":{"type":"number","nullable":true},"timezoneOffset":{"type":"number","nullable":true}},"nullable":true},"ayanamsa":{"type":"number","nullable":true},"auspiciousWindows":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string","nullable":true},"weekday":{"type":"number","nullable":true},"weekdayName":{"type":"string","nullable":true},"panchang":{"type":"object","properties":{"tithi":{"type":"number","nullable":true},"tithiName":{"type":"string","nullable":true},"paksha":{"type":"string","nullable":true},"vara":{"type":"number","nullable":true},"varaName":{"type":"string","nullable":true},"nakshatra":{"type":"number","nullable":true},"nakshatraName":{"type":"string","nullable":true},"yoga":{"type":"number","nullable":true},"yogaName":{"type":"string","nullable":true},"karana":{"type":"string","nullable":true},"karanaIndex":{"type":"number","nullable":true},"pada":{"type":"number","nullable":true}},"nullable":true},"abhijitMuhurat":{"type":"object","properties":{"startTime":{"type":"string","nullable":true},"endTime":{"type":"string","nullable":true},"midHour":{"type":"number","nullable":true}},"nullable":true},"score":{"type":"number","nullable":true},"rating":{"type":"string","nullable":true},"factors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string","nullable":true},"delta":{"type":"number","nullable":true},"note":{"type":"string","nullable":true}},"nullable":true},"nullable":true}},"nullable":true},"nullable":true},"nextAuspiciousWindow":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"activity":"property-purchase","search_window":{"start":"2026-05-15","end":"2026-06-15","daysScanned":32},"location":{"latitude":28.61,"longitude":77.21,"timezoneOffset":5.5},"ayanamsa":24.225448485258198,"auspiciousWindows":[{"date":"2026-05-21","weekday":4,"weekdayName":"Guruvara","panchang":{"tithi":5,"tithiName":"Panchami","paksha":"shukla","vara":4,"varaName":"Guruvara","nakshatra":8,"nakshatraName":"Pushya","yoga":14,"yogaName":"Harshana","karana":"Balava","karanaIndex":10,"pada":1},"abhijitMuhurat":{"startTime":"11:50:32","endTime":"12:45:16","midHour":12.298277013003826},"score":9,"rating":"excellent","factors":[{"field":"nakshatra","delta":3,"note":"Pushya: auspicious for property-purchase"}]}],"nextAuspiciousWindow":"2026-05-21"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/muhurat/journey-long":{"post":{"tags":["Vedic"],"summary":"Muhurat: Long journey (multi-day Yatra)","description":"Auspicious-window scanner for multi-day journeys (pilgrimages, relocation travel). Stricter than short travel: Friday is excluded per Yatra prakarana. Preferred nakshatras: Punarvasu/Pushya/Anuradha/Sravana/Hasta/Mrigashira/Revati/Ashwini.","operationId":"vedic_muhurat_journey-long","x-quality":"green","x-source":"Muhurta Chintamani Adh.12 Yatra (multi-day) + B.V.Raman *Muhurta* Ch.7.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MuhuratWindow"},"example":{"search_window_start":"2026-05-15","search_window_end":"2026-06-15","latitude":28.61,"longitude":77.21,"timezoneOffset":5.5}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/muhurat/journey-long \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"search_window_start\": \"2026-05-15\", \"search_window_end\": \"2026-06-15\", \"latitude\": 28.61, \"longitude\": 77.21, \"timezoneOffset\": 5.5 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/muhurat/journey-long', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"search_window_start\": \"2026-05-15\",\n    \"search_window_end\": \"2026-06-15\",\n    \"latitude\": 28.61,\n    \"longitude\": 77.21,\n    \"timezoneOffset\": 5.5\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/muhurat/journey-long',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'search_window_start': \"2026-05-15\",\n      'search_window_end': \"2026-06-15\",\n      'latitude': 28.61,\n      'longitude': 77.21,\n      'timezoneOffset': 5.5\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/muhurat/journey-long', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'search_window_start' => '2026-05-15',\n        'search_window_end' => '2026-06-15',\n        'latitude' => 28.61,\n        'longitude' => 77.21,\n        'timezoneOffset' => 5.5,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"activity":{"type":"string","nullable":true},"search_window":{"type":"object","properties":{"start":{"type":"string","nullable":true},"end":{"type":"string","nullable":true},"daysScanned":{"type":"number","nullable":true}},"nullable":true},"location":{"type":"object","properties":{"latitude":{"type":"number","nullable":true},"longitude":{"type":"number","nullable":true},"timezoneOffset":{"type":"number","nullable":true}},"nullable":true},"ayanamsa":{"type":"number","nullable":true},"auspiciousWindows":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string","nullable":true},"weekday":{"type":"number","nullable":true},"weekdayName":{"type":"string","nullable":true},"panchang":{"type":"object","properties":{"tithi":{"type":"number","nullable":true},"tithiName":{"type":"string","nullable":true},"paksha":{"type":"string","nullable":true},"vara":{"type":"number","nullable":true},"varaName":{"type":"string","nullable":true},"nakshatra":{"type":"number","nullable":true},"nakshatraName":{"type":"string","nullable":true},"yoga":{"type":"number","nullable":true},"yogaName":{"type":"string","nullable":true},"karana":{"type":"string","nullable":true},"karanaIndex":{"type":"number","nullable":true},"pada":{"type":"number","nullable":true}},"nullable":true},"abhijitMuhurat":{"type":"object","properties":{"startTime":{"type":"string","nullable":true},"endTime":{"type":"string","nullable":true},"midHour":{"type":"number","nullable":true}},"nullable":true},"score":{"type":"number","nullable":true},"rating":{"type":"string","nullable":true},"factors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string","nullable":true},"delta":{"type":"number","nullable":true},"note":{"type":"string","nullable":true}},"nullable":true},"nullable":true}},"nullable":true},"nullable":true},"nextAuspiciousWindow":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"activity":"journey-long","search_window":{"start":"2026-05-15","end":"2026-06-15","daysScanned":32},"location":{"latitude":28.61,"longitude":77.21,"timezoneOffset":5.5},"ayanamsa":24.225448485258198,"auspiciousWindows":[{"date":"2026-05-21","weekday":4,"weekdayName":"Guruvara","panchang":{"tithi":5,"tithiName":"Panchami","paksha":"shukla","vara":4,"varaName":"Guruvara","nakshatra":8,"nakshatraName":"Pushya","yoga":14,"yogaName":"Harshana","karana":"Balava","karanaIndex":10,"pada":1},"abhijitMuhurat":{"startTime":"11:50:32","endTime":"12:45:16","midHour":12.298277013003826},"score":9,"rating":"excellent","factors":[{"field":"nakshatra","delta":3,"note":"Pushya: auspicious for journey-long"}]}],"nextAuspiciousWindow":"2026-05-21"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/muhurat/name-change":{"post":{"tags":["Vedic"],"summary":"Muhurat: Name change","description":"Auspicious-window scanner for legal or sacramental name change (uses Namkaran-derived rules with widened tithi set). Preferred nakshatras: Hasta/Chitra/Swati/Pushya/Anuradha/Revati/U.Phalguni/U.Ashadha/U.Bhadrapada.","operationId":"vedic_muhurat_name-change","x-quality":"green","x-source":"Muhurta Chintamani Adh.7 (Namkaran-derived).","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MuhuratWindow"},"example":{"search_window_start":"2026-05-15","search_window_end":"2026-05-31","latitude":28.61,"longitude":77.21,"timezoneOffset":5.5}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/muhurat/name-change \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"search_window_start\": \"2026-05-15\", \"search_window_end\": \"2026-05-31\", \"latitude\": 28.61, \"longitude\": 77.21, \"timezoneOffset\": 5.5 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/muhurat/name-change', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"search_window_start\": \"2026-05-15\",\n    \"search_window_end\": \"2026-05-31\",\n    \"latitude\": 28.61,\n    \"longitude\": 77.21,\n    \"timezoneOffset\": 5.5\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/muhurat/name-change',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'search_window_start': \"2026-05-15\",\n      'search_window_end': \"2026-05-31\",\n      'latitude': 28.61,\n      'longitude': 77.21,\n      'timezoneOffset': 5.5\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/muhurat/name-change', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'search_window_start' => '2026-05-15',\n        'search_window_end' => '2026-05-31',\n        'latitude' => 28.61,\n        'longitude' => 77.21,\n        'timezoneOffset' => 5.5,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"activity":{"type":"string","nullable":true},"search_window":{"type":"object","properties":{"start":{"type":"string","nullable":true},"end":{"type":"string","nullable":true},"daysScanned":{"type":"number","nullable":true}},"nullable":true},"location":{"type":"object","properties":{"latitude":{"type":"number","nullable":true},"longitude":{"type":"number","nullable":true},"timezoneOffset":{"type":"number","nullable":true}},"nullable":true},"ayanamsa":{"type":"number","nullable":true},"auspiciousWindows":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string","nullable":true},"weekday":{"type":"number","nullable":true},"weekdayName":{"type":"string","nullable":true},"panchang":{"type":"object","properties":{"tithi":{"type":"number","nullable":true},"tithiName":{"type":"string","nullable":true},"paksha":{"type":"string","nullable":true},"vara":{"type":"number","nullable":true},"varaName":{"type":"string","nullable":true},"nakshatra":{"type":"number","nullable":true},"nakshatraName":{"type":"string","nullable":true},"yoga":{"type":"number","nullable":true},"yogaName":{"type":"string","nullable":true},"karana":{"type":"string","nullable":true},"karanaIndex":{"type":"number","nullable":true},"pada":{"type":"number","nullable":true}},"nullable":true},"abhijitMuhurat":{"type":"object","properties":{"startTime":{"type":"string","nullable":true},"endTime":{"type":"string","nullable":true},"midHour":{"type":"number","nullable":true}},"nullable":true},"score":{"type":"number","nullable":true},"rating":{"type":"string","nullable":true},"factors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string","nullable":true},"delta":{"type":"number","nullable":true},"note":{"type":"string","nullable":true}},"nullable":true},"nullable":true}},"nullable":true},"nullable":true},"nextAuspiciousWindow":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"activity":"name-change","search_window":{"start":"2026-05-15","end":"2026-05-31","daysScanned":17},"location":{"latitude":28.61,"longitude":77.21,"timezoneOffset":5.5},"ayanamsa":24.225448485258198,"auspiciousWindows":[{"date":"2026-05-21","weekday":4,"weekdayName":"Guruvara","panchang":{"tithi":5,"tithiName":"Panchami","paksha":"shukla","vara":4,"varaName":"Guruvara","nakshatra":8,"nakshatraName":"Pushya","yoga":14,"yogaName":"Harshana","karana":"Balava","karanaIndex":10,"pada":1},"abhijitMuhurat":{"startTime":"11:50:32","endTime":"12:45:16","midHour":12.298277013003826},"score":9,"rating":"excellent","factors":[{"field":"nakshatra","delta":3,"note":"Pushya: auspicious for name-change"}]}],"nextAuspiciousWindow":"2026-05-21"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/muhurat/general-auspicious":{"post":{"tags":["Vedic"],"summary":"Muhurat: General auspicious window","description":"Generic favourable-window finder when no specific activity applies (Sankalpa, prayer, fallback). Universal Pushya/Hasta nakshatras + standard shubha tithis. Returns top-N days against universal Panchang criteria.","operationId":"vedic_muhurat_general-auspicious","x-quality":"green","x-source":"Composite: Pushya/Hasta universal auspicious + drikpanchang shubha tithis.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MuhuratWindow"},"example":{"search_window_start":"2026-05-15","search_window_end":"2026-06-15","latitude":28.61,"longitude":77.21,"timezoneOffset":5.5}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/muhurat/general-auspicious \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"search_window_start\": \"2026-05-15\", \"search_window_end\": \"2026-06-15\", \"latitude\": 28.61, \"longitude\": 77.21, \"timezoneOffset\": 5.5 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/muhurat/general-auspicious', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"search_window_start\": \"2026-05-15\",\n    \"search_window_end\": \"2026-06-15\",\n    \"latitude\": 28.61,\n    \"longitude\": 77.21,\n    \"timezoneOffset\": 5.5\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/muhurat/general-auspicious',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'search_window_start': \"2026-05-15\",\n      'search_window_end': \"2026-06-15\",\n      'latitude': 28.61,\n      'longitude': 77.21,\n      'timezoneOffset': 5.5\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/muhurat/general-auspicious', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'search_window_start' => '2026-05-15',\n        'search_window_end' => '2026-06-15',\n        'latitude' => 28.61,\n        'longitude' => 77.21,\n        'timezoneOffset' => 5.5,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"activity":{"type":"string","nullable":true},"search_window":{"type":"object","properties":{"start":{"type":"string","nullable":true},"end":{"type":"string","nullable":true},"daysScanned":{"type":"number","nullable":true}},"nullable":true},"location":{"type":"object","properties":{"latitude":{"type":"number","nullable":true},"longitude":{"type":"number","nullable":true},"timezoneOffset":{"type":"number","nullable":true}},"nullable":true},"ayanamsa":{"type":"number","nullable":true},"auspiciousWindows":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string","nullable":true},"weekday":{"type":"number","nullable":true},"weekdayName":{"type":"string","nullable":true},"panchang":{"type":"object","properties":{"tithi":{"type":"number","nullable":true},"tithiName":{"type":"string","nullable":true},"paksha":{"type":"string","nullable":true},"vara":{"type":"number","nullable":true},"varaName":{"type":"string","nullable":true},"nakshatra":{"type":"number","nullable":true},"nakshatraName":{"type":"string","nullable":true},"yoga":{"type":"number","nullable":true},"yogaName":{"type":"string","nullable":true},"karana":{"type":"string","nullable":true},"karanaIndex":{"type":"number","nullable":true},"pada":{"type":"number","nullable":true}},"nullable":true},"abhijitMuhurat":{"type":"object","properties":{"startTime":{"type":"string","nullable":true},"endTime":{"type":"string","nullable":true},"midHour":{"type":"number","nullable":true}},"nullable":true},"score":{"type":"number","nullable":true},"rating":{"type":"string","nullable":true},"factors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string","nullable":true},"delta":{"type":"number","nullable":true},"note":{"type":"string","nullable":true}},"nullable":true},"nullable":true}},"nullable":true},"nullable":true},"nextAuspiciousWindow":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"activity":"general-auspicious","search_window":{"start":"2026-05-15","end":"2026-06-15","daysScanned":32},"location":{"latitude":28.61,"longitude":77.21,"timezoneOffset":5.5},"ayanamsa":24.225448485258198,"auspiciousWindows":[{"date":"2026-05-21","weekday":4,"weekdayName":"Guruvara","panchang":{"tithi":5,"tithiName":"Panchami","paksha":"shukla","vara":4,"varaName":"Guruvara","nakshatra":8,"nakshatraName":"Pushya","yoga":14,"yogaName":"Harshana","karana":"Balava","karanaIndex":10,"pada":1},"abhijitMuhurat":{"startTime":"11:50:32","endTime":"12:45:16","midHour":12.298277013003826},"score":9,"rating":"excellent","factors":[{"field":"nakshatra","delta":3,"note":"Pushya: auspicious for general-auspicious"}]}],"nextAuspiciousWindow":"2026-05-21"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/muhurta/types":{"get":{"tags":["Vedic"],"summary":"Muhurat: activity catalogue","description":"List the 12 supported muhurat activities (key + Sanskrit name + one-line purpose) so a client can discover them without hard-coding. Free metadata read, no calculation.","operationId":"muhurta_types_get","x-quality":"green","x-source":"Static metadata for the /vedic/muhurat/* activity set.","security":[{"ApiKeyAuth":[]}],"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X GET https://api.astroway.info/v1/muhurta/types \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/muhurta/types', {\n  method: 'GET',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.get(\n    'https://api.astroway.info/v1/muhurta/types',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->get('muhurta/types', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"count":{"type":"number","nullable":true},"activities":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string","nullable":true},"title":{"type":"string","nullable":true},"sanskrit":{"type":"string","nullable":true},"description":{"type":"string","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"count":12,"activities":[{"key":"marriage","title":"Marriage","sanskrit":"Vivah","description":"Wedding / marriage ceremony."}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/kundli":{"post":{"tags":["Vedic"],"summary":"Kundli (one call)","description":"A kundli card in one call: D1 lagna and the nine grahas with sign names, the Moon nakshatra and pada, the running Vimshottari maha and antar at `targetDate` (default now), and the Parashari yogas and doshas with a `present` list of the ones found. Each part is the same answer as its own route (/vedic/varga/D1, /vedic/dashas/vimshottari/antar, /vedic/yogas/parashara/full, /vedic/doshas/parashara/full). `latitude` and `longitude` are required; `time` is `HH:mm:ss` or `HH:mm`. `nakshatra.nameLocalized` is the name in the requested language (Devanagari for hi, the Cyrillic forms for uk and ru, the international transliteration elsewhere). 50 credits.","operationId":"vedic_kundli","x-quality":"green","x-source":"Composite of the D1 varga, Vimshottari, Parashari yoga and dosha routes; see each for sources.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/KundliInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52,"targetDate":"2026-10-06"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/kundli \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52, \"targetDate\": \"2026-10-06\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/kundli', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52,\n    \"targetDate\": \"2026-10-06\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/kundli',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52,\n      'targetDate': \"2026-10-06\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/kundli', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n        'targetDate' => '2026-10-06',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"ayanamsa":{"type":"number","nullable":true},"lagna":{"type":"object","properties":{"longitude":{"type":"number","nullable":true},"sign":{"type":"number","nullable":true},"degreeInSign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true}},"nullable":true},"grahas":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","nullable":true},"longitude":{"type":"number","nullable":true},"sign":{"type":"number","nullable":true},"degreeInSign":{"type":"number","nullable":true},"isRetrograde":{"type":"boolean","nullable":true},"signName":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"nakshatra":{"type":"object","properties":{"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"nameRu":{"type":"string","nullable":true},"nameUk":{"type":"string","nullable":true},"ruler":{"type":"string","nullable":true},"startDeg":{"type":"number","nullable":true},"endDeg":{"type":"number","nullable":true},"pada":{"type":"number","nullable":true}},"nullable":true},"dasha":{"type":"object","properties":{"system":{"type":"string","nullable":true},"maha":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"antar":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true}},"nullable":true},"yogas":{"type":"object","properties":{"present":{"type":"array","items":{},"nullable":true},"dhana":{"type":"object","properties":{"present":{"type":"boolean","nullable":true},"contributingPlanets":{"type":"array","items":{},"nullable":true}},"nullable":true}},"nullable":true},"doshas":{"type":"object","properties":{"present":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"mangal":{"type":"object","properties":{"present":{"type":"boolean","nullable":true},"severity":{"type":"string","nullable":true}},"nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"ayanamsa":23.7225,"lagna":{"longitude":146.2454,"sign":4,"degreeInSign":26.2454,"signName":"Leo"},"grahas":[{"name":"Sun","longitude":30.6502,"sign":1,"degreeInSign":0.6502,"isRetrograde":false,"signName":"Taurus"},{"name":"Moon","longitude":273.1789,"sign":9,"degreeInSign":3.1789,"isRetrograde":false,"signName":"Capricorn"},{"name":"Ketu","longitude":106.5326,"sign":3,"degreeInSign":16.5326,"isRetrograde":true,"signName":"Cancer"}],"nakshatra":{"number":21,"name":"Uttara Ashadha","nameRu":"Уттара Ашадха","nameUk":"Уттара Ашадха","ruler":"Sun","startDeg":266.6667,"endDeg":280,"pada":2},"dasha":{"system":"Vimshottari","maha":{"planet":11,"planetName":"Rahu","startJd":2455357.3655195693,"endJd":2461931.8655195693,"startDate":"2010-06-10 00:46","endDate":"2028-06-09 12:46","durationYears":18},"antar":{"planet":1,"planetName":"Moon","startJd":2461000.4780195695,"endJd":2461548.3530195695,"startDate":"2025-11-21 03:28","endDate":"2027-05-23 00:28","durationYears":1.5}},"yogas":{"present":[],"dhana":{"present":false,"contributingPlanets":[]}},"doshas":{"present":["mangal","shrapit","grahan"],"mangal":{"present":true,"severity":"strong"}}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/dashas/vimshottari/maha":{"post":{"tags":["Vedic"],"summary":"Dashas: Vimshottari Mahadasha","description":"Canonical Vimshottari Mahadasha sequence: 9 planets (Ketu/Venus/Sun/Moon/Mars/Rahu/Jupiter/Saturn/Mercury), 120-year total cycle, starts from the lord of Moon's nakshatra at birth. First period is truncated by elapsed fraction within Moon's nakshatra.","operationId":"vedic_dashas_vimshottari_maha","x-quality":"green","x-source":"BPHS Adhyaya 46 (Sharma/Santhanam) + jhora vimshottari module + drikpanchang Vimshottari calculator.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashaInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/dashas/vimshottari/maha \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/dashas/vimshottari/maha', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/dashas/vimshottari/maha',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/dashas/vimshottari/maha', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"level":{"type":"string","nullable":true},"ayanamsa":{"type":"number","nullable":true},"moonSiderealLongitude":{"type":"number","nullable":true},"nakshatra":{"type":"object","properties":{"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"nameRu":{"type":"string","nullable":true},"nameUk":{"type":"string","nullable":true},"ruler":{"type":"string","nullable":true},"startDeg":{"type":"number","nullable":true},"endDeg":{"type":"number","nullable":true},"pada":{"type":"number","nullable":true}},"nullable":true},"initial":{"type":"object","properties":{"initialPlanet":{"type":"number","nullable":true},"initialPlanetName":{"type":"string","nullable":true},"nakshatra":{"type":"number","nullable":true},"nakshatraName":{"type":"string","nullable":true},"pada":{"type":"number","nullable":true},"balanceYears":{"type":"number","nullable":true},"balanceMonths":{"type":"number","nullable":true},"balanceDays":{"type":"number","nullable":true},"elapsedYears":{"type":"number","nullable":true}},"nullable":true},"periods":{"type":"array","items":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"Vimshottari","level":"maha","ayanamsa":23.72254952235926,"moonSiderealLongitude":273.178879897163,"nakshatra":{"number":21,"name":"Uttara Ashadha","nameRu":"Уттара Ашадха","nameUk":"Уттара Ашадха","ruler":"Sun","startDeg":266.6667,"endDeg":280,"pada":2},"initial":{"initialPlanet":0,"initialPlanetName":"Sun","nakshatra":21,"nakshatraName":"Uttara Ashadha","pada":2,"balanceYears":3,"balanceMonths":0,"balanceDays":25,"elapsedYears":2.930495953723303},"periods":[{"planet":0,"planetName":"Sun","startJd":2448026.9791666665,"endJd":2449148.1155195693,"startDate":"1990-05-15 15:29","endDate":"1993-06-09 18:46","durationYears":3.069504046276697}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/dashas/vimshottari/antar":{"post":{"tags":["Vedic"],"summary":"Dashas: Vimshottari Antardasha","description":"Antardasha (sub-period) within the running Mahadasha. Identifies which MD is active at `targetDate` (default today UTC), then returns the 9 ADs covering that MD. Sub-period of planet Q within MD of P: `years = (P.years × Q.years) / 120`.","operationId":"vedic_dashas_vimshottari_antar","x-quality":"green","x-source":"BPHS Adhyaya 46 + jhora vimshottari module.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashaInput"},"example":{"date":"1947-08-15","time":"02:00:00","timezoneOffset":5.5,"latitude":27.49,"longitude":77.67,"targetDate":"2026-05-06"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/dashas/vimshottari/antar \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1947-08-15\", \"time\": \"02:00:00\", \"timezoneOffset\": 5.5, \"latitude\": 27.49, \"longitude\": 77.67, \"targetDate\": \"2026-05-06\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/dashas/vimshottari/antar', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1947-08-15\",\n    \"time\": \"02:00:00\",\n    \"timezoneOffset\": 5.5,\n    \"latitude\": 27.49,\n    \"longitude\": 77.67,\n    \"targetDate\": \"2026-05-06\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/dashas/vimshottari/antar',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1947-08-15\",\n      'time': \"02:00:00\",\n      'timezoneOffset': 5.5,\n      'latitude': 27.49,\n      'longitude': 77.67,\n      'targetDate': \"2026-05-06\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/dashas/vimshottari/antar', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1947-08-15',\n        'time' => '02:00:00',\n        'timezoneOffset' => 5.5,\n        'latitude' => 27.49,\n        'longitude' => 77.67,\n        'targetDate' => '2026-05-06',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"level":{"type":"string","nullable":true},"ayanamsa":{"type":"number","nullable":true},"moonSiderealLongitude":{"type":"number","nullable":true},"nakshatra":{"type":"object","properties":{"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"nameRu":{"type":"string","nullable":true},"nameUk":{"type":"string","nullable":true},"ruler":{"type":"string","nullable":true},"startDeg":{"type":"number","nullable":true},"endDeg":{"type":"number","nullable":true},"pada":{"type":"number","nullable":true}},"nullable":true},"initial":{"type":"object","properties":{"initialPlanet":{"type":"number","nullable":true},"initialPlanetName":{"type":"string","nullable":true},"nakshatra":{"type":"number","nullable":true},"nakshatraName":{"type":"string","nullable":true},"pada":{"type":"number","nullable":true},"balanceYears":{"type":"number","nullable":true},"balanceMonths":{"type":"number","nullable":true},"balanceDays":{"type":"number","nullable":true},"elapsedYears":{"type":"number","nullable":true}},"nullable":true},"currentMaha":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"periods":{"type":"array","items":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"Vimshottari","level":"antar","ayanamsa":23.125454161038185,"moonSiderealLongitude":95.24121106113016,"nakshatra":{"number":8,"name":"Pushya","nameRu":"Пушья","nameUk":"Пушья","ruler":"Saturn","startDeg":93.3333,"endDeg":106.6667,"pada":1},"initial":{"initialPlanet":6,"initialPlanetName":"Saturn","nakshatra":8,"nakshatraName":"Pushya","pada":1,"balanceYears":16,"balanceMonths":3,"balanceDays":11,"elapsedYears":2.718725762110483},"currentMaha":{"planet":4,"planetName":"Mars","startJd":2460274.089582056,"endJd":2462830.839582056,"startDate":"2023-11-25 19:38","endDate":"2030-11-25 13:38","durationYears":7},"periods":[{"planet":4,"planetName":"Mars","startJd":2460274.089582056,"endJd":2460423.2333320556,"startDate":"2023-11-25 19:38","endDate":"2024-04-22 23:05","durationYears":0.4083333333333333}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/dashas/vimshottari/pratyantar":{"post":{"tags":["Vedic"],"summary":"Dashas: Vimshottari Pratyantardasha","description":"Pratyantardasha (sub-sub-period) within the running Antardasha. 3-level cascade: find current MD → AD → return 9 PDs of that AD.","operationId":"vedic_dashas_vimshottari_pratyantar","x-quality":"green","x-source":"BPHS Adhyaya 46 + jhora vimshottari module.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashaInput"},"example":{"date":"1947-08-15","time":"02:00:00","timezoneOffset":5.5,"latitude":27.49,"longitude":77.67,"targetDate":"2026-05-06"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/dashas/vimshottari/pratyantar \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1947-08-15\", \"time\": \"02:00:00\", \"timezoneOffset\": 5.5, \"latitude\": 27.49, \"longitude\": 77.67, \"targetDate\": \"2026-05-06\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/dashas/vimshottari/pratyantar', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1947-08-15\",\n    \"time\": \"02:00:00\",\n    \"timezoneOffset\": 5.5,\n    \"latitude\": 27.49,\n    \"longitude\": 77.67,\n    \"targetDate\": \"2026-05-06\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/dashas/vimshottari/pratyantar',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1947-08-15\",\n      'time': \"02:00:00\",\n      'timezoneOffset': 5.5,\n      'latitude': 27.49,\n      'longitude': 77.67,\n      'targetDate': \"2026-05-06\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/dashas/vimshottari/pratyantar', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1947-08-15',\n        'time' => '02:00:00',\n        'timezoneOffset' => 5.5,\n        'latitude' => 27.49,\n        'longitude' => 77.67,\n        'targetDate' => '2026-05-06',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"level":{"type":"string","nullable":true},"ayanamsa":{"type":"number","nullable":true},"nakshatra":{"type":"object","properties":{"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"nameRu":{"type":"string","nullable":true},"nameUk":{"type":"string","nullable":true},"ruler":{"type":"string","nullable":true},"startDeg":{"type":"number","nullable":true},"endDeg":{"type":"number","nullable":true},"pada":{"type":"number","nullable":true}},"nullable":true},"initial":{"type":"object","properties":{"initialPlanet":{"type":"number","nullable":true},"initialPlanetName":{"type":"string","nullable":true},"nakshatra":{"type":"number","nullable":true},"nakshatraName":{"type":"string","nullable":true},"pada":{"type":"number","nullable":true},"balanceYears":{"type":"number","nullable":true},"balanceMonths":{"type":"number","nullable":true},"balanceDays":{"type":"number","nullable":true},"elapsedYears":{"type":"number","nullable":true}},"nullable":true},"currentMaha":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"currentAntar":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"periods":{"type":"array","items":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"Vimshottari","level":"pratyantar","ayanamsa":23.125454161038185,"nakshatra":{"number":8,"name":"Pushya","nameRu":"Пушья","nameUk":"Пушья","ruler":"Saturn","startDeg":93.3333,"endDeg":106.6667,"pada":1},"initial":{"initialPlanet":6,"initialPlanetName":"Saturn","nakshatra":8,"nakshatraName":"Pushya","pada":1,"balanceYears":16,"balanceMonths":3,"balanceDays":11,"elapsedYears":2.718725762110483},"currentMaha":{"planet":4,"planetName":"Mars","startJd":2460274.089582056,"endJd":2462830.839582056,"startDate":"2023-11-25 19:38","endDate":"2030-11-25 13:38","durationYears":7},"currentAntar":{"planet":6,"planetName":"Saturn","startJd":2461147.6458320557,"endJd":2461552.464582056,"startDate":"2026-04-17 08:59","endDate":"2027-05-27 04:38","durationYears":1.1083333333333334},"periods":[{"planet":6,"planetName":"Saturn","startJd":2461147.6458320557,"endJd":2461211.742134139,"startDate":"2026-04-17 08:59","endDate":"2026-06-20 11:18","durationYears":0.17548611111111112}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/dashas/vimshottari/sookshma":{"post":{"tags":["Vedic"],"summary":"Dashas: Vimshottari Sookshmadasha","description":"Sookshma (4th-level Dasha) within the running Pratyantardasha. 4-level cascade.","operationId":"vedic_dashas_vimshottari_sookshma","x-quality":"green","x-source":"BPHS Adhyaya 46 + jhora vimshottari module.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashaInput"},"example":{"date":"1947-08-15","time":"02:00:00","timezoneOffset":5.5,"latitude":27.49,"longitude":77.67,"targetDate":"2026-05-06"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/dashas/vimshottari/sookshma \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1947-08-15\", \"time\": \"02:00:00\", \"timezoneOffset\": 5.5, \"latitude\": 27.49, \"longitude\": 77.67, \"targetDate\": \"2026-05-06\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/dashas/vimshottari/sookshma', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1947-08-15\",\n    \"time\": \"02:00:00\",\n    \"timezoneOffset\": 5.5,\n    \"latitude\": 27.49,\n    \"longitude\": 77.67,\n    \"targetDate\": \"2026-05-06\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/dashas/vimshottari/sookshma',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1947-08-15\",\n      'time': \"02:00:00\",\n      'timezoneOffset': 5.5,\n      'latitude': 27.49,\n      'longitude': 77.67,\n      'targetDate': \"2026-05-06\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/dashas/vimshottari/sookshma', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1947-08-15',\n        'time' => '02:00:00',\n        'timezoneOffset' => 5.5,\n        'latitude' => 27.49,\n        'longitude' => 77.67,\n        'targetDate' => '2026-05-06',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"level":{"type":"string","nullable":true},"ayanamsa":{"type":"number","nullable":true},"nakshatra":{"type":"object","properties":{"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"nameRu":{"type":"string","nullable":true},"nameUk":{"type":"string","nullable":true},"ruler":{"type":"string","nullable":true},"startDeg":{"type":"number","nullable":true},"endDeg":{"type":"number","nullable":true},"pada":{"type":"number","nullable":true}},"nullable":true},"initial":{"type":"object","properties":{"initialPlanet":{"type":"number","nullable":true},"initialPlanetName":{"type":"string","nullable":true},"nakshatra":{"type":"number","nullable":true},"nakshatraName":{"type":"string","nullable":true},"pada":{"type":"number","nullable":true},"balanceYears":{"type":"number","nullable":true},"balanceMonths":{"type":"number","nullable":true},"balanceDays":{"type":"number","nullable":true},"elapsedYears":{"type":"number","nullable":true}},"nullable":true},"currentMaha":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"currentAntar":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"currentPratyantar":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"periods":{"type":"array","items":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"Vimshottari","level":"sookshma","ayanamsa":23.125454161038185,"nakshatra":{"number":8,"name":"Pushya","nameRu":"Пушья","nameUk":"Пушья","ruler":"Saturn","startDeg":93.3333,"endDeg":106.6667,"pada":1},"initial":{"initialPlanet":6,"initialPlanetName":"Saturn","nakshatra":8,"nakshatraName":"Pushya","pada":1,"balanceYears":16,"balanceMonths":3,"balanceDays":11,"elapsedYears":2.718725762110483},"currentMaha":{"planet":4,"planetName":"Mars","startJd":2460274.089582056,"endJd":2462830.839582056,"startDate":"2023-11-25 19:38","endDate":"2030-11-25 13:38","durationYears":7},"currentAntar":{"planet":6,"planetName":"Saturn","startJd":2461147.6458320557,"endJd":2461552.464582056,"startDate":"2026-04-17 08:59","endDate":"2027-05-27 04:38","durationYears":1.1083333333333334},"currentPratyantar":{"planet":6,"planetName":"Saturn","startJd":2461147.6458320557,"endJd":2461211.742134139,"startDate":"2026-04-17 08:59","endDate":"2026-06-20 11:18","durationYears":0.17548611111111112},"periods":[{"planet":6,"planetName":"Saturn","startJd":2461147.6458320557,"endJd":2461157.7944132187,"startDate":"2026-04-17 08:59","endDate":"2026-04-27 12:33","durationYears":0.027785300925925925}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/dashas/vimshottari/prana":{"post":{"tags":["Vedic"],"summary":"Dashas: Vimshottari Pranadasha","description":"Pranadasha (5th-level Dasha, the finest grain). 5-level cascade. Each Prana sub-period is typically a few hours to a few days.","operationId":"vedic_dashas_vimshottari_prana","x-quality":"green","x-source":"BPHS Adhyaya 46 + jhora vimshottari module.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashaInput"},"example":{"date":"1947-08-15","time":"02:00:00","timezoneOffset":5.5,"latitude":27.49,"longitude":77.67,"targetDate":"2026-05-06"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/dashas/vimshottari/prana \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1947-08-15\", \"time\": \"02:00:00\", \"timezoneOffset\": 5.5, \"latitude\": 27.49, \"longitude\": 77.67, \"targetDate\": \"2026-05-06\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/dashas/vimshottari/prana', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1947-08-15\",\n    \"time\": \"02:00:00\",\n    \"timezoneOffset\": 5.5,\n    \"latitude\": 27.49,\n    \"longitude\": 77.67,\n    \"targetDate\": \"2026-05-06\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/dashas/vimshottari/prana',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1947-08-15\",\n      'time': \"02:00:00\",\n      'timezoneOffset': 5.5,\n      'latitude': 27.49,\n      'longitude': 77.67,\n      'targetDate': \"2026-05-06\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/dashas/vimshottari/prana', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1947-08-15',\n        'time' => '02:00:00',\n        'timezoneOffset' => 5.5,\n        'latitude' => 27.49,\n        'longitude' => 77.67,\n        'targetDate' => '2026-05-06',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"level":{"type":"string","nullable":true},"ayanamsa":{"type":"number","nullable":true},"nakshatra":{"type":"object","properties":{"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"nameRu":{"type":"string","nullable":true},"nameUk":{"type":"string","nullable":true},"ruler":{"type":"string","nullable":true},"startDeg":{"type":"number","nullable":true},"endDeg":{"type":"number","nullable":true},"pada":{"type":"number","nullable":true}},"nullable":true},"initial":{"type":"object","properties":{"initialPlanet":{"type":"number","nullable":true},"initialPlanetName":{"type":"string","nullable":true},"nakshatra":{"type":"number","nullable":true},"nakshatraName":{"type":"string","nullable":true},"pada":{"type":"number","nullable":true},"balanceYears":{"type":"number","nullable":true},"balanceMonths":{"type":"number","nullable":true},"balanceDays":{"type":"number","nullable":true},"elapsedYears":{"type":"number","nullable":true}},"nullable":true},"currentMaha":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"currentAntar":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"currentPratyantar":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"currentSookshma":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"periods":{"type":"array","items":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"Vimshottari","level":"prana","ayanamsa":23.125454161038185,"nakshatra":{"number":8,"name":"Pushya","nameRu":"Пушья","nameUk":"Пушья","ruler":"Saturn","startDeg":93.3333,"endDeg":106.6667,"pada":1},"initial":{"initialPlanet":6,"initialPlanetName":"Saturn","nakshatra":8,"nakshatraName":"Pushya","pada":1,"balanceYears":16,"balanceMonths":3,"balanceDays":11,"elapsedYears":2.718725762110483},"currentMaha":{"planet":4,"planetName":"Mars","startJd":2460274.089582056,"endJd":2462830.839582056,"startDate":"2023-11-25 19:38","endDate":"2030-11-25 13:38","durationYears":7},"currentAntar":{"planet":6,"planetName":"Saturn","startJd":2461147.6458320557,"endJd":2461552.464582056,"startDate":"2026-04-17 08:59","endDate":"2027-05-27 04:38","durationYears":1.1083333333333334},"currentPratyantar":{"planet":6,"planetName":"Saturn","startJd":2461147.6458320557,"endJd":2461211.742134139,"startDate":"2026-04-17 08:59","endDate":"2026-06-20 11:18","durationYears":0.17548611111111112},"currentSookshma":{"planet":2,"planetName":"Mercury","startJd":2461157.7944132187,"endJd":2461166.8747226805,"startDate":"2026-04-27 12:33","endDate":"2026-05-06 14:29","durationYears":0.02486053240740741},"periods":[{"planet":2,"planetName":"Mercury","startJd":2461157.7944132187,"endJd":2461159.0807903926,"startDate":"2026-04-27 12:33","endDate":"2026-04-28 19:26","durationYears":0.00352190875771605}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/dashas/yogini/maha":{"post":{"tags":["Vedic"],"summary":"Dashas: Yogini Mahadasha","description":"36-year Yogini Dasha. 8 yoginis (Mangala/Pingala/Dhanya/Bhramari/Bhadrika/Ulka/Siddha/Sankata) ruled by Moon/Sun/Jupiter/Mars/Mercury/Saturn/Venus/Rahu with periods 1/2/3/4/5/6/7/8 (total 36). Starts from yogini-of-Moon-nakshatra at birth, first MD truncated by elapsed nakshatra fraction.","operationId":"vedic_dashas_yogini_maha","x-quality":"yellow","x-source":"BPHS A.46 + Saptarishi Astrology + jhora yogini module. YELLOW: BPHS Yogini entry rule has 2 traditions on offset (Saptarishi vs some modern texts); this impl uses (nakshatraIndex - 1) mod 8 per JHora.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashaInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/dashas/yogini/maha \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/dashas/yogini/maha', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/dashas/yogini/maha',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/dashas/yogini/maha', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"level":{"type":"string","nullable":true},"ayanamsa":{"type":"number","nullable":true},"moonSiderealLongitude":{"type":"number","nullable":true},"nakshatra":{"type":"object","properties":{"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"nameRu":{"type":"string","nullable":true},"nameUk":{"type":"string","nullable":true},"ruler":{"type":"string","nullable":true},"startDeg":{"type":"number","nullable":true},"endDeg":{"type":"number","nullable":true},"pada":{"type":"number","nullable":true}},"nullable":true},"initial":{"type":"object","properties":{"initialPlanet":{"type":"number","nullable":true},"initialPlanetName":{"type":"string","nullable":true},"initialYoginiName":{"type":"string","nullable":true},"nakshatra":{"type":"number","nullable":true},"nakshatraName":{"type":"string","nullable":true},"pada":{"type":"number","nullable":true},"balanceYears":{"type":"number","nullable":true},"balanceMonths":{"type":"number","nullable":true},"balanceDays":{"type":"number","nullable":true},"elapsedYears":{"type":"number","nullable":true}},"nullable":true},"periods":{"type":"array","items":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"Yogini","level":"maha","ayanamsa":23.72254952235926,"moonSiderealLongitude":273.178879897163,"nakshatra":{"number":21,"name":"Uttara Ashadha","nameRu":"Уттара Ашадха","nameUk":"Уттара Ашадха","ruler":"Sun","startDeg":266.6667,"endDeg":280,"pada":2},"initial":{"initialPlanet":2,"initialPlanetName":"Mercury","initialYoginiName":"Bhadrika","nakshatra":21,"nakshatraName":"Uttara Ashadha","pada":2,"balanceYears":2,"balanceMonths":6,"balanceDays":21,"elapsedYears":2.442079961436086},"periods":[{"planet":2,"planetName":"Mercury","startJd":2448026.9791666665,"endJd":2448961.259460752,"startDate":"1990-05-15 15:29","endDate":"1992-12-04 22:13","durationYears":2.557920038563914}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/dashas/yogini/antar":{"post":{"tags":["Vedic"],"summary":"Dashas: Yogini Antardasha","description":"Yogini Antardasha: 8 sub-periods of the running MD at `targetDate` (default today UTC). Sub-period of yogini Q within MD of P: `years = (P.years × Q.years) / 36`.","operationId":"vedic_dashas_yogini_antar","x-quality":"yellow","x-source":"BPHS A.46 + jhora yogini module.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashaInput"},"example":{"date":"1947-08-15","time":"02:00:00","timezoneOffset":5.5,"latitude":27.49,"longitude":77.67,"targetDate":"2026-05-06"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/dashas/yogini/antar \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1947-08-15\", \"time\": \"02:00:00\", \"timezoneOffset\": 5.5, \"latitude\": 27.49, \"longitude\": 77.67, \"targetDate\": \"2026-05-06\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/dashas/yogini/antar', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1947-08-15\",\n    \"time\": \"02:00:00\",\n    \"timezoneOffset\": 5.5,\n    \"latitude\": 27.49,\n    \"longitude\": 77.67,\n    \"targetDate\": \"2026-05-06\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/dashas/yogini/antar',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1947-08-15\",\n      'time': \"02:00:00\",\n      'timezoneOffset': 5.5,\n      'latitude': 27.49,\n      'longitude': 77.67,\n      'targetDate': \"2026-05-06\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/dashas/yogini/antar', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1947-08-15',\n        'time' => '02:00:00',\n        'timezoneOffset' => 5.5,\n        'latitude' => 27.49,\n        'longitude' => 77.67,\n        'targetDate' => '2026-05-06',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"level":{"type":"string","nullable":true},"ayanamsa":{"type":"number","nullable":true},"moonSiderealLongitude":{"type":"number","nullable":true},"nakshatra":{"type":"object","properties":{"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"nameRu":{"type":"string","nullable":true},"nameUk":{"type":"string","nullable":true},"ruler":{"type":"string","nullable":true},"startDeg":{"type":"number","nullable":true},"endDeg":{"type":"number","nullable":true},"pada":{"type":"number","nullable":true}},"nullable":true},"initial":{"type":"object","properties":{"initialPlanet":{"type":"number","nullable":true},"initialPlanetName":{"type":"string","nullable":true},"initialYoginiName":{"type":"string","nullable":true},"nakshatra":{"type":"number","nullable":true},"nakshatraName":{"type":"string","nullable":true},"pada":{"type":"number","nullable":true},"balanceYears":{"type":"number","nullable":true},"balanceMonths":{"type":"number","nullable":true},"balanceDays":{"type":"number","nullable":true},"elapsedYears":{"type":"number","nullable":true}},"nullable":true},"currentMaha":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"periods":{"type":"array","items":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"Yogini","level":"antar","ayanamsa":23.125454161038185,"moonSiderealLongitude":95.24121106113016,"nakshatra":{"number":8,"name":"Pushya","nameRu":"Пушья","nameUk":"Пушья","ruler":"Saturn","startDeg":93.3333,"endDeg":106.6667,"pada":1},"initial":{"initialPlanet":11,"initialPlanetName":"Rahu","initialYoginiName":"Sankata","nakshatra":8,"nakshatraName":"Pushya","pada":1,"balanceYears":6,"balanceMonths":10,"balanceDays":8,"elapsedYears":1.144726636678098},"currentMaha":{"planet":11,"planetName":"Rahu","startJd":2458292.2427626196,"endJd":2461214.2427626196,"startDate":"2018-06-22 23:19","endDate":"2026-06-22 23:19","durationYears":8},"periods":[{"planet":11,"planetName":"Rahu","startJd":2458292.2427626196,"endJd":2458941.576095953,"startDate":"2018-06-22 23:19","endDate":"2020-04-02 07:19","durationYears":1.7777777777777777}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/dashas/yogini/pratyantar":{"post":{"tags":["Vedic"],"summary":"Dashas: Yogini Pratyantardasha","description":"Yogini Pratyantardasha: 3-level cascade (MD → AD → 8 PDs).","operationId":"vedic_dashas_yogini_pratyantar","x-quality":"yellow","x-source":"BPHS A.46 + jhora yogini module.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashaInput"},"example":{"date":"1947-08-15","time":"02:00:00","timezoneOffset":5.5,"latitude":27.49,"longitude":77.67,"targetDate":"2026-05-06"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/dashas/yogini/pratyantar \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1947-08-15\", \"time\": \"02:00:00\", \"timezoneOffset\": 5.5, \"latitude\": 27.49, \"longitude\": 77.67, \"targetDate\": \"2026-05-06\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/dashas/yogini/pratyantar', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1947-08-15\",\n    \"time\": \"02:00:00\",\n    \"timezoneOffset\": 5.5,\n    \"latitude\": 27.49,\n    \"longitude\": 77.67,\n    \"targetDate\": \"2026-05-06\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/dashas/yogini/pratyantar',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1947-08-15\",\n      'time': \"02:00:00\",\n      'timezoneOffset': 5.5,\n      'latitude': 27.49,\n      'longitude': 77.67,\n      'targetDate': \"2026-05-06\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/dashas/yogini/pratyantar', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1947-08-15',\n        'time' => '02:00:00',\n        'timezoneOffset' => 5.5,\n        'latitude' => 27.49,\n        'longitude' => 77.67,\n        'targetDate' => '2026-05-06',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"level":{"type":"string","nullable":true},"ayanamsa":{"type":"number","nullable":true},"moonSiderealLongitude":{"type":"number","nullable":true},"nakshatra":{"type":"object","properties":{"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"nameRu":{"type":"string","nullable":true},"nameUk":{"type":"string","nullable":true},"ruler":{"type":"string","nullable":true},"startDeg":{"type":"number","nullable":true},"endDeg":{"type":"number","nullable":true},"pada":{"type":"number","nullable":true}},"nullable":true},"initial":{"type":"object","properties":{"initialPlanet":{"type":"number","nullable":true},"initialPlanetName":{"type":"string","nullable":true},"initialYoginiName":{"type":"string","nullable":true},"nakshatra":{"type":"number","nullable":true},"nakshatraName":{"type":"string","nullable":true},"pada":{"type":"number","nullable":true},"balanceYears":{"type":"number","nullable":true},"balanceMonths":{"type":"number","nullable":true},"balanceDays":{"type":"number","nullable":true},"elapsedYears":{"type":"number","nullable":true}},"nullable":true},"currentMaha":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"currentAntar":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"periods":{"type":"array","items":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"Yogini","level":"pratyantar","ayanamsa":23.125454161038185,"moonSiderealLongitude":95.24121106113016,"nakshatra":{"number":8,"name":"Pushya","nameRu":"Пушья","nameUk":"Пушья","ruler":"Saturn","startDeg":93.3333,"endDeg":106.6667,"pada":1},"initial":{"initialPlanet":11,"initialPlanetName":"Rahu","initialYoginiName":"Sankata","nakshatra":8,"nakshatraName":"Pushya","pada":1,"balanceYears":6,"balanceMonths":10,"balanceDays":8,"elapsedYears":1.144726636678098},"currentMaha":{"planet":11,"planetName":"Rahu","startJd":2458292.2427626196,"endJd":2461214.2427626196,"startDate":"2018-06-22 23:19","endDate":"2026-06-22 23:19","durationYears":8},"currentAntar":{"planet":3,"planetName":"Venus","startJd":2460646.076095953,"endJd":2461214.2427626196,"startDate":"2024-12-01 19:19","endDate":"2026-06-22 23:19","durationYears":1.5555555555555556},"periods":[{"planet":3,"planetName":"Venus","startJd":2460646.076095953,"endJd":2460756.552947805,"startDate":"2024-12-01 19:19","endDate":"2025-03-22 06:46","durationYears":0.30246913580246915}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/dashas/yogini/sookshma":{"post":{"tags":["Vedic"],"summary":"Dashas: Yogini Sookshmadasha","description":"Yogini Sookshmadasha: 4-level cascade.","operationId":"vedic_dashas_yogini_sookshma","x-quality":"yellow","x-source":"BPHS A.46 + jhora yogini module.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashaInput"},"example":{"date":"1947-08-15","time":"02:00:00","timezoneOffset":5.5,"latitude":27.49,"longitude":77.67,"targetDate":"2026-05-06"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/dashas/yogini/sookshma \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1947-08-15\", \"time\": \"02:00:00\", \"timezoneOffset\": 5.5, \"latitude\": 27.49, \"longitude\": 77.67, \"targetDate\": \"2026-05-06\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/dashas/yogini/sookshma', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1947-08-15\",\n    \"time\": \"02:00:00\",\n    \"timezoneOffset\": 5.5,\n    \"latitude\": 27.49,\n    \"longitude\": 77.67,\n    \"targetDate\": \"2026-05-06\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/dashas/yogini/sookshma',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1947-08-15\",\n      'time': \"02:00:00\",\n      'timezoneOffset': 5.5,\n      'latitude': 27.49,\n      'longitude': 77.67,\n      'targetDate': \"2026-05-06\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/dashas/yogini/sookshma', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1947-08-15',\n        'time' => '02:00:00',\n        'timezoneOffset' => 5.5,\n        'latitude' => 27.49,\n        'longitude' => 77.67,\n        'targetDate' => '2026-05-06',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"level":{"type":"string","nullable":true},"ayanamsa":{"type":"number","nullable":true},"moonSiderealLongitude":{"type":"number","nullable":true},"nakshatra":{"type":"object","properties":{"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"nameRu":{"type":"string","nullable":true},"nameUk":{"type":"string","nullable":true},"ruler":{"type":"string","nullable":true},"startDeg":{"type":"number","nullable":true},"endDeg":{"type":"number","nullable":true},"pada":{"type":"number","nullable":true}},"nullable":true},"initial":{"type":"object","properties":{"initialPlanet":{"type":"number","nullable":true},"initialPlanetName":{"type":"string","nullable":true},"initialYoginiName":{"type":"string","nullable":true},"nakshatra":{"type":"number","nullable":true},"nakshatraName":{"type":"string","nullable":true},"pada":{"type":"number","nullable":true},"balanceYears":{"type":"number","nullable":true},"balanceMonths":{"type":"number","nullable":true},"balanceDays":{"type":"number","nullable":true},"elapsedYears":{"type":"number","nullable":true}},"nullable":true},"currentMaha":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"currentAntar":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"currentPratyantar":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"periods":{"type":"array","items":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"Yogini","level":"sookshma","ayanamsa":23.125454161038185,"moonSiderealLongitude":95.24121106113016,"nakshatra":{"number":8,"name":"Pushya","nameRu":"Пушья","nameUk":"Пушья","ruler":"Saturn","startDeg":93.3333,"endDeg":106.6667,"pada":1},"initial":{"initialPlanet":11,"initialPlanetName":"Rahu","initialYoginiName":"Sankata","nakshatra":8,"nakshatraName":"Pushya","pada":1,"balanceYears":6,"balanceMonths":10,"balanceDays":8,"elapsedYears":1.144726636678098},"currentMaha":{"planet":11,"planetName":"Rahu","startJd":2458292.2427626196,"endJd":2461214.2427626196,"startDate":"2018-06-22 23:19","endDate":"2026-06-22 23:19","durationYears":8},"currentAntar":{"planet":3,"planetName":"Venus","startJd":2460646.076095953,"endJd":2461214.2427626196,"startDate":"2024-12-01 19:19","endDate":"2026-06-22 23:19","durationYears":1.5555555555555556},"currentPratyantar":{"planet":6,"planetName":"Saturn","startJd":2461119.5483181747,"endJd":2461214.242762619,"startDate":"2026-03-20 06:39","endDate":"2026-06-22 23:19","durationYears":0.2592592592592593},"periods":[{"planet":6,"planetName":"Saturn","startJd":2461119.5483181747,"endJd":2461135.330725582,"startDate":"2026-03-20 06:39","endDate":"2026-04-05 01:26","durationYears":0.04320987654320988}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/dashas/yogini/prana":{"post":{"tags":["Vedic"],"summary":"Dashas: Yogini Pranadasha","description":"Yogini Pranadasha: 5-level cascade (finest grain).","operationId":"vedic_dashas_yogini_prana","x-quality":"yellow","x-source":"BPHS A.46 + jhora yogini module.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashaInput"},"example":{"date":"1947-08-15","time":"02:00:00","timezoneOffset":5.5,"latitude":27.49,"longitude":77.67,"targetDate":"2026-05-06"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/dashas/yogini/prana \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1947-08-15\", \"time\": \"02:00:00\", \"timezoneOffset\": 5.5, \"latitude\": 27.49, \"longitude\": 77.67, \"targetDate\": \"2026-05-06\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/dashas/yogini/prana', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1947-08-15\",\n    \"time\": \"02:00:00\",\n    \"timezoneOffset\": 5.5,\n    \"latitude\": 27.49,\n    \"longitude\": 77.67,\n    \"targetDate\": \"2026-05-06\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/dashas/yogini/prana',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1947-08-15\",\n      'time': \"02:00:00\",\n      'timezoneOffset': 5.5,\n      'latitude': 27.49,\n      'longitude': 77.67,\n      'targetDate': \"2026-05-06\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/dashas/yogini/prana', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1947-08-15',\n        'time' => '02:00:00',\n        'timezoneOffset' => 5.5,\n        'latitude' => 27.49,\n        'longitude' => 77.67,\n        'targetDate' => '2026-05-06',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"level":{"type":"string","nullable":true},"ayanamsa":{"type":"number","nullable":true},"moonSiderealLongitude":{"type":"number","nullable":true},"nakshatra":{"type":"object","properties":{"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"nameRu":{"type":"string","nullable":true},"nameUk":{"type":"string","nullable":true},"ruler":{"type":"string","nullable":true},"startDeg":{"type":"number","nullable":true},"endDeg":{"type":"number","nullable":true},"pada":{"type":"number","nullable":true}},"nullable":true},"initial":{"type":"object","properties":{"initialPlanet":{"type":"number","nullable":true},"initialPlanetName":{"type":"string","nullable":true},"initialYoginiName":{"type":"string","nullable":true},"nakshatra":{"type":"number","nullable":true},"nakshatraName":{"type":"string","nullable":true},"pada":{"type":"number","nullable":true},"balanceYears":{"type":"number","nullable":true},"balanceMonths":{"type":"number","nullable":true},"balanceDays":{"type":"number","nullable":true},"elapsedYears":{"type":"number","nullable":true}},"nullable":true},"currentMaha":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"currentAntar":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"currentPratyantar":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"currentSookshma":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"periods":{"type":"array","items":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"Yogini","level":"prana","ayanamsa":23.125454161038185,"moonSiderealLongitude":95.24121106113016,"nakshatra":{"number":8,"name":"Pushya","nameRu":"Пушья","nameUk":"Пушья","ruler":"Saturn","startDeg":93.3333,"endDeg":106.6667,"pada":1},"initial":{"initialPlanet":11,"initialPlanetName":"Rahu","initialYoginiName":"Sankata","nakshatra":8,"nakshatraName":"Pushya","pada":1,"balanceYears":6,"balanceMonths":10,"balanceDays":8,"elapsedYears":1.144726636678098},"currentMaha":{"planet":11,"planetName":"Rahu","startJd":2458292.2427626196,"endJd":2461214.2427626196,"startDate":"2018-06-22 23:19","endDate":"2026-06-22 23:19","durationYears":8},"currentAntar":{"planet":3,"planetName":"Venus","startJd":2460646.076095953,"endJd":2461214.2427626196,"startDate":"2024-12-01 19:19","endDate":"2026-06-22 23:19","durationYears":1.5555555555555556},"currentPratyantar":{"planet":6,"planetName":"Saturn","startJd":2461119.5483181747,"endJd":2461214.242762619,"startDate":"2026-03-20 06:39","endDate":"2026-06-22 23:19","durationYears":0.2592592592592593},"currentSookshma":{"planet":11,"planetName":"Rahu","startJd":2461153.7435342236,"endJd":2461174.7867441,"startDate":"2026-04-23 11:20","endDate":"2026-05-14 12:22","durationYears":0.057613168724279844},"periods":[{"planet":11,"planetName":"Rahu","startJd":2461153.7435342236,"endJd":2461158.4198030853,"startDate":"2026-04-23 11:20","endDate":"2026-04-28 03:34","durationYears":0.012802926383173298}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/dashas/ashtottari/maha":{"post":{"tags":["Vedic"],"summary":"Dashas: Ashtottari Mahadasha","description":"108-year Ashtottari Dasha (Ardradi tradition). 8 planets (Sun/Moon/Mars/Mercury/Saturn/Jupiter/Rahu/Venus) with periods 6/15/8/17/10/19/12/21 (total 108y), Ketu excluded. Mapping is block-based (4-3-4-3-3-3-4-3 nakshatras anchored at Ardra). Returns applicability flag per BPHS 46.23 (day Krishna OR night Shukla).","operationId":"vedic_dashas_ashtottari_maha","x-quality":"green","x-source":"BPHS Adhyaya 46 verses 17-23 (Santhanam translation) + PyJHora reference (jhora/horoscope/dhasa/graha/ashtottari.py).","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashaInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/dashas/ashtottari/maha \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/dashas/ashtottari/maha', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/dashas/ashtottari/maha',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/dashas/ashtottari/maha', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"level":{"type":"string","nullable":true},"ayanamsa":{"type":"number","nullable":true},"moonSiderealLongitude":{"type":"number","nullable":true},"nakshatra":{"type":"object","properties":{"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"nameRu":{"type":"string","nullable":true},"nameUk":{"type":"string","nullable":true},"ruler":{"type":"string","nullable":true},"startDeg":{"type":"number","nullable":true},"endDeg":{"type":"number","nullable":true},"pada":{"type":"number","nullable":true}},"nullable":true},"initial":{"type":"object","properties":{"initialPlanet":{"type":"number","nullable":true},"initialPlanetName":{"type":"string","nullable":true},"nakshatra":{"type":"number","nullable":true},"nakshatraName":{"type":"string","nullable":true},"pada":{"type":"number","nullable":true},"balanceYears":{"type":"number","nullable":true},"balanceMonths":{"type":"number","nullable":true},"balanceDays":{"type":"number","nullable":true},"elapsedYears":{"type":"number","nullable":true},"blockStartNakshatra":{"type":"number","nullable":true},"blockNakshatraCount":{"type":"number","nullable":true},"tradition":{"type":"string","nullable":true},"applicability":{"type":"object","properties":{"paksha":{"type":"string","nullable":true},"isDay":{"type":"boolean","nullable":true},"recommendedForChart":{"type":"boolean","nullable":true},"bphsRule":{"type":"string","nullable":true},"note":{"nullable":true}},"nullable":true}},"nullable":true},"periods":{"type":"array","items":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"Ashtottari","level":"maha","ayanamsa":23.72254952235926,"moonSiderealLongitude":273.178879897163,"nakshatra":{"number":21,"name":"Uttara Ashadha","nameRu":"Уттара Ашадха","nameUk":"Уттара Ашадха","ruler":"Sun","startDeg":266.6667,"endDeg":280,"pada":2},"initial":{"initialPlanet":6,"initialPlanetName":"Saturn","nakshatra":21,"nakshatraName":"Uttara Ashadha","pada":2,"balanceYears":5,"balanceMonths":0,"balanceDays":14,"elapsedYears":4.961386640957386,"blockStartNakshatra":20,"blockNakshatraCount":3,"tradition":"ardradi","applicability":{"paksha":"krishna","isDay":true,"recommendedForChart":true,"bphsRule":"BPHS 46.23: Ashtottari recommended when birth is in the day during Krishna paksha or at night during Shukla paksha.","note":null}},"periods":[{"planet":6,"planetName":"Saturn","startJd":2448026.9791666665,"endJd":2449867.332696057,"startDate":"1990-05-15 15:29","endDate":"1995-05-29 23:59","durationYears":5.038613359042614}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/dashas/ashtottari/antar":{"post":{"tags":["Vedic"],"summary":"Dashas: Ashtottari Antardasha","description":"Ashtottari Antardasha: 8 sub-periods of the running MD at `targetDate` (default today UTC). Sub-period of planet Q within MD of P: `years = (P.years × Q.years) / 108`.","operationId":"vedic_dashas_ashtottari_antar","x-quality":"green","x-source":"BPHS A.46 + PyJHora ashtottari module.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashaInput"},"example":{"date":"1947-08-15","time":"02:00:00","timezoneOffset":5.5,"latitude":27.49,"longitude":77.67,"targetDate":"2026-05-06"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/dashas/ashtottari/antar \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1947-08-15\", \"time\": \"02:00:00\", \"timezoneOffset\": 5.5, \"latitude\": 27.49, \"longitude\": 77.67, \"targetDate\": \"2026-05-06\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/dashas/ashtottari/antar', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1947-08-15\",\n    \"time\": \"02:00:00\",\n    \"timezoneOffset\": 5.5,\n    \"latitude\": 27.49,\n    \"longitude\": 77.67,\n    \"targetDate\": \"2026-05-06\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/dashas/ashtottari/antar',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1947-08-15\",\n      'time': \"02:00:00\",\n      'timezoneOffset': 5.5,\n      'latitude': 27.49,\n      'longitude': 77.67,\n      'targetDate': \"2026-05-06\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/dashas/ashtottari/antar', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1947-08-15',\n        'time' => '02:00:00',\n        'timezoneOffset' => 5.5,\n        'latitude' => 27.49,\n        'longitude' => 77.67,\n        'targetDate' => '2026-05-06',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"level":{"type":"string","nullable":true},"ayanamsa":{"type":"number","nullable":true},"moonSiderealLongitude":{"type":"number","nullable":true},"nakshatra":{"type":"object","properties":{"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"nameRu":{"type":"string","nullable":true},"nameUk":{"type":"string","nullable":true},"ruler":{"type":"string","nullable":true},"startDeg":{"type":"number","nullable":true},"endDeg":{"type":"number","nullable":true},"pada":{"type":"number","nullable":true}},"nullable":true},"initial":{"type":"object","properties":{"initialPlanet":{"type":"number","nullable":true},"initialPlanetName":{"type":"string","nullable":true},"nakshatra":{"type":"number","nullable":true},"nakshatraName":{"type":"string","nullable":true},"pada":{"type":"number","nullable":true},"balanceYears":{"type":"number","nullable":true},"balanceMonths":{"type":"number","nullable":true},"balanceDays":{"type":"number","nullable":true},"elapsedYears":{"type":"number","nullable":true},"blockStartNakshatra":{"type":"number","nullable":true},"blockNakshatraCount":{"type":"number","nullable":true},"tradition":{"type":"string","nullable":true},"applicability":{"type":"object","properties":{"paksha":{"type":"string","nullable":true},"isDay":{"type":"boolean","nullable":true},"recommendedForChart":{"type":"boolean","nullable":true},"bphsRule":{"type":"string","nullable":true},"note":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"currentMaha":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"periods":{"type":"array","items":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"Ashtottari","level":"antar","ayanamsa":23.125454161038185,"moonSiderealLongitude":95.24121106113016,"nakshatra":{"number":8,"name":"Pushya","nameRu":"Пушья","nameUk":"Пушья","ruler":"Saturn","startDeg":93.3333,"endDeg":106.6667,"pada":1},"initial":{"initialPlanet":0,"initialPlanetName":"Sun","nakshatra":8,"nakshatraName":"Pushya","pada":1,"balanceYears":2,"balanceMonths":9,"balanceDays":13,"elapsedYears":3.214636244377142,"blockStartNakshatra":6,"blockNakshatraCount":4,"tradition":"ardradi","applicability":{"paksha":"krishna","isDay":false,"recommendedForChart":false,"bphsRule":"BPHS 46.23: Ashtottari recommended when birth is in the day during Krishna paksha or at night during Shukla paksha.","note":"Per BPHS 46.23 this chart falls outside the Ashtottari recommendation window; Vimshottari is the canonical alternative. Engine still computes Ashtottari periods."}},"currentMaha":{"planet":11,"planetName":"Rahu","startJd":2458631.958278408,"endJd":2463014.958278408,"startDate":"2019-05-28 16:29","endDate":"2031-05-28 16:29","durationYears":12},"periods":[{"planet":11,"planetName":"Rahu","startJd":2458631.958278408,"endJd":2459118.958278408,"startDate":"2019-05-28 16:29","endDate":"2020-09-26 16:29","durationYears":1.3333333333333333}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/dashas/ashtottari/pratyantar":{"post":{"tags":["Vedic"],"summary":"Dashas: Ashtottari Pratyantardasha","description":"Ashtottari Pratyantardasha: 3-level cascade (MD → AD → 8 PDs).","operationId":"vedic_dashas_ashtottari_pratyantar","x-quality":"green","x-source":"BPHS A.46 + PyJHora ashtottari module.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashaInput"},"example":{"date":"1947-08-15","time":"02:00:00","timezoneOffset":5.5,"latitude":27.49,"longitude":77.67,"targetDate":"2026-05-06"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/dashas/ashtottari/pratyantar \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1947-08-15\", \"time\": \"02:00:00\", \"timezoneOffset\": 5.5, \"latitude\": 27.49, \"longitude\": 77.67, \"targetDate\": \"2026-05-06\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/dashas/ashtottari/pratyantar', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1947-08-15\",\n    \"time\": \"02:00:00\",\n    \"timezoneOffset\": 5.5,\n    \"latitude\": 27.49,\n    \"longitude\": 77.67,\n    \"targetDate\": \"2026-05-06\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/dashas/ashtottari/pratyantar',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1947-08-15\",\n      'time': \"02:00:00\",\n      'timezoneOffset': 5.5,\n      'latitude': 27.49,\n      'longitude': 77.67,\n      'targetDate': \"2026-05-06\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/dashas/ashtottari/pratyantar', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1947-08-15',\n        'time' => '02:00:00',\n        'timezoneOffset' => 5.5,\n        'latitude' => 27.49,\n        'longitude' => 77.67,\n        'targetDate' => '2026-05-06',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"level":{"type":"string","nullable":true},"ayanamsa":{"type":"number","nullable":true},"moonSiderealLongitude":{"type":"number","nullable":true},"nakshatra":{"type":"object","properties":{"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"nameRu":{"type":"string","nullable":true},"nameUk":{"type":"string","nullable":true},"ruler":{"type":"string","nullable":true},"startDeg":{"type":"number","nullable":true},"endDeg":{"type":"number","nullable":true},"pada":{"type":"number","nullable":true}},"nullable":true},"initial":{"type":"object","properties":{"initialPlanet":{"type":"number","nullable":true},"initialPlanetName":{"type":"string","nullable":true},"nakshatra":{"type":"number","nullable":true},"nakshatraName":{"type":"string","nullable":true},"pada":{"type":"number","nullable":true},"balanceYears":{"type":"number","nullable":true},"balanceMonths":{"type":"number","nullable":true},"balanceDays":{"type":"number","nullable":true},"elapsedYears":{"type":"number","nullable":true},"blockStartNakshatra":{"type":"number","nullable":true},"blockNakshatraCount":{"type":"number","nullable":true},"tradition":{"type":"string","nullable":true},"applicability":{"type":"object","properties":{"paksha":{"type":"string","nullable":true},"isDay":{"type":"boolean","nullable":true},"recommendedForChart":{"type":"boolean","nullable":true},"bphsRule":{"type":"string","nullable":true},"note":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"currentMaha":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"currentAntar":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"periods":{"type":"array","items":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"Ashtottari","level":"pratyantar","ayanamsa":23.125454161038185,"moonSiderealLongitude":95.24121106113016,"nakshatra":{"number":8,"name":"Pushya","nameRu":"Пушья","nameUk":"Пушья","ruler":"Saturn","startDeg":93.3333,"endDeg":106.6667,"pada":1},"initial":{"initialPlanet":0,"initialPlanetName":"Sun","nakshatra":8,"nakshatraName":"Pushya","pada":1,"balanceYears":2,"balanceMonths":9,"balanceDays":13,"elapsedYears":3.214636244377142,"blockStartNakshatra":6,"blockNakshatraCount":4,"tradition":"ardradi","applicability":{"paksha":"krishna","isDay":false,"recommendedForChart":false,"bphsRule":"BPHS 46.23: Ashtottari recommended when birth is in the day during Krishna paksha or at night during Shukla paksha.","note":"Per BPHS 46.23 this chart falls outside the Ashtottari recommendation window; Vimshottari is the canonical alternative. Engine still computes Ashtottari periods."}},"currentMaha":{"planet":11,"planetName":"Rahu","startJd":2458631.958278408,"endJd":2463014.958278408,"startDate":"2019-05-28 16:29","endDate":"2031-05-28 16:29","durationYears":12},"currentAntar":{"planet":2,"planetName":"Mercury","startJd":2461148.1249450743,"endJd":2461838.041611741,"startDate":"2026-04-17 20:29","endDate":"2028-03-07 18:29","durationYears":1.8888888888888888},"periods":[{"planet":2,"planetName":"Mercury","startJd":2461148.1249450743,"endJd":2461256.7229389013,"startDate":"2026-04-17 20:29","endDate":"2026-08-04 10:51","durationYears":0.2973251028806584}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/dashas/ashtottari/sookshma":{"post":{"tags":["Vedic"],"summary":"Dashas: Ashtottari Sookshmadasha","description":"Ashtottari Sookshmadasha: 4-level cascade.","operationId":"vedic_dashas_ashtottari_sookshma","x-quality":"green","x-source":"BPHS A.46 + PyJHora ashtottari module.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashaInput"},"example":{"date":"1947-08-15","time":"02:00:00","timezoneOffset":5.5,"latitude":27.49,"longitude":77.67,"targetDate":"2026-05-06"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/dashas/ashtottari/sookshma \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1947-08-15\", \"time\": \"02:00:00\", \"timezoneOffset\": 5.5, \"latitude\": 27.49, \"longitude\": 77.67, \"targetDate\": \"2026-05-06\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/dashas/ashtottari/sookshma', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1947-08-15\",\n    \"time\": \"02:00:00\",\n    \"timezoneOffset\": 5.5,\n    \"latitude\": 27.49,\n    \"longitude\": 77.67,\n    \"targetDate\": \"2026-05-06\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/dashas/ashtottari/sookshma',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1947-08-15\",\n      'time': \"02:00:00\",\n      'timezoneOffset': 5.5,\n      'latitude': 27.49,\n      'longitude': 77.67,\n      'targetDate': \"2026-05-06\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/dashas/ashtottari/sookshma', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1947-08-15',\n        'time' => '02:00:00',\n        'timezoneOffset' => 5.5,\n        'latitude' => 27.49,\n        'longitude' => 77.67,\n        'targetDate' => '2026-05-06',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"level":{"type":"string","nullable":true},"ayanamsa":{"type":"number","nullable":true},"moonSiderealLongitude":{"type":"number","nullable":true},"nakshatra":{"type":"object","properties":{"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"nameRu":{"type":"string","nullable":true},"nameUk":{"type":"string","nullable":true},"ruler":{"type":"string","nullable":true},"startDeg":{"type":"number","nullable":true},"endDeg":{"type":"number","nullable":true},"pada":{"type":"number","nullable":true}},"nullable":true},"initial":{"type":"object","properties":{"initialPlanet":{"type":"number","nullable":true},"initialPlanetName":{"type":"string","nullable":true},"nakshatra":{"type":"number","nullable":true},"nakshatraName":{"type":"string","nullable":true},"pada":{"type":"number","nullable":true},"balanceYears":{"type":"number","nullable":true},"balanceMonths":{"type":"number","nullable":true},"balanceDays":{"type":"number","nullable":true},"elapsedYears":{"type":"number","nullable":true},"blockStartNakshatra":{"type":"number","nullable":true},"blockNakshatraCount":{"type":"number","nullable":true},"tradition":{"type":"string","nullable":true},"applicability":{"type":"object","properties":{"paksha":{"type":"string","nullable":true},"isDay":{"type":"boolean","nullable":true},"recommendedForChart":{"type":"boolean","nullable":true},"bphsRule":{"type":"string","nullable":true},"note":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"currentMaha":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"currentAntar":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"currentPratyantar":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"periods":{"type":"array","items":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"Ashtottari","level":"sookshma","ayanamsa":23.125454161038185,"moonSiderealLongitude":95.24121106113016,"nakshatra":{"number":8,"name":"Pushya","nameRu":"Пушья","nameUk":"Пушья","ruler":"Saturn","startDeg":93.3333,"endDeg":106.6667,"pada":1},"initial":{"initialPlanet":0,"initialPlanetName":"Sun","nakshatra":8,"nakshatraName":"Pushya","pada":1,"balanceYears":2,"balanceMonths":9,"balanceDays":13,"elapsedYears":3.214636244377142,"blockStartNakshatra":6,"blockNakshatraCount":4,"tradition":"ardradi","applicability":{"paksha":"krishna","isDay":false,"recommendedForChart":false,"bphsRule":"BPHS 46.23: Ashtottari recommended when birth is in the day during Krishna paksha or at night during Shukla paksha.","note":"Per BPHS 46.23 this chart falls outside the Ashtottari recommendation window; Vimshottari is the canonical alternative. Engine still computes Ashtottari periods."}},"currentMaha":{"planet":11,"planetName":"Rahu","startJd":2458631.958278408,"endJd":2463014.958278408,"startDate":"2019-05-28 16:29","endDate":"2031-05-28 16:29","durationYears":12},"currentAntar":{"planet":2,"planetName":"Mercury","startJd":2461148.1249450743,"endJd":2461838.041611741,"startDate":"2026-04-17 20:29","endDate":"2028-03-07 18:29","durationYears":1.8888888888888888},"currentPratyantar":{"planet":2,"planetName":"Mercury","startJd":2461148.1249450743,"endJd":2461256.7229389013,"startDate":"2026-04-17 20:29","endDate":"2026-08-04 10:51","durationYears":0.2973251028806584},"periods":[{"planet":2,"planetName":"Mercury","startJd":2461148.1249450743,"endJd":2461165.2190737324,"startDate":"2026-04-17 20:29","endDate":"2026-05-04 22:45","durationYears":0.046801173601585117}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/dashas/ashtottari/prana":{"post":{"tags":["Vedic"],"summary":"Dashas: Ashtottari Pranadasha","description":"Ashtottari Pranadasha: 5-level cascade (finest grain).","operationId":"vedic_dashas_ashtottari_prana","x-quality":"green","x-source":"BPHS A.46 + PyJHora ashtottari module.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashaInput"},"example":{"date":"1947-08-15","time":"02:00:00","timezoneOffset":5.5,"latitude":27.49,"longitude":77.67,"targetDate":"2026-05-06"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/dashas/ashtottari/prana \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1947-08-15\", \"time\": \"02:00:00\", \"timezoneOffset\": 5.5, \"latitude\": 27.49, \"longitude\": 77.67, \"targetDate\": \"2026-05-06\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/dashas/ashtottari/prana', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1947-08-15\",\n    \"time\": \"02:00:00\",\n    \"timezoneOffset\": 5.5,\n    \"latitude\": 27.49,\n    \"longitude\": 77.67,\n    \"targetDate\": \"2026-05-06\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/dashas/ashtottari/prana',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1947-08-15\",\n      'time': \"02:00:00\",\n      'timezoneOffset': 5.5,\n      'latitude': 27.49,\n      'longitude': 77.67,\n      'targetDate': \"2026-05-06\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/dashas/ashtottari/prana', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1947-08-15',\n        'time' => '02:00:00',\n        'timezoneOffset' => 5.5,\n        'latitude' => 27.49,\n        'longitude' => 77.67,\n        'targetDate' => '2026-05-06',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"level":{"type":"string","nullable":true},"ayanamsa":{"type":"number","nullable":true},"moonSiderealLongitude":{"type":"number","nullable":true},"nakshatra":{"type":"object","properties":{"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"nameRu":{"type":"string","nullable":true},"nameUk":{"type":"string","nullable":true},"ruler":{"type":"string","nullable":true},"startDeg":{"type":"number","nullable":true},"endDeg":{"type":"number","nullable":true},"pada":{"type":"number","nullable":true}},"nullable":true},"initial":{"type":"object","properties":{"initialPlanet":{"type":"number","nullable":true},"initialPlanetName":{"type":"string","nullable":true},"nakshatra":{"type":"number","nullable":true},"nakshatraName":{"type":"string","nullable":true},"pada":{"type":"number","nullable":true},"balanceYears":{"type":"number","nullable":true},"balanceMonths":{"type":"number","nullable":true},"balanceDays":{"type":"number","nullable":true},"elapsedYears":{"type":"number","nullable":true},"blockStartNakshatra":{"type":"number","nullable":true},"blockNakshatraCount":{"type":"number","nullable":true},"tradition":{"type":"string","nullable":true},"applicability":{"type":"object","properties":{"paksha":{"type":"string","nullable":true},"isDay":{"type":"boolean","nullable":true},"recommendedForChart":{"type":"boolean","nullable":true},"bphsRule":{"type":"string","nullable":true},"note":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"currentMaha":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"currentAntar":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"currentPratyantar":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"currentSookshma":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"periods":{"type":"array","items":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"Ashtottari","level":"prana","ayanamsa":23.125454161038185,"moonSiderealLongitude":95.24121106113016,"nakshatra":{"number":8,"name":"Pushya","nameRu":"Пушья","nameUk":"Пушья","ruler":"Saturn","startDeg":93.3333,"endDeg":106.6667,"pada":1},"initial":{"initialPlanet":0,"initialPlanetName":"Sun","nakshatra":8,"nakshatraName":"Pushya","pada":1,"balanceYears":2,"balanceMonths":9,"balanceDays":13,"elapsedYears":3.214636244377142,"blockStartNakshatra":6,"blockNakshatraCount":4,"tradition":"ardradi","applicability":{"paksha":"krishna","isDay":false,"recommendedForChart":false,"bphsRule":"BPHS 46.23: Ashtottari recommended when birth is in the day during Krishna paksha or at night during Shukla paksha.","note":"Per BPHS 46.23 this chart falls outside the Ashtottari recommendation window; Vimshottari is the canonical alternative. Engine still computes Ashtottari periods."}},"currentMaha":{"planet":11,"planetName":"Rahu","startJd":2458631.958278408,"endJd":2463014.958278408,"startDate":"2019-05-28 16:29","endDate":"2031-05-28 16:29","durationYears":12},"currentAntar":{"planet":2,"planetName":"Mercury","startJd":2461148.1249450743,"endJd":2461838.041611741,"startDate":"2026-04-17 20:29","endDate":"2028-03-07 18:29","durationYears":1.8888888888888888},"currentPratyantar":{"planet":2,"planetName":"Mercury","startJd":2461148.1249450743,"endJd":2461256.7229389013,"startDate":"2026-04-17 20:29","endDate":"2026-08-04 10:51","durationYears":0.2973251028806584},"currentSookshma":{"planet":6,"planetName":"Saturn","startJd":2461165.2190737324,"endJd":2461175.2744435314,"startDate":"2026-05-04 22:45","endDate":"2026-05-15 00:05","durationYears":0.027530102118579484},"periods":[{"planet":6,"planetName":"Saturn","startJd":2461165.2190737324,"endJd":2461166.1501264917,"startDate":"2026-05-04 22:45","endDate":"2026-05-05 21:06","durationYears":0.0025490835294981005}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/dashas/kalachakra/maha":{"post":{"tags":["Vedic"],"summary":"Dashas: Kalachakra Mahadasha","description":"Kalachakra Dasha (rasi-dasha: Mahadasha lords are signs, not planets). 8 chakra-rows (Savya×4 + Apasavya×4); direction determined by nakshatra group (Aswini/Bharani/Krittika = Savya; Rohini/Mrigasira/Ardra = Apasavya). Total cycle (paramayu) varies per natal pada: 100/85/83/86 years. Returns the 9 Mahadashas of the running cycle from birth; first MD truncated by elapsed pada-fraction.","operationId":"vedic_dashas_kalachakra_maha","x-quality":"green","x-source":"BPHS Adhyaya 49 (Santhanam) + Saravali kala_basics/chakras/balance/antardasas + PyJHora kalachakra.py default mode.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashaInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/dashas/kalachakra/maha \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/dashas/kalachakra/maha', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/dashas/kalachakra/maha',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/dashas/kalachakra/maha', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"level":{"type":"string","nullable":true},"ayanamsa":{"type":"number","nullable":true},"moonSiderealLongitude":{"type":"number","nullable":true},"nakshatra":{"type":"object","properties":{"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"nameRu":{"type":"string","nullable":true},"nameUk":{"type":"string","nullable":true},"ruler":{"type":"string","nullable":true},"startDeg":{"type":"number","nullable":true},"endDeg":{"type":"number","nullable":true},"pada":{"type":"number","nullable":true}},"nullable":true},"initial":{"type":"object","properties":{"initialSign":{"type":"number","nullable":true},"initialSignName":{"type":"string","nullable":true},"initialSignLord":{"type":"number","nullable":true},"initialSignLordName":{"type":"string","nullable":true},"nakshatra":{"type":"number","nullable":true},"nakshatraName":{"type":"string","nullable":true},"pada":{"type":"number","nullable":true},"direction":{"type":"string","nullable":true},"chakraGroup":{"type":"string","nullable":true},"effectivePada":{"type":"number","nullable":true},"paramayu":{"type":"number","nullable":true},"chakraSequence":{"type":"array","items":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"years":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"balanceYears":{"type":"number","nullable":true},"balanceMonths":{"type":"number","nullable":true},"balanceDays":{"type":"number","nullable":true},"elapsedYears":{"type":"number","nullable":true}},"nullable":true},"periods":{"type":"array","items":{"type":"object","properties":{"signIndex":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"signLord":{"type":"number","nullable":true},"signLordName":{"type":"string","nullable":true},"rowIndex":{"type":"number","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"Kalachakra","level":"maha","ayanamsa":23.72254952235926,"moonSiderealLongitude":273.178879897163,"nakshatra":{"number":21,"name":"Uttara Ashadha","nameRu":"Уттара Ашадха","nameUk":"Уттара Ашадха","ruler":"Sun","startDeg":266.6667,"endDeg":280,"pada":2},"initial":{"initialSign":11,"initialSignName":"Pisces","initialSignLord":5,"initialSignLordName":"Jupiter","nakshatra":21,"nakshatraName":"Uttara Ashadha","pada":2,"direction":"savya","chakraGroup":"Krittika-group","effectivePada":4,"paramayu":86,"chakraSequence":[{"sign":3,"signName":"Cancer","years":21}],"balanceYears":3,"balanceMonths":11,"balanceDays":25,"elapsedYears":82.01510134680271},"periods":[{"signIndex":11,"signName":"Pisces","signLord":5,"signLordName":"Jupiter","rowIndex":8,"startJd":2448026.9791666665,"endJd":2449482.463399747,"startDate":"1990-05-15 15:29","endDate":"1994-05-10 03:07","durationYears":3.984898653197291}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/dashas/kalachakra/antar":{"post":{"tags":["Vedic"],"summary":"Dashas: Kalachakra Antardasha","description":"Kalachakra Antardasha: 9 sub-periods of the running MD at `targetDate` (default today UTC). Same chakra-row at every depth; sub-period of sign Q within MD of P: `years = (P.years × Q.years) / paramayu`.","operationId":"vedic_dashas_kalachakra_antar","x-quality":"green","x-source":"BPHS A.49 + Saravali + PyJHora.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashaInput"},"example":{"date":"1947-08-15","time":"02:00:00","timezoneOffset":5.5,"latitude":27.49,"longitude":77.67,"targetDate":"2026-05-06"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/dashas/kalachakra/antar \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1947-08-15\", \"time\": \"02:00:00\", \"timezoneOffset\": 5.5, \"latitude\": 27.49, \"longitude\": 77.67, \"targetDate\": \"2026-05-06\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/dashas/kalachakra/antar', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1947-08-15\",\n    \"time\": \"02:00:00\",\n    \"timezoneOffset\": 5.5,\n    \"latitude\": 27.49,\n    \"longitude\": 77.67,\n    \"targetDate\": \"2026-05-06\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/dashas/kalachakra/antar',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1947-08-15\",\n      'time': \"02:00:00\",\n      'timezoneOffset': 5.5,\n      'latitude': 27.49,\n      'longitude': 77.67,\n      'targetDate': \"2026-05-06\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/dashas/kalachakra/antar', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1947-08-15',\n        'time' => '02:00:00',\n        'timezoneOffset' => 5.5,\n        'latitude' => 27.49,\n        'longitude' => 77.67,\n        'targetDate' => '2026-05-06',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"level":{"type":"string","nullable":true},"ayanamsa":{"type":"number","nullable":true},"moonSiderealLongitude":{"type":"number","nullable":true},"nakshatra":{"type":"object","properties":{"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"nameRu":{"type":"string","nullable":true},"nameUk":{"type":"string","nullable":true},"ruler":{"type":"string","nullable":true},"startDeg":{"type":"number","nullable":true},"endDeg":{"type":"number","nullable":true},"pada":{"type":"number","nullable":true}},"nullable":true},"initial":{"type":"object","properties":{"initialSign":{"type":"number","nullable":true},"initialSignName":{"type":"string","nullable":true},"initialSignLord":{"type":"number","nullable":true},"initialSignLordName":{"type":"string","nullable":true},"nakshatra":{"type":"number","nullable":true},"nakshatraName":{"type":"string","nullable":true},"pada":{"type":"number","nullable":true},"direction":{"type":"string","nullable":true},"chakraGroup":{"type":"string","nullable":true},"effectivePada":{"type":"number","nullable":true},"paramayu":{"type":"number","nullable":true},"chakraSequence":{"type":"array","items":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"years":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"balanceYears":{"type":"number","nullable":true},"balanceMonths":{"type":"number","nullable":true},"balanceDays":{"type":"number","nullable":true},"elapsedYears":{"type":"number","nullable":true}},"nullable":true},"currentMaha":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"signLord":{"type":"number","nullable":true},"signLordName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"periods":{"type":"array","items":{"type":"object","properties":{"signIndex":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"signLord":{"type":"number","nullable":true},"signLordName":{"type":"string","nullable":true},"rowIndex":{"type":"number","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"Kalachakra","level":"antar","ayanamsa":23.125454161038185,"moonSiderealLongitude":95.24121106113016,"nakshatra":{"number":8,"name":"Pushya","nameRu":"Пушья","nameUk":"Пушья","ruler":"Saturn","startDeg":93.3333,"endDeg":106.6667,"pada":1},"initial":{"initialSign":5,"initialSignName":"Virgo","initialSignLord":2,"initialSignLordName":"Mercury","nakshatra":8,"nakshatraName":"Pushya","pada":1,"direction":"savya","chakraGroup":"Bharani-group","effectivePada":2,"paramayu":85,"chakraSequence":[{"sign":9,"signName":"Capricorn","years":4}],"balanceYears":1,"balanceMonths":4,"balanceDays":6,"elapsedYears":48.650882058819164},"currentMaha":{"sign":1,"signName":"Taurus","signLord":3,"signLordName":"Venus","startJd":2460664.1194946826,"endJd":2466508.1194946826,"startDate":"2024-12-19 20:22","endDate":"2040-12-19 20:22","durationYears":16},"periods":[{"signIndex":1,"signName":"Taurus","signLord":3,"signLordName":"Venus","rowIndex":0,"startJd":2460664.1194946826,"endJd":2461790.67371155,"startDate":"2024-12-19 20:22","endDate":"2028-01-20 09:40","durationYears":3.0843373493975905}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/dashas/kalachakra/pratyantar":{"post":{"tags":["Vedic"],"summary":"Dashas: Kalachakra Pratyantardasha","description":"Kalachakra Pratyantardasha: 3-level cascade (MD → AD → 9 PDs). Recursion preserves the natal chakra-row and paramayu.","operationId":"vedic_dashas_kalachakra_pratyantar","x-quality":"green","x-source":"BPHS A.49 + Saravali + PyJHora.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashaInput"},"example":{"date":"1947-08-15","time":"02:00:00","timezoneOffset":5.5,"latitude":27.49,"longitude":77.67,"targetDate":"2026-05-06"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/dashas/kalachakra/pratyantar \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1947-08-15\", \"time\": \"02:00:00\", \"timezoneOffset\": 5.5, \"latitude\": 27.49, \"longitude\": 77.67, \"targetDate\": \"2026-05-06\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/dashas/kalachakra/pratyantar', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1947-08-15\",\n    \"time\": \"02:00:00\",\n    \"timezoneOffset\": 5.5,\n    \"latitude\": 27.49,\n    \"longitude\": 77.67,\n    \"targetDate\": \"2026-05-06\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/dashas/kalachakra/pratyantar',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1947-08-15\",\n      'time': \"02:00:00\",\n      'timezoneOffset': 5.5,\n      'latitude': 27.49,\n      'longitude': 77.67,\n      'targetDate': \"2026-05-06\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/dashas/kalachakra/pratyantar', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1947-08-15',\n        'time' => '02:00:00',\n        'timezoneOffset' => 5.5,\n        'latitude' => 27.49,\n        'longitude' => 77.67,\n        'targetDate' => '2026-05-06',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"level":{"type":"string","nullable":true},"ayanamsa":{"type":"number","nullable":true},"moonSiderealLongitude":{"type":"number","nullable":true},"nakshatra":{"type":"object","properties":{"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"nameRu":{"type":"string","nullable":true},"nameUk":{"type":"string","nullable":true},"ruler":{"type":"string","nullable":true},"startDeg":{"type":"number","nullable":true},"endDeg":{"type":"number","nullable":true},"pada":{"type":"number","nullable":true}},"nullable":true},"initial":{"type":"object","properties":{"initialSign":{"type":"number","nullable":true},"initialSignName":{"type":"string","nullable":true},"initialSignLord":{"type":"number","nullable":true},"initialSignLordName":{"type":"string","nullable":true},"nakshatra":{"type":"number","nullable":true},"nakshatraName":{"type":"string","nullable":true},"pada":{"type":"number","nullable":true},"direction":{"type":"string","nullable":true},"chakraGroup":{"type":"string","nullable":true},"effectivePada":{"type":"number","nullable":true},"paramayu":{"type":"number","nullable":true},"chakraSequence":{"type":"array","items":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"years":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"balanceYears":{"type":"number","nullable":true},"balanceMonths":{"type":"number","nullable":true},"balanceDays":{"type":"number","nullable":true},"elapsedYears":{"type":"number","nullable":true}},"nullable":true},"currentMaha":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"signLord":{"type":"number","nullable":true},"signLordName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"currentAntar":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"signLord":{"type":"number","nullable":true},"signLordName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"periods":{"type":"array","items":{"type":"object","properties":{"signIndex":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"signLord":{"type":"number","nullable":true},"signLordName":{"type":"string","nullable":true},"rowIndex":{"type":"number","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"Kalachakra","level":"pratyantar","ayanamsa":23.125454161038185,"moonSiderealLongitude":95.24121106113016,"nakshatra":{"number":8,"name":"Pushya","nameRu":"Пушья","nameUk":"Пушья","ruler":"Saturn","startDeg":93.3333,"endDeg":106.6667,"pada":1},"initial":{"initialSign":5,"initialSignName":"Virgo","initialSignLord":2,"initialSignLordName":"Mercury","nakshatra":8,"nakshatraName":"Pushya","pada":1,"direction":"savya","chakraGroup":"Bharani-group","effectivePada":2,"paramayu":85,"chakraSequence":[{"sign":9,"signName":"Capricorn","years":4}],"balanceYears":1,"balanceMonths":4,"balanceDays":6,"elapsedYears":48.650882058819164},"currentMaha":{"sign":1,"signName":"Taurus","signLord":3,"signLordName":"Venus","startJd":2460664.1194946826,"endJd":2466508.1194946826,"startDate":"2024-12-19 20:22","endDate":"2040-12-19 20:22","durationYears":16},"currentAntar":{"sign":1,"signName":"Taurus","signLord":3,"signLordName":"Venus","startJd":2460664.1194946826,"endJd":2461790.67371155,"startDate":"2024-12-19 20:22","endDate":"2028-01-20 09:40","durationYears":3.0843373493975905},"periods":[{"signIndex":1,"signName":"Taurus","signLord":3,"signLordName":"Venus","rowIndex":0,"startJd":2460664.1194946826,"endJd":2460881.286572633,"startDate":"2024-12-19 20:22","endDate":"2025-07-25 00:22","durationYears":0.5945710553055596}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/dashas/kalachakra/sookshma":{"post":{"tags":["Vedic"],"summary":"Dashas: Kalachakra Sookshmadasha","description":"Kalachakra Sookshmadasha: 4-level cascade.","operationId":"vedic_dashas_kalachakra_sookshma","x-quality":"green","x-source":"BPHS A.49 + Saravali + PyJHora.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashaInput"},"example":{"date":"1947-08-15","time":"02:00:00","timezoneOffset":5.5,"latitude":27.49,"longitude":77.67,"targetDate":"2026-05-06"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/dashas/kalachakra/sookshma \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1947-08-15\", \"time\": \"02:00:00\", \"timezoneOffset\": 5.5, \"latitude\": 27.49, \"longitude\": 77.67, \"targetDate\": \"2026-05-06\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/dashas/kalachakra/sookshma', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1947-08-15\",\n    \"time\": \"02:00:00\",\n    \"timezoneOffset\": 5.5,\n    \"latitude\": 27.49,\n    \"longitude\": 77.67,\n    \"targetDate\": \"2026-05-06\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/dashas/kalachakra/sookshma',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1947-08-15\",\n      'time': \"02:00:00\",\n      'timezoneOffset': 5.5,\n      'latitude': 27.49,\n      'longitude': 77.67,\n      'targetDate': \"2026-05-06\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/dashas/kalachakra/sookshma', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1947-08-15',\n        'time' => '02:00:00',\n        'timezoneOffset' => 5.5,\n        'latitude' => 27.49,\n        'longitude' => 77.67,\n        'targetDate' => '2026-05-06',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"level":{"type":"string","nullable":true},"ayanamsa":{"type":"number","nullable":true},"moonSiderealLongitude":{"type":"number","nullable":true},"nakshatra":{"type":"object","properties":{"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"nameRu":{"type":"string","nullable":true},"nameUk":{"type":"string","nullable":true},"ruler":{"type":"string","nullable":true},"startDeg":{"type":"number","nullable":true},"endDeg":{"type":"number","nullable":true},"pada":{"type":"number","nullable":true}},"nullable":true},"initial":{"type":"object","properties":{"initialSign":{"type":"number","nullable":true},"initialSignName":{"type":"string","nullable":true},"initialSignLord":{"type":"number","nullable":true},"initialSignLordName":{"type":"string","nullable":true},"nakshatra":{"type":"number","nullable":true},"nakshatraName":{"type":"string","nullable":true},"pada":{"type":"number","nullable":true},"direction":{"type":"string","nullable":true},"chakraGroup":{"type":"string","nullable":true},"effectivePada":{"type":"number","nullable":true},"paramayu":{"type":"number","nullable":true},"chakraSequence":{"type":"array","items":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"years":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"balanceYears":{"type":"number","nullable":true},"balanceMonths":{"type":"number","nullable":true},"balanceDays":{"type":"number","nullable":true},"elapsedYears":{"type":"number","nullable":true}},"nullable":true},"currentMaha":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"signLord":{"type":"number","nullable":true},"signLordName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"currentAntar":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"signLord":{"type":"number","nullable":true},"signLordName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"currentPratyantar":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"signLord":{"type":"number","nullable":true},"signLordName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"periods":{"type":"array","items":{"type":"object","properties":{"signIndex":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"signLord":{"type":"number","nullable":true},"signLordName":{"type":"string","nullable":true},"rowIndex":{"type":"number","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"Kalachakra","level":"sookshma","ayanamsa":23.125454161038185,"moonSiderealLongitude":95.24121106113016,"nakshatra":{"number":8,"name":"Pushya","nameRu":"Пушья","nameUk":"Пушья","ruler":"Saturn","startDeg":93.3333,"endDeg":106.6667,"pada":1},"initial":{"initialSign":5,"initialSignName":"Virgo","initialSignLord":2,"initialSignLordName":"Mercury","nakshatra":8,"nakshatraName":"Pushya","pada":1,"direction":"savya","chakraGroup":"Bharani-group","effectivePada":2,"paramayu":85,"chakraSequence":[{"sign":9,"signName":"Capricorn","years":4}],"balanceYears":1,"balanceMonths":4,"balanceDays":6,"elapsedYears":48.650882058819164},"currentMaha":{"sign":1,"signName":"Taurus","signLord":3,"signLordName":"Venus","startJd":2460664.1194946826,"endJd":2466508.1194946826,"startDate":"2024-12-19 20:22","endDate":"2040-12-19 20:22","durationYears":16},"currentAntar":{"sign":1,"signName":"Taurus","signLord":3,"signLordName":"Venus","startJd":2460664.1194946826,"endJd":2461790.67371155,"startDate":"2024-12-19 20:22","endDate":"2028-01-20 09:40","durationYears":3.0843373493975905},"currentPratyantar":{"sign":9,"signName":"Capricorn","signLord":6,"signLordName":"Saturn","startJd":2461166.318362443,"endJd":2461220.6101319306,"startDate":"2026-05-06 01:08","endDate":"2026-06-29 08:08","durationYears":0.1486427638263899},"periods":[{"signIndex":9,"signName":"Capricorn","signLord":6,"signLordName":"Saturn","rowIndex":4,"startJd":2461166.318362443,"endJd":2461168.9348332617,"startDate":"2026-05-06 01:08","endDate":"2026-05-08 15:56","durationYears":0.00716350669042843}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/dashas/kalachakra/prana":{"post":{"tags":["Vedic"],"summary":"Dashas: Kalachakra Pranadasha","description":"Kalachakra Pranadasha: 5-level cascade (finest grain, minutes-scale at full depth).","operationId":"vedic_dashas_kalachakra_prana","x-quality":"green","x-source":"BPHS A.49 + Saravali + PyJHora.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashaInput"},"example":{"date":"1947-08-15","time":"02:00:00","timezoneOffset":5.5,"latitude":27.49,"longitude":77.67,"targetDate":"2026-05-06"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/dashas/kalachakra/prana \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1947-08-15\", \"time\": \"02:00:00\", \"timezoneOffset\": 5.5, \"latitude\": 27.49, \"longitude\": 77.67, \"targetDate\": \"2026-05-06\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/dashas/kalachakra/prana', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1947-08-15\",\n    \"time\": \"02:00:00\",\n    \"timezoneOffset\": 5.5,\n    \"latitude\": 27.49,\n    \"longitude\": 77.67,\n    \"targetDate\": \"2026-05-06\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/dashas/kalachakra/prana',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1947-08-15\",\n      'time': \"02:00:00\",\n      'timezoneOffset': 5.5,\n      'latitude': 27.49,\n      'longitude': 77.67,\n      'targetDate': \"2026-05-06\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/dashas/kalachakra/prana', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1947-08-15',\n        'time' => '02:00:00',\n        'timezoneOffset' => 5.5,\n        'latitude' => 27.49,\n        'longitude' => 77.67,\n        'targetDate' => '2026-05-06',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"level":{"type":"string","nullable":true},"ayanamsa":{"type":"number","nullable":true},"moonSiderealLongitude":{"type":"number","nullable":true},"nakshatra":{"type":"object","properties":{"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"nameRu":{"type":"string","nullable":true},"nameUk":{"type":"string","nullable":true},"ruler":{"type":"string","nullable":true},"startDeg":{"type":"number","nullable":true},"endDeg":{"type":"number","nullable":true},"pada":{"type":"number","nullable":true}},"nullable":true},"initial":{"type":"object","properties":{"initialSign":{"type":"number","nullable":true},"initialSignName":{"type":"string","nullable":true},"initialSignLord":{"type":"number","nullable":true},"initialSignLordName":{"type":"string","nullable":true},"nakshatra":{"type":"number","nullable":true},"nakshatraName":{"type":"string","nullable":true},"pada":{"type":"number","nullable":true},"direction":{"type":"string","nullable":true},"chakraGroup":{"type":"string","nullable":true},"effectivePada":{"type":"number","nullable":true},"paramayu":{"type":"number","nullable":true},"chakraSequence":{"type":"array","items":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"years":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"balanceYears":{"type":"number","nullable":true},"balanceMonths":{"type":"number","nullable":true},"balanceDays":{"type":"number","nullable":true},"elapsedYears":{"type":"number","nullable":true}},"nullable":true},"currentMaha":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"signLord":{"type":"number","nullable":true},"signLordName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"currentAntar":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"signLord":{"type":"number","nullable":true},"signLordName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"currentPratyantar":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"signLord":{"type":"number","nullable":true},"signLordName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"currentSookshma":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"signLord":{"type":"number","nullable":true},"signLordName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"periods":{"type":"array","items":{"type":"object","properties":{"signIndex":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"signLord":{"type":"number","nullable":true},"signLordName":{"type":"string","nullable":true},"rowIndex":{"type":"number","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"Kalachakra","level":"prana","ayanamsa":23.125454161038185,"moonSiderealLongitude":95.24121106113016,"nakshatra":{"number":8,"name":"Pushya","nameRu":"Пушья","nameUk":"Пушья","ruler":"Saturn","startDeg":93.3333,"endDeg":106.6667,"pada":1},"initial":{"initialSign":5,"initialSignName":"Virgo","initialSignLord":2,"initialSignLordName":"Mercury","nakshatra":8,"nakshatraName":"Pushya","pada":1,"direction":"savya","chakraGroup":"Bharani-group","effectivePada":2,"paramayu":85,"chakraSequence":[{"sign":9,"signName":"Capricorn","years":4}],"balanceYears":1,"balanceMonths":4,"balanceDays":6,"elapsedYears":48.650882058819164},"currentMaha":{"sign":1,"signName":"Taurus","signLord":3,"signLordName":"Venus","startJd":2460664.1194946826,"endJd":2466508.1194946826,"startDate":"2024-12-19 20:22","endDate":"2040-12-19 20:22","durationYears":16},"currentAntar":{"sign":1,"signName":"Taurus","signLord":3,"signLordName":"Venus","startJd":2460664.1194946826,"endJd":2461790.67371155,"startDate":"2024-12-19 20:22","endDate":"2028-01-20 09:40","durationYears":3.0843373493975905},"currentPratyantar":{"sign":9,"signName":"Capricorn","signLord":6,"signLordName":"Saturn","startJd":2461166.318362443,"endJd":2461220.6101319306,"startDate":"2026-05-06 01:08","endDate":"2026-06-29 08:08","durationYears":0.1486427638263899},"currentSookshma":{"sign":9,"signName":"Capricorn","signLord":6,"signLordName":"Saturn","startJd":2461166.318362443,"endJd":2461168.9348332617,"startDate":"2026-05-06 01:08","endDate":"2026-05-08 15:56","durationYears":0.00716350669042843},"periods":[{"signIndex":9,"signName":"Capricorn","signLord":6,"signLordName":"Saturn","rowIndex":4,"startJd":2461166.318362443,"endJd":2461166.444457422,"startDate":"2026-05-06 01:08","endDate":"2026-05-06 04:10","durationYears":0.0003452292380929364}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/dashas/chara/maha":{"post":{"tags":["Vedic"],"summary":"Dashas: Chara Mahadasha","description":"Chara Dasha (Jaimini rasi-dasha: Mahadasha lord = sign, not planet). 12 Mahadashas of variable duration starting at lagna sign. Direction = forward for movable+dual signs (Aries/Cancer/Libra/Capricorn/Gemini/Virgo/Sagittarius/Pisces); reverse for fixed (Taurus/Leo/Scorpio/Aquarius). Per-sign duration = inclusive count from sign to its lord (in direction) minus 1; lord-in-own-sign → 12 years. Co-lord rule for Scorpio (Mars+Ketu) and Aquarius (Saturn+Rahu): pick the OTHER if exactly one is in the sign, else higher absolute longitude. Default variant = K.N. Rao (matches PyJHora chart_method=1 + JHora default + AstroSage).","operationId":"vedic_dashas_chara_maha","x-quality":"green","x-source":"Jaimini Sutras 2.3 (Suryanarain Rao 1949) + BPHS A.49 (Santhanam) + K.N. Rao \"Predicting Through Jaimini's Chara Dasha\" (1995) + PyJHora chara.py.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashaInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/dashas/chara/maha \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/dashas/chara/maha', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/dashas/chara/maha',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/dashas/chara/maha', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"variant":{"type":"string","nullable":true},"level":{"type":"string","nullable":true},"ayanamsa":{"type":"number","nullable":true},"lagna":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"direction":{"type":"string","nullable":true}},"nullable":true},"periods":{"type":"array","items":{"type":"object","properties":{"signIndex":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"lordId":{"type":"number","nullable":true},"lordName":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"rowIndex":{"type":"number","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"Chara","variant":"kn_rao","level":"maha","ayanamsa":23.72254952235926,"lagna":{"sign":4,"signName":"Leo","direction":"reverse"},"periods":[{"signIndex":4,"signName":"Leo","lordId":0,"lordName":"Sun","durationYears":3,"startJd":2448026.9791666665,"endJd":2449122.7291666665,"startDate":"1990-05-15 15:29","endDate":"1993-05-15 09:29","rowIndex":0}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/dashas/chara/antar":{"post":{"tags":["Vedic"],"summary":"Dashas: Chara Antardasha","description":"Chara Antardasha: 12 sub-periods of the running Mahadasha at `targetDate` (default today UTC). Equal-share subdivision: each antar = parent_years / 12. Order: parent's NEXT sign first (in parent direction), parent sign LAST (per K.N. Rao).","operationId":"vedic_dashas_chara_antar","x-quality":"green","x-source":"Jaimini Sutras 2.3 + BPHS A.49 + K.N. Rao 1995 + PyJHora.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashaInput"},"example":{"date":"1947-08-15","time":"02:00:00","timezoneOffset":5.5,"latitude":27.49,"longitude":77.67,"targetDate":"2026-05-06"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/dashas/chara/antar \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1947-08-15\", \"time\": \"02:00:00\", \"timezoneOffset\": 5.5, \"latitude\": 27.49, \"longitude\": 77.67, \"targetDate\": \"2026-05-06\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/dashas/chara/antar', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1947-08-15\",\n    \"time\": \"02:00:00\",\n    \"timezoneOffset\": 5.5,\n    \"latitude\": 27.49,\n    \"longitude\": 77.67,\n    \"targetDate\": \"2026-05-06\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/dashas/chara/antar',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1947-08-15\",\n      'time': \"02:00:00\",\n      'timezoneOffset': 5.5,\n      'latitude': 27.49,\n      'longitude': 77.67,\n      'targetDate': \"2026-05-06\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/dashas/chara/antar', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1947-08-15',\n        'time' => '02:00:00',\n        'timezoneOffset' => 5.5,\n        'latitude' => 27.49,\n        'longitude' => 77.67,\n        'targetDate' => '2026-05-06',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"variant":{"type":"string","nullable":true},"level":{"type":"string","nullable":true},"ayanamsa":{"type":"number","nullable":true},"lagna":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"direction":{"type":"string","nullable":true}},"nullable":true},"currentMaha":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"lord":{"type":"number","nullable":true},"lordName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"periods":{"type":"array","items":{"type":"object","properties":{"signIndex":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"lordId":{"type":"number","nullable":true},"lordName":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"rowIndex":{"type":"number","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"Chara","variant":"kn_rao","level":"antar","ayanamsa":23.125454161038185,"lagna":{"sign":2,"signName":"Gemini","direction":"forward"},"currentMaha":{"sign":0,"signName":"Aries","lord":4,"lordName":"Mars","startJd":2460901.8541666665,"endJd":2461632.3541666665,"startDate":"2025-08-14 13:59","endDate":"2027-08-15 01:59","durationYears":2},"periods":[{"signIndex":1,"signName":"Taurus","lordId":3,"lordName":"Venus","durationYears":0.16666666666666666,"startJd":2460901.8541666665,"endJd":2460962.7291666665,"startDate":"2025-08-14 13:59","endDate":"2025-10-14 10:59","rowIndex":0}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/dashas/chara/pratyantar":{"post":{"tags":["Vedic"],"summary":"Dashas: Chara Pratyantardasha","description":"Chara Pratyantardasha: 3-level cascade (MD → AD → 12 PDs). Recursive equal-share subdivision; same direction at every depth.","operationId":"vedic_dashas_chara_pratyantar","x-quality":"green","x-source":"Jaimini Sutras 2.3 + BPHS A.49 + K.N. Rao 1995 + PyJHora.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashaInput"},"example":{"date":"1947-08-15","time":"02:00:00","timezoneOffset":5.5,"latitude":27.49,"longitude":77.67,"targetDate":"2026-05-06"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/dashas/chara/pratyantar \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1947-08-15\", \"time\": \"02:00:00\", \"timezoneOffset\": 5.5, \"latitude\": 27.49, \"longitude\": 77.67, \"targetDate\": \"2026-05-06\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/dashas/chara/pratyantar', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1947-08-15\",\n    \"time\": \"02:00:00\",\n    \"timezoneOffset\": 5.5,\n    \"latitude\": 27.49,\n    \"longitude\": 77.67,\n    \"targetDate\": \"2026-05-06\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/dashas/chara/pratyantar',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1947-08-15\",\n      'time': \"02:00:00\",\n      'timezoneOffset': 5.5,\n      'latitude': 27.49,\n      'longitude': 77.67,\n      'targetDate': \"2026-05-06\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/dashas/chara/pratyantar', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1947-08-15',\n        'time' => '02:00:00',\n        'timezoneOffset' => 5.5,\n        'latitude' => 27.49,\n        'longitude' => 77.67,\n        'targetDate' => '2026-05-06',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"variant":{"type":"string","nullable":true},"level":{"type":"string","nullable":true},"ayanamsa":{"type":"number","nullable":true},"lagna":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"direction":{"type":"string","nullable":true}},"nullable":true},"currentMaha":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"lord":{"type":"number","nullable":true},"lordName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"currentAntar":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"lord":{"type":"number","nullable":true},"lordName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"periods":{"type":"array","items":{"type":"object","properties":{"signIndex":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"lordId":{"type":"number","nullable":true},"lordName":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"rowIndex":{"type":"number","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"Chara","variant":"kn_rao","level":"pratyantar","ayanamsa":23.125454161038185,"lagna":{"sign":2,"signName":"Gemini","direction":"forward"},"currentMaha":{"sign":0,"signName":"Aries","lord":4,"lordName":"Mars","startJd":2460901.8541666665,"endJd":2461632.3541666665,"startDate":"2025-08-14 13:59","endDate":"2027-08-15 01:59","durationYears":2},"currentAntar":{"sign":5,"signName":"Virgo","lord":2,"lordName":"Mercury","startJd":2461145.3541666665,"endJd":2461206.2291666665,"startDate":"2026-04-15 01:59","endDate":"2026-06-14 22:59","durationYears":0.16666666666666666},"periods":[{"signIndex":6,"signName":"Libra","lordId":3,"lordName":"Venus","durationYears":0.013888888888888888,"startJd":2461145.3541666665,"endJd":2461150.427083333,"startDate":"2026-04-15 01:59","endDate":"2026-04-20 03:44","rowIndex":0}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/dashas/chara/sookshma":{"post":{"tags":["Vedic"],"summary":"Dashas: Chara Sookshmadasha","description":"Chara Sookshmadasha: 4-level cascade.","operationId":"vedic_dashas_chara_sookshma","x-quality":"green","x-source":"Jaimini Sutras 2.3 + BPHS A.49 + K.N. Rao 1995 + PyJHora.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashaInput"},"example":{"date":"1947-08-15","time":"02:00:00","timezoneOffset":5.5,"latitude":27.49,"longitude":77.67,"targetDate":"2026-05-06"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/dashas/chara/sookshma \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1947-08-15\", \"time\": \"02:00:00\", \"timezoneOffset\": 5.5, \"latitude\": 27.49, \"longitude\": 77.67, \"targetDate\": \"2026-05-06\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/dashas/chara/sookshma', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1947-08-15\",\n    \"time\": \"02:00:00\",\n    \"timezoneOffset\": 5.5,\n    \"latitude\": 27.49,\n    \"longitude\": 77.67,\n    \"targetDate\": \"2026-05-06\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/dashas/chara/sookshma',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1947-08-15\",\n      'time': \"02:00:00\",\n      'timezoneOffset': 5.5,\n      'latitude': 27.49,\n      'longitude': 77.67,\n      'targetDate': \"2026-05-06\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/dashas/chara/sookshma', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1947-08-15',\n        'time' => '02:00:00',\n        'timezoneOffset' => 5.5,\n        'latitude' => 27.49,\n        'longitude' => 77.67,\n        'targetDate' => '2026-05-06',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"variant":{"type":"string","nullable":true},"level":{"type":"string","nullable":true},"ayanamsa":{"type":"number","nullable":true},"lagna":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"direction":{"type":"string","nullable":true}},"nullable":true},"currentMaha":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"lord":{"type":"number","nullable":true},"lordName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"currentAntar":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"lord":{"type":"number","nullable":true},"lordName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"currentPratyantar":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"lord":{"type":"number","nullable":true},"lordName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"periods":{"type":"array","items":{"type":"object","properties":{"signIndex":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"lordId":{"type":"number","nullable":true},"lordName":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"rowIndex":{"type":"number","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"Chara","variant":"kn_rao","level":"sookshma","ayanamsa":23.125454161038185,"lagna":{"sign":2,"signName":"Gemini","direction":"forward"},"currentMaha":{"sign":0,"signName":"Aries","lord":4,"lordName":"Mars","startJd":2460901.8541666665,"endJd":2461632.3541666665,"startDate":"2025-08-14 13:59","endDate":"2027-08-15 01:59","durationYears":2},"currentAntar":{"sign":5,"signName":"Virgo","lord":2,"lordName":"Mercury","startJd":2461145.3541666665,"endJd":2461206.2291666665,"startDate":"2026-04-15 01:59","endDate":"2026-06-14 22:59","durationYears":0.16666666666666666},"currentPratyantar":{"sign":10,"signName":"Aquarius","lord":6,"lordName":"Saturn","startJd":2461165.6458333326,"endJd":2461170.718749999,"startDate":"2026-05-05 08:59","endDate":"2026-05-10 10:44","durationYears":0.013888888888888888},"periods":[{"signIndex":11,"signName":"Pisces","lordId":5,"lordName":"Jupiter","durationYears":0.0011574074074074073,"startJd":2461165.6458333326,"endJd":2461166.068576388,"startDate":"2026-05-05 08:59","endDate":"2026-05-05 19:08","rowIndex":0}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/dashas/chara/prana":{"post":{"tags":["Vedic"],"summary":"Dashas: Chara Pranadasha","description":"Chara Pranadasha: 5-level cascade (finest grain). Minute-scale duration at full depth.","operationId":"vedic_dashas_chara_prana","x-quality":"green","x-source":"Jaimini Sutras 2.3 + BPHS A.49 + K.N. Rao 1995 + PyJHora.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashaInput"},"example":{"date":"1947-08-15","time":"02:00:00","timezoneOffset":5.5,"latitude":27.49,"longitude":77.67,"targetDate":"2026-05-06"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/dashas/chara/prana \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1947-08-15\", \"time\": \"02:00:00\", \"timezoneOffset\": 5.5, \"latitude\": 27.49, \"longitude\": 77.67, \"targetDate\": \"2026-05-06\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/dashas/chara/prana', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1947-08-15\",\n    \"time\": \"02:00:00\",\n    \"timezoneOffset\": 5.5,\n    \"latitude\": 27.49,\n    \"longitude\": 77.67,\n    \"targetDate\": \"2026-05-06\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/dashas/chara/prana',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1947-08-15\",\n      'time': \"02:00:00\",\n      'timezoneOffset': 5.5,\n      'latitude': 27.49,\n      'longitude': 77.67,\n      'targetDate': \"2026-05-06\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/dashas/chara/prana', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1947-08-15',\n        'time' => '02:00:00',\n        'timezoneOffset' => 5.5,\n        'latitude' => 27.49,\n        'longitude' => 77.67,\n        'targetDate' => '2026-05-06',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"variant":{"type":"string","nullable":true},"level":{"type":"string","nullable":true},"ayanamsa":{"type":"number","nullable":true},"lagna":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"direction":{"type":"string","nullable":true}},"nullable":true},"currentMaha":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"lord":{"type":"number","nullable":true},"lordName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"currentAntar":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"lord":{"type":"number","nullable":true},"lordName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"currentPratyantar":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"lord":{"type":"number","nullable":true},"lordName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"currentSookshma":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"lord":{"type":"number","nullable":true},"lordName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"periods":{"type":"array","items":{"type":"object","properties":{"signIndex":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"lordId":{"type":"number","nullable":true},"lordName":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"rowIndex":{"type":"number","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"Chara","variant":"kn_rao","level":"prana","ayanamsa":23.125454161038185,"lagna":{"sign":2,"signName":"Gemini","direction":"forward"},"currentMaha":{"sign":0,"signName":"Aries","lord":4,"lordName":"Mars","startJd":2460901.8541666665,"endJd":2461632.3541666665,"startDate":"2025-08-14 13:59","endDate":"2027-08-15 01:59","durationYears":2},"currentAntar":{"sign":5,"signName":"Virgo","lord":2,"lordName":"Mercury","startJd":2461145.3541666665,"endJd":2461206.2291666665,"startDate":"2026-04-15 01:59","endDate":"2026-06-14 22:59","durationYears":0.16666666666666666},"currentPratyantar":{"sign":10,"signName":"Aquarius","lord":6,"lordName":"Saturn","startJd":2461165.6458333326,"endJd":2461170.718749999,"startDate":"2026-05-05 08:59","endDate":"2026-05-10 10:44","durationYears":0.013888888888888888},"currentSookshma":{"sign":1,"signName":"Taurus","lord":3,"lordName":"Venus","startJd":2461166.4913194436,"endJd":2461166.914062499,"startDate":"2026-05-06 05:17","endDate":"2026-05-06 15:26","durationYears":0.0011574074074074073},"periods":[{"signIndex":2,"signName":"Gemini","lordId":2,"lordName":"Mercury","durationYears":0.00009645061728395061,"startJd":2461166.4913194436,"endJd":2461166.5265480317,"startDate":"2026-05-06 05:17","endDate":"2026-05-06 06:08","rowIndex":0}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/dashas/tribhagi/maha":{"post":{"tags":["Vedic"],"summary":"Dashas: Tribhagi Mahadasha","description":"Tribhagi Dasha: 1/3-scale variant of Vimshottari (40-year cycle). Same 9-planet sequence (Ketu→Venus→Sun→Moon→Mars→Rahu→Jupiter→Saturn→Mercury) and same nakshatra-mapping rule, all periods × (1/3): Ketu 7/3, Venus 20/3, Sun 2, Moon 10/3, etc. Useful when finer-grain timing is needed within a Vimshottari-equivalent span. Returns the running cycle of 9 mahadashas from the chart's initial-balance-adjusted birth time.","operationId":"vedic_dashas_tribhagi_maha","x-quality":"green","x-source":"Sage Satyacharya tradition (PVR Narasimha Rao \"Vedic Astrology: An Integrated Approach\") + PyJHora vimsottari.py use_tribhagi_variation=True.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashaInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/dashas/tribhagi/maha \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/dashas/tribhagi/maha', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/dashas/tribhagi/maha',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/dashas/tribhagi/maha', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"level":{"type":"string","nullable":true},"ayanamsa":{"type":"number","nullable":true},"moonSiderealLongitude":{"type":"number","nullable":true},"nakshatra":{"type":"object","properties":{"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"nameRu":{"type":"string","nullable":true},"nameUk":{"type":"string","nullable":true},"ruler":{"type":"string","nullable":true},"startDeg":{"type":"number","nullable":true},"endDeg":{"type":"number","nullable":true},"pada":{"type":"number","nullable":true}},"nullable":true},"initial":{"type":"object","properties":{"initialPlanet":{"type":"string","nullable":true},"fullPeriodYears":{"type":"number","nullable":true},"elapsedYears":{"type":"number","nullable":true},"balanceYears":{"type":"number","nullable":true},"balanceFmt":{"type":"string","nullable":true},"pada":{"type":"number","nullable":true},"scale":{"type":"string","nullable":true}},"nullable":true},"periods":{"type":"array","items":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"Tribhagi","level":"maha","ayanamsa":23.72254952235926,"moonSiderealLongitude":273.178879897163,"nakshatra":{"number":21,"name":"Uttara Ashadha","nameRu":"Уттара Ашадха","nameUk":"Уттара Ашадха","ruler":"Sun","startDeg":266.6667,"endDeg":280,"pada":2},"initial":{"initialPlanet":"Sun","fullPeriodYears":2,"elapsedYears":0.9768319845744343,"balanceYears":1.0231680154255658,"balanceFmt":"1y 0m 8d","pada":2,"scale":"1/3 of Vimshottari (40-year cycle)"},"periods":[{"planet":0,"planetName":"Sun","startJd":2448026.9791666665,"endJd":2448400.6912843008,"startDate":"1990-05-15 15:29","endDate":"1991-05-24 08:35","durationYears":1.0231680154255658}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/dashas/tribhagi/antar":{"post":{"tags":["Vedic"],"summary":"Dashas: Tribhagi Antardasha","description":"Tribhagi Antardasha: 9 sub-periods of the running MD at `targetDate`. Recursive proportional split (parent_years × sub_planet_period / 40).","operationId":"vedic_dashas_tribhagi_antar","x-quality":"green","x-source":"PVR Narasimha Rao + PyJHora.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashaInput"},"example":{"date":"1947-08-15","time":"02:00:00","timezoneOffset":5.5,"latitude":27.49,"longitude":77.67,"targetDate":"2026-05-06"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/dashas/tribhagi/antar \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1947-08-15\", \"time\": \"02:00:00\", \"timezoneOffset\": 5.5, \"latitude\": 27.49, \"longitude\": 77.67, \"targetDate\": \"2026-05-06\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/dashas/tribhagi/antar', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1947-08-15\",\n    \"time\": \"02:00:00\",\n    \"timezoneOffset\": 5.5,\n    \"latitude\": 27.49,\n    \"longitude\": 77.67,\n    \"targetDate\": \"2026-05-06\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/dashas/tribhagi/antar',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1947-08-15\",\n      'time': \"02:00:00\",\n      'timezoneOffset': 5.5,\n      'latitude': 27.49,\n      'longitude': 77.67,\n      'targetDate': \"2026-05-06\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/dashas/tribhagi/antar', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1947-08-15',\n        'time' => '02:00:00',\n        'timezoneOffset' => 5.5,\n        'latitude' => 27.49,\n        'longitude' => 77.67,\n        'targetDate' => '2026-05-06',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"level":{"type":"string","nullable":true},"ayanamsa":{"type":"number","nullable":true},"moonSiderealLongitude":{"type":"number","nullable":true},"nakshatra":{"type":"object","properties":{"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"nameRu":{"type":"string","nullable":true},"nameUk":{"type":"string","nullable":true},"ruler":{"type":"string","nullable":true},"startDeg":{"type":"number","nullable":true},"endDeg":{"type":"number","nullable":true},"pada":{"type":"number","nullable":true}},"nullable":true},"initial":{"type":"object","properties":{"initialPlanet":{"type":"string","nullable":true},"fullPeriodYears":{"type":"number","nullable":true},"elapsedYears":{"type":"number","nullable":true},"balanceYears":{"type":"number","nullable":true},"balanceFmt":{"type":"string","nullable":true},"pada":{"type":"number","nullable":true},"scale":{"type":"string","nullable":true}},"nullable":true},"currentMaha":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"periods":{"type":"array","items":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"Tribhagi","level":"antar","ayanamsa":23.125454161038185,"moonSiderealLongitude":95.24121106113016,"nakshatra":{"number":8,"name":"Pushya","nameRu":"Пушья","nameUk":"Пушья","ruler":"Saturn","startDeg":93.3333,"endDeg":106.6667,"pada":1},"initial":{"initialPlanet":"Saturn","fullPeriodYears":6.333333333333333,"elapsedYears":0.9062419207034942,"balanceYears":5.427091412629839,"balanceFmt":"5y 5m 4d","pada":1,"scale":"1/3 of Vimshottari (40-year cycle)"},"currentMaha":{"planet":5,"planetName":"Jupiter","startJd":2459353.3493051296,"endJd":2461301.3493051296,"startDate":"2021-05-19 01:52","endDate":"2026-09-18 01:52","durationYears":5.333333333333333},"periods":[{"planet":5,"planetName":"Jupiter","startJd":2459353.3493051296,"endJd":2459613.082638463,"startDate":"2021-05-19 01:52","endDate":"2022-02-02 19:28","durationYears":0.711111111111111}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/dashas/tribhagi/pratyantar":{"post":{"tags":["Vedic"],"summary":"Dashas: Tribhagi Pratyantardasha","description":"Tribhagi Pratyantardasha: 3-level cascade (MD → AD → 9 PDs).","operationId":"vedic_dashas_tribhagi_pratyantar","x-quality":"green","x-source":"PVR Narasimha Rao + PyJHora.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashaInput"},"example":{"date":"1947-08-15","time":"02:00:00","timezoneOffset":5.5,"latitude":27.49,"longitude":77.67,"targetDate":"2026-05-06"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/dashas/tribhagi/pratyantar \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1947-08-15\", \"time\": \"02:00:00\", \"timezoneOffset\": 5.5, \"latitude\": 27.49, \"longitude\": 77.67, \"targetDate\": \"2026-05-06\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/dashas/tribhagi/pratyantar', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1947-08-15\",\n    \"time\": \"02:00:00\",\n    \"timezoneOffset\": 5.5,\n    \"latitude\": 27.49,\n    \"longitude\": 77.67,\n    \"targetDate\": \"2026-05-06\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/dashas/tribhagi/pratyantar',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1947-08-15\",\n      'time': \"02:00:00\",\n      'timezoneOffset': 5.5,\n      'latitude': 27.49,\n      'longitude': 77.67,\n      'targetDate': \"2026-05-06\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/dashas/tribhagi/pratyantar', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1947-08-15',\n        'time' => '02:00:00',\n        'timezoneOffset' => 5.5,\n        'latitude' => 27.49,\n        'longitude' => 77.67,\n        'targetDate' => '2026-05-06',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"level":{"type":"string","nullable":true},"ayanamsa":{"type":"number","nullable":true},"moonSiderealLongitude":{"type":"number","nullable":true},"nakshatra":{"type":"object","properties":{"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"nameRu":{"type":"string","nullable":true},"nameUk":{"type":"string","nullable":true},"ruler":{"type":"string","nullable":true},"startDeg":{"type":"number","nullable":true},"endDeg":{"type":"number","nullable":true},"pada":{"type":"number","nullable":true}},"nullable":true},"initial":{"type":"object","properties":{"initialPlanet":{"type":"string","nullable":true},"fullPeriodYears":{"type":"number","nullable":true},"elapsedYears":{"type":"number","nullable":true},"balanceYears":{"type":"number","nullable":true},"balanceFmt":{"type":"string","nullable":true},"pada":{"type":"number","nullable":true},"scale":{"type":"string","nullable":true}},"nullable":true},"currentMaha":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"currentAntar":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"periods":{"type":"array","items":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"Tribhagi","level":"pratyantar","ayanamsa":23.125454161038185,"moonSiderealLongitude":95.24121106113016,"nakshatra":{"number":8,"name":"Pushya","nameRu":"Пушья","nameUk":"Пушья","ruler":"Saturn","startDeg":93.3333,"endDeg":106.6667,"pada":1},"initial":{"initialPlanet":"Saturn","fullPeriodYears":6.333333333333333,"elapsedYears":0.9062419207034942,"balanceYears":5.427091412629839,"balanceFmt":"5y 5m 4d","pada":1,"scale":"1/3 of Vimshottari (40-year cycle)"},"currentMaha":{"planet":5,"planetName":"Jupiter","startJd":2459353.3493051296,"endJd":2461301.3493051296,"startDate":"2021-05-19 01:52","endDate":"2026-09-18 01:52","durationYears":5.333333333333333},"currentAntar":{"planet":11,"planetName":"Rahu","startJd":2461009.1493051294,"endJd":2461301.3493051296,"startDate":"2025-11-29 21:04","endDate":"2026-09-18 01:52","durationYears":0.8},"periods":[{"planet":11,"planetName":"Rahu","startJd":2461009.1493051294,"endJd":2461052.9793051295,"startDate":"2025-11-29 21:04","endDate":"2026-01-12 17:00","durationYears":0.12000000000000002}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/dashas/tribhagi/sookshma":{"post":{"tags":["Vedic"],"summary":"Dashas: Tribhagi Sookshmadasha","description":"Tribhagi Sookshmadasha: 4-level cascade.","operationId":"vedic_dashas_tribhagi_sookshma","x-quality":"green","x-source":"PVR Narasimha Rao + PyJHora.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashaInput"},"example":{"date":"1947-08-15","time":"02:00:00","timezoneOffset":5.5,"latitude":27.49,"longitude":77.67,"targetDate":"2026-05-06"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/dashas/tribhagi/sookshma \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1947-08-15\", \"time\": \"02:00:00\", \"timezoneOffset\": 5.5, \"latitude\": 27.49, \"longitude\": 77.67, \"targetDate\": \"2026-05-06\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/dashas/tribhagi/sookshma', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1947-08-15\",\n    \"time\": \"02:00:00\",\n    \"timezoneOffset\": 5.5,\n    \"latitude\": 27.49,\n    \"longitude\": 77.67,\n    \"targetDate\": \"2026-05-06\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/dashas/tribhagi/sookshma',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1947-08-15\",\n      'time': \"02:00:00\",\n      'timezoneOffset': 5.5,\n      'latitude': 27.49,\n      'longitude': 77.67,\n      'targetDate': \"2026-05-06\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/dashas/tribhagi/sookshma', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1947-08-15',\n        'time' => '02:00:00',\n        'timezoneOffset' => 5.5,\n        'latitude' => 27.49,\n        'longitude' => 77.67,\n        'targetDate' => '2026-05-06',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"level":{"type":"string","nullable":true},"ayanamsa":{"type":"number","nullable":true},"moonSiderealLongitude":{"type":"number","nullable":true},"nakshatra":{"type":"object","properties":{"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"nameRu":{"type":"string","nullable":true},"nameUk":{"type":"string","nullable":true},"ruler":{"type":"string","nullable":true},"startDeg":{"type":"number","nullable":true},"endDeg":{"type":"number","nullable":true},"pada":{"type":"number","nullable":true}},"nullable":true},"initial":{"type":"object","properties":{"initialPlanet":{"type":"string","nullable":true},"fullPeriodYears":{"type":"number","nullable":true},"elapsedYears":{"type":"number","nullable":true},"balanceYears":{"type":"number","nullable":true},"balanceFmt":{"type":"string","nullable":true},"pada":{"type":"number","nullable":true},"scale":{"type":"string","nullable":true}},"nullable":true},"currentMaha":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"currentAntar":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"currentPratyantar":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"periods":{"type":"array","items":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"Tribhagi","level":"sookshma","ayanamsa":23.125454161038185,"moonSiderealLongitude":95.24121106113016,"nakshatra":{"number":8,"name":"Pushya","nameRu":"Пушья","nameUk":"Пушья","ruler":"Saturn","startDeg":93.3333,"endDeg":106.6667,"pada":1},"initial":{"initialPlanet":"Saturn","fullPeriodYears":6.333333333333333,"elapsedYears":0.9062419207034942,"balanceYears":5.427091412629839,"balanceFmt":"5y 5m 4d","pada":1,"scale":"1/3 of Vimshottari (40-year cycle)"},"currentMaha":{"planet":5,"planetName":"Jupiter","startJd":2459353.3493051296,"endJd":2461301.3493051296,"startDate":"2021-05-19 01:52","endDate":"2026-09-18 01:52","durationYears":5.333333333333333},"currentAntar":{"planet":11,"planetName":"Rahu","startJd":2461009.1493051294,"endJd":2461301.3493051296,"startDate":"2025-11-29 21:04","endDate":"2026-09-18 01:52","durationYears":0.8},"currentPratyantar":{"planet":2,"planetName":"Mercury","startJd":2461138.2043051296,"endJd":2461179.5993051296,"startDate":"2026-04-07 22:24","endDate":"2026-05-19 07:52","durationYears":0.11333333333333333},"periods":[{"planet":2,"planetName":"Mercury","startJd":2461138.2043051296,"endJd":2461144.068596796,"startDate":"2026-04-07 22:24","endDate":"2026-04-13 19:08","durationYears":0.016055555555555552}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/dashas/tribhagi/prana":{"post":{"tags":["Vedic"],"summary":"Dashas: Tribhagi Pranadasha","description":"Tribhagi Pranadasha: 5-level cascade (finest grain).","operationId":"vedic_dashas_tribhagi_prana","x-quality":"green","x-source":"PVR Narasimha Rao + PyJHora.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashaInput"},"example":{"date":"1947-08-15","time":"02:00:00","timezoneOffset":5.5,"latitude":27.49,"longitude":77.67,"targetDate":"2026-05-06"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/dashas/tribhagi/prana \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1947-08-15\", \"time\": \"02:00:00\", \"timezoneOffset\": 5.5, \"latitude\": 27.49, \"longitude\": 77.67, \"targetDate\": \"2026-05-06\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/dashas/tribhagi/prana', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1947-08-15\",\n    \"time\": \"02:00:00\",\n    \"timezoneOffset\": 5.5,\n    \"latitude\": 27.49,\n    \"longitude\": 77.67,\n    \"targetDate\": \"2026-05-06\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/dashas/tribhagi/prana',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1947-08-15\",\n      'time': \"02:00:00\",\n      'timezoneOffset': 5.5,\n      'latitude': 27.49,\n      'longitude': 77.67,\n      'targetDate': \"2026-05-06\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/dashas/tribhagi/prana', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1947-08-15',\n        'time' => '02:00:00',\n        'timezoneOffset' => 5.5,\n        'latitude' => 27.49,\n        'longitude' => 77.67,\n        'targetDate' => '2026-05-06',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"level":{"type":"string","nullable":true},"ayanamsa":{"type":"number","nullable":true},"moonSiderealLongitude":{"type":"number","nullable":true},"nakshatra":{"type":"object","properties":{"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"nameRu":{"type":"string","nullable":true},"nameUk":{"type":"string","nullable":true},"ruler":{"type":"string","nullable":true},"startDeg":{"type":"number","nullable":true},"endDeg":{"type":"number","nullable":true},"pada":{"type":"number","nullable":true}},"nullable":true},"initial":{"type":"object","properties":{"initialPlanet":{"type":"string","nullable":true},"fullPeriodYears":{"type":"number","nullable":true},"elapsedYears":{"type":"number","nullable":true},"balanceYears":{"type":"number","nullable":true},"balanceFmt":{"type":"string","nullable":true},"pada":{"type":"number","nullable":true},"scale":{"type":"string","nullable":true}},"nullable":true},"currentMaha":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"currentAntar":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"currentPratyantar":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"currentSookshma":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"periods":{"type":"array","items":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"Tribhagi","level":"prana","ayanamsa":23.125454161038185,"moonSiderealLongitude":95.24121106113016,"nakshatra":{"number":8,"name":"Pushya","nameRu":"Пушья","nameUk":"Пушья","ruler":"Saturn","startDeg":93.3333,"endDeg":106.6667,"pada":1},"initial":{"initialPlanet":"Saturn","fullPeriodYears":6.333333333333333,"elapsedYears":0.9062419207034942,"balanceYears":5.427091412629839,"balanceFmt":"5y 5m 4d","pada":1,"scale":"1/3 of Vimshottari (40-year cycle)"},"currentMaha":{"planet":5,"planetName":"Jupiter","startJd":2459353.3493051296,"endJd":2461301.3493051296,"startDate":"2021-05-19 01:52","endDate":"2026-09-18 01:52","durationYears":5.333333333333333},"currentAntar":{"planet":11,"planetName":"Rahu","startJd":2461009.1493051294,"endJd":2461301.3493051296,"startDate":"2025-11-29 21:04","endDate":"2026-09-18 01:52","durationYears":0.8},"currentPratyantar":{"planet":2,"planetName":"Mercury","startJd":2461138.2043051296,"endJd":2461179.5993051296,"startDate":"2026-04-07 22:24","endDate":"2026-05-19 07:52","durationYears":0.11333333333333333},"currentSookshma":{"planet":11,"planetName":"Rahu","startJd":2461161.316513463,"endJd":2461167.5257634628,"startDate":"2026-05-01 01:05","endDate":"2026-05-07 06:07","durationYears":0.016999999999999998},"periods":[{"planet":11,"planetName":"Rahu","startJd":2461161.316513463,"endJd":2461162.247900963,"startDate":"2026-05-01 01:05","endDate":"2026-05-01 23:26","durationYears":0.0025499999999999993}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/dashas/shatabdika/maha":{"post":{"tags":["Vedic"],"summary":"Dashas: Shatabdika Mahadasha","description":"Shatabdika Dasha: 100-year nakshatra dasha cycle (BPHS Adhyaya 46 group). 7 planets (no shadow planets), seed nakshatra = Revati (27). Sequence: Sun(5)→Moon(5)→Venus(10)→Mercury(10)→Jupiter(20)→Mars(20)→Saturn(30). Distribution: 6 planets get 4 nakshatras each, Saturn gets 3. Standard nakshatra-fraction × period balance rule. Algorithm port of PyJHora sataatbika.py.","operationId":"vedic_dashas_shatabdika_maha","x-quality":"yellow","x-source":"BPHS Adhyaya 46 + PyJHora sataatbika.py (canonical reference impl).","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashaInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/dashas/shatabdika/maha \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/dashas/shatabdika/maha', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/dashas/shatabdika/maha',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/dashas/shatabdika/maha', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"level":{"type":"string","nullable":true},"ayanamsa":{"type":"number","nullable":true},"moonSiderealLongitude":{"type":"number","nullable":true},"nakshatra":{"type":"object","properties":{"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"nameRu":{"type":"string","nullable":true},"nameUk":{"type":"string","nullable":true},"ruler":{"type":"string","nullable":true},"startDeg":{"type":"number","nullable":true},"endDeg":{"type":"number","nullable":true},"pada":{"type":"number","nullable":true}},"nullable":true},"initial":{"type":"object","properties":{"initialPlanet":{"type":"string","nullable":true},"fullPeriodYears":{"type":"number","nullable":true},"elapsedYears":{"type":"number","nullable":true},"balanceYears":{"type":"number","nullable":true},"balanceFmt":{"type":"string","nullable":true},"pada":{"type":"number","nullable":true},"seedNakshatra":{"type":"string","nullable":true},"cycleYears":{"type":"number","nullable":true},"applicabilityNote":{"type":"string","nullable":true}},"nullable":true},"periods":{"type":"array","items":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"Shatabdika","level":"maha","ayanamsa":23.72254952235926,"moonSiderealLongitude":273.178879897163,"nakshatra":{"number":21,"name":"Uttara Ashadha","nameRu":"Уттара Ашадха","nameUk":"Уттара Ашадха","ruler":"Sun","startDeg":266.6667,"endDeg":280,"pada":2},"initial":{"initialPlanet":"Sun","fullPeriodYears":5,"elapsedYears":2.442079961436086,"balanceYears":2.557920038563914,"balanceFmt":"2y 6m 21d","pada":2,"seedNakshatra":"Revati (27)","cycleYears":100,"applicabilityNote":"BPHS recommends Shatabdika when lagna sign equals navamsa-lagna sign; informational only, dasha is computed regardless."},"periods":[{"planet":0,"planetName":"Sun","startJd":2448026.9791666665,"endJd":2448961.259460752,"startDate":"1990-05-15 15:29","endDate":"1992-12-04 22:13","durationYears":2.557920038563914}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/dashas/shatabdika/antar":{"post":{"tags":["Vedic"],"summary":"Dashas: Shatabdika Antardasha","description":"Shatabdika Antardasha: 7 sub-periods of the running MD at `targetDate`. Recursive proportional split (parent_years × sub_planet_period / 100).","operationId":"vedic_dashas_shatabdika_antar","x-quality":"yellow","x-source":"PyJHora sataatbika.py.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashaInput"},"example":{"date":"1947-08-15","time":"02:00:00","timezoneOffset":5.5,"latitude":27.49,"longitude":77.67,"targetDate":"2026-05-06"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/dashas/shatabdika/antar \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1947-08-15\", \"time\": \"02:00:00\", \"timezoneOffset\": 5.5, \"latitude\": 27.49, \"longitude\": 77.67, \"targetDate\": \"2026-05-06\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/dashas/shatabdika/antar', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1947-08-15\",\n    \"time\": \"02:00:00\",\n    \"timezoneOffset\": 5.5,\n    \"latitude\": 27.49,\n    \"longitude\": 77.67,\n    \"targetDate\": \"2026-05-06\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/dashas/shatabdika/antar',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1947-08-15\",\n      'time': \"02:00:00\",\n      'timezoneOffset': 5.5,\n      'latitude': 27.49,\n      'longitude': 77.67,\n      'targetDate': \"2026-05-06\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/dashas/shatabdika/antar', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1947-08-15',\n        'time' => '02:00:00',\n        'timezoneOffset' => 5.5,\n        'latitude' => 27.49,\n        'longitude' => 77.67,\n        'targetDate' => '2026-05-06',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"level":{"type":"string","nullable":true},"ayanamsa":{"type":"number","nullable":true},"moonSiderealLongitude":{"type":"number","nullable":true},"nakshatra":{"type":"object","properties":{"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"nameRu":{"type":"string","nullable":true},"nameUk":{"type":"string","nullable":true},"ruler":{"type":"string","nullable":true},"startDeg":{"type":"number","nullable":true},"endDeg":{"type":"number","nullable":true},"pada":{"type":"number","nullable":true}},"nullable":true},"initial":{"type":"object","properties":{"initialPlanet":{"type":"string","nullable":true},"fullPeriodYears":{"type":"number","nullable":true},"elapsedYears":{"type":"number","nullable":true},"balanceYears":{"type":"number","nullable":true},"balanceFmt":{"type":"string","nullable":true},"pada":{"type":"number","nullable":true},"seedNakshatra":{"type":"string","nullable":true},"cycleYears":{"type":"number","nullable":true},"applicabilityNote":{"type":"string","nullable":true}},"nullable":true},"currentMaha":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"periods":{"type":"array","items":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"Shatabdika","level":"antar","ayanamsa":23.125454161038185,"moonSiderealLongitude":95.24121106113016,"nakshatra":{"number":8,"name":"Pushya","nameRu":"Пушья","nameUk":"Пушья","ruler":"Saturn","startDeg":93.3333,"endDeg":106.6667,"pada":1},"initial":{"initialPlanet":"Moon","fullPeriodYears":5,"elapsedYears":0.7154541479238112,"balanceYears":4.284545852076189,"balanceFmt":"4y 3m 13d","pada":1,"seedNakshatra":"Revati (27)","cycleYears":100,"applicabilityNote":"BPHS recommends Shatabdika when lagna sign equals navamsa-lagna sign; informational only, dasha is computed regardless."},"currentMaha":{"planet":6,"planetName":"Saturn","startJd":2455892.2845391375,"endJd":2466849.7845391375,"startDate":"2011-11-27 00:19","endDate":"2041-11-26 12:19","durationYears":30},"periods":[{"planet":6,"planetName":"Saturn","startJd":2455892.2845391375,"endJd":2459179.5345391375,"startDate":"2011-11-27 00:19","endDate":"2020-11-26 06:19","durationYears":9}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/dashas/shatabdika/pratyantar":{"post":{"tags":["Vedic"],"summary":"Dashas: Shatabdika Pratyantardasha","description":"Shatabdika Pratyantardasha: 3-level cascade (MD → AD → 7 PDs).","operationId":"vedic_dashas_shatabdika_pratyantar","x-quality":"yellow","x-source":"PyJHora sataatbika.py.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashaInput"},"example":{"date":"1947-08-15","time":"02:00:00","timezoneOffset":5.5,"latitude":27.49,"longitude":77.67,"targetDate":"2026-05-06"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/dashas/shatabdika/pratyantar \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1947-08-15\", \"time\": \"02:00:00\", \"timezoneOffset\": 5.5, \"latitude\": 27.49, \"longitude\": 77.67, \"targetDate\": \"2026-05-06\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/dashas/shatabdika/pratyantar', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1947-08-15\",\n    \"time\": \"02:00:00\",\n    \"timezoneOffset\": 5.5,\n    \"latitude\": 27.49,\n    \"longitude\": 77.67,\n    \"targetDate\": \"2026-05-06\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/dashas/shatabdika/pratyantar',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1947-08-15\",\n      'time': \"02:00:00\",\n      'timezoneOffset': 5.5,\n      'latitude': 27.49,\n      'longitude': 77.67,\n      'targetDate': \"2026-05-06\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/dashas/shatabdika/pratyantar', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1947-08-15',\n        'time' => '02:00:00',\n        'timezoneOffset' => 5.5,\n        'latitude' => 27.49,\n        'longitude' => 77.67,\n        'targetDate' => '2026-05-06',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"level":{"type":"string","nullable":true},"ayanamsa":{"type":"number","nullable":true},"moonSiderealLongitude":{"type":"number","nullable":true},"nakshatra":{"type":"object","properties":{"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"nameRu":{"type":"string","nullable":true},"nameUk":{"type":"string","nullable":true},"ruler":{"type":"string","nullable":true},"startDeg":{"type":"number","nullable":true},"endDeg":{"type":"number","nullable":true},"pada":{"type":"number","nullable":true}},"nullable":true},"initial":{"type":"object","properties":{"initialPlanet":{"type":"string","nullable":true},"fullPeriodYears":{"type":"number","nullable":true},"elapsedYears":{"type":"number","nullable":true},"balanceYears":{"type":"number","nullable":true},"balanceFmt":{"type":"string","nullable":true},"pada":{"type":"number","nullable":true},"seedNakshatra":{"type":"string","nullable":true},"cycleYears":{"type":"number","nullable":true},"applicabilityNote":{"type":"string","nullable":true}},"nullable":true},"currentMaha":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"currentAntar":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"periods":{"type":"array","items":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"Shatabdika","level":"pratyantar","ayanamsa":23.125454161038185,"moonSiderealLongitude":95.24121106113016,"nakshatra":{"number":8,"name":"Pushya","nameRu":"Пушья","nameUk":"Пушья","ruler":"Saturn","startDeg":93.3333,"endDeg":106.6667,"pada":1},"initial":{"initialPlanet":"Moon","fullPeriodYears":5,"elapsedYears":0.7154541479238112,"balanceYears":4.284545852076189,"balanceFmt":"4y 3m 13d","pada":1,"seedNakshatra":"Revati (27)","cycleYears":100,"applicabilityNote":"BPHS recommends Shatabdika when lagna sign equals navamsa-lagna sign; informational only, dasha is computed regardless."},"currentMaha":{"planet":6,"planetName":"Saturn","startJd":2455892.2845391375,"endJd":2466849.7845391375,"startDate":"2011-11-27 00:19","endDate":"2041-11-26 12:19","durationYears":30},"currentAntar":{"planet":3,"planetName":"Venus","startJd":2460275.2845391375,"endJd":2461371.0345391375,"startDate":"2023-11-27 00:19","endDate":"2026-11-26 18:19","durationYears":3},"periods":[{"planet":3,"planetName":"Venus","startJd":2460275.2845391375,"endJd":2460384.8595391377,"startDate":"2023-11-27 00:19","endDate":"2024-03-15 14:07","durationYears":0.3}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/dashas/shatabdika/sookshma":{"post":{"tags":["Vedic"],"summary":"Dashas: Shatabdika Sookshmadasha","description":"Shatabdika Sookshmadasha: 4-level cascade.","operationId":"vedic_dashas_shatabdika_sookshma","x-quality":"yellow","x-source":"PyJHora sataatbika.py.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashaInput"},"example":{"date":"1947-08-15","time":"02:00:00","timezoneOffset":5.5,"latitude":27.49,"longitude":77.67,"targetDate":"2026-05-06"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/dashas/shatabdika/sookshma \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1947-08-15\", \"time\": \"02:00:00\", \"timezoneOffset\": 5.5, \"latitude\": 27.49, \"longitude\": 77.67, \"targetDate\": \"2026-05-06\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/dashas/shatabdika/sookshma', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1947-08-15\",\n    \"time\": \"02:00:00\",\n    \"timezoneOffset\": 5.5,\n    \"latitude\": 27.49,\n    \"longitude\": 77.67,\n    \"targetDate\": \"2026-05-06\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/dashas/shatabdika/sookshma',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1947-08-15\",\n      'time': \"02:00:00\",\n      'timezoneOffset': 5.5,\n      'latitude': 27.49,\n      'longitude': 77.67,\n      'targetDate': \"2026-05-06\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/dashas/shatabdika/sookshma', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1947-08-15',\n        'time' => '02:00:00',\n        'timezoneOffset' => 5.5,\n        'latitude' => 27.49,\n        'longitude' => 77.67,\n        'targetDate' => '2026-05-06',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"level":{"type":"string","nullable":true},"ayanamsa":{"type":"number","nullable":true},"moonSiderealLongitude":{"type":"number","nullable":true},"nakshatra":{"type":"object","properties":{"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"nameRu":{"type":"string","nullable":true},"nameUk":{"type":"string","nullable":true},"ruler":{"type":"string","nullable":true},"startDeg":{"type":"number","nullable":true},"endDeg":{"type":"number","nullable":true},"pada":{"type":"number","nullable":true}},"nullable":true},"initial":{"type":"object","properties":{"initialPlanet":{"type":"string","nullable":true},"fullPeriodYears":{"type":"number","nullable":true},"elapsedYears":{"type":"number","nullable":true},"balanceYears":{"type":"number","nullable":true},"balanceFmt":{"type":"string","nullable":true},"pada":{"type":"number","nullable":true},"seedNakshatra":{"type":"string","nullable":true},"cycleYears":{"type":"number","nullable":true},"applicabilityNote":{"type":"string","nullable":true}},"nullable":true},"currentMaha":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"currentAntar":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"currentPratyantar":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"periods":{"type":"array","items":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"Shatabdika","level":"sookshma","ayanamsa":23.125454161038185,"moonSiderealLongitude":95.24121106113016,"nakshatra":{"number":8,"name":"Pushya","nameRu":"Пушья","nameUk":"Пушья","ruler":"Saturn","startDeg":93.3333,"endDeg":106.6667,"pada":1},"initial":{"initialPlanet":"Moon","fullPeriodYears":5,"elapsedYears":0.7154541479238112,"balanceYears":4.284545852076189,"balanceFmt":"4y 3m 13d","pada":1,"seedNakshatra":"Revati (27)","cycleYears":100,"applicabilityNote":"BPHS recommends Shatabdika when lagna sign equals navamsa-lagna sign; informational only, dasha is computed regardless."},"currentMaha":{"planet":6,"planetName":"Saturn","startJd":2455892.2845391375,"endJd":2466849.7845391375,"startDate":"2011-11-27 00:19","endDate":"2041-11-26 12:19","durationYears":30},"currentAntar":{"planet":3,"planetName":"Venus","startJd":2460275.2845391375,"endJd":2461371.0345391375,"startDate":"2023-11-27 00:19","endDate":"2026-11-26 18:19","durationYears":3},"currentPratyantar":{"planet":6,"planetName":"Saturn","startJd":2460932.7345391377,"endJd":2461261.459539138,"startDate":"2025-09-14 11:07","endDate":"2026-08-09 04:31","durationYears":0.9},"periods":[{"planet":6,"planetName":"Saturn","startJd":2460932.7345391377,"endJd":2461031.352039138,"startDate":"2025-09-14 11:07","endDate":"2025-12-22 01:56","durationYears":0.27}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/dashas/shatabdika/prana":{"post":{"tags":["Vedic"],"summary":"Dashas: Shatabdika Pranadasha","description":"Shatabdika Pranadasha: 5-level cascade (finest grain).","operationId":"vedic_dashas_shatabdika_prana","x-quality":"yellow","x-source":"PyJHora sataatbika.py.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashaInput"},"example":{"date":"1947-08-15","time":"02:00:00","timezoneOffset":5.5,"latitude":27.49,"longitude":77.67,"targetDate":"2026-05-06"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/dashas/shatabdika/prana \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1947-08-15\", \"time\": \"02:00:00\", \"timezoneOffset\": 5.5, \"latitude\": 27.49, \"longitude\": 77.67, \"targetDate\": \"2026-05-06\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/dashas/shatabdika/prana', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1947-08-15\",\n    \"time\": \"02:00:00\",\n    \"timezoneOffset\": 5.5,\n    \"latitude\": 27.49,\n    \"longitude\": 77.67,\n    \"targetDate\": \"2026-05-06\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/dashas/shatabdika/prana',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1947-08-15\",\n      'time': \"02:00:00\",\n      'timezoneOffset': 5.5,\n      'latitude': 27.49,\n      'longitude': 77.67,\n      'targetDate': \"2026-05-06\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/dashas/shatabdika/prana', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1947-08-15',\n        'time' => '02:00:00',\n        'timezoneOffset' => 5.5,\n        'latitude' => 27.49,\n        'longitude' => 77.67,\n        'targetDate' => '2026-05-06',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"level":{"type":"string","nullable":true},"ayanamsa":{"type":"number","nullable":true},"moonSiderealLongitude":{"type":"number","nullable":true},"nakshatra":{"type":"object","properties":{"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"nameRu":{"type":"string","nullable":true},"nameUk":{"type":"string","nullable":true},"ruler":{"type":"string","nullable":true},"startDeg":{"type":"number","nullable":true},"endDeg":{"type":"number","nullable":true},"pada":{"type":"number","nullable":true}},"nullable":true},"initial":{"type":"object","properties":{"initialPlanet":{"type":"string","nullable":true},"fullPeriodYears":{"type":"number","nullable":true},"elapsedYears":{"type":"number","nullable":true},"balanceYears":{"type":"number","nullable":true},"balanceFmt":{"type":"string","nullable":true},"pada":{"type":"number","nullable":true},"seedNakshatra":{"type":"string","nullable":true},"cycleYears":{"type":"number","nullable":true},"applicabilityNote":{"type":"string","nullable":true}},"nullable":true},"currentMaha":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"currentAntar":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"currentPratyantar":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"currentSookshma":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"periods":{"type":"array","items":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"Shatabdika","level":"prana","ayanamsa":23.125454161038185,"moonSiderealLongitude":95.24121106113016,"nakshatra":{"number":8,"name":"Pushya","nameRu":"Пушья","nameUk":"Пушья","ruler":"Saturn","startDeg":93.3333,"endDeg":106.6667,"pada":1},"initial":{"initialPlanet":"Moon","fullPeriodYears":5,"elapsedYears":0.7154541479238112,"balanceYears":4.284545852076189,"balanceFmt":"4y 3m 13d","pada":1,"seedNakshatra":"Revati (27)","cycleYears":100,"applicabilityNote":"BPHS recommends Shatabdika when lagna sign equals navamsa-lagna sign; informational only, dasha is computed regardless."},"currentMaha":{"planet":6,"planetName":"Saturn","startJd":2455892.2845391375,"endJd":2466849.7845391375,"startDate":"2011-11-27 00:19","endDate":"2041-11-26 12:19","durationYears":30},"currentAntar":{"planet":3,"planetName":"Venus","startJd":2460275.2845391375,"endJd":2461371.0345391375,"startDate":"2023-11-27 00:19","endDate":"2026-11-26 18:19","durationYears":3},"currentPratyantar":{"planet":6,"planetName":"Saturn","startJd":2460932.7345391377,"endJd":2461261.459539138,"startDate":"2025-09-14 11:07","endDate":"2026-08-09 04:31","durationYears":0.9},"currentSookshma":{"planet":5,"planetName":"Jupiter","startJd":2461129.9695391376,"endJd":2461195.7145391377,"startDate":"2026-03-30 16:46","endDate":"2026-06-04 10:38","durationYears":0.18},"periods":[{"planet":5,"planetName":"Jupiter","startJd":2461129.9695391376,"endJd":2461143.1185391378,"startDate":"2026-03-30 16:46","endDate":"2026-04-12 20:20","durationYears":0.036}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/dashas/shodashottari/maha":{"post":{"tags":["Vedic"],"summary":"Dashas: Shodashottari Mahadasha","description":"Shodashottari Dasha: 116-year nakshatra dasha cycle (BPHS Adhyaya 46 group). 8 planets (Rahu excluded, Ketu included), seed nakshatra = Pushya (8). Sequence: Sun(11)→Mars(12)→Jupiter(13)→Saturn(14)→Ketu(15)→Moon(16)→Mercury(17)→Venus(18). Distribution: 3 planets get 4 nakshatras, 5 get 3. Per AmatyaKaraka tradition: applicable when lagna in Chandra hora during Krishna paksha OR Surya hora during Shukla paksha (informational; dasha is computed regardless). Algorithm port of PyJHora shodasottari.py.","operationId":"vedic_dashas_shodashottari_maha","x-quality":"yellow","x-source":"BPHS Adhyaya 46 + PyJHora shodasottari.py (canonical reference impl).","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashaInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/dashas/shodashottari/maha \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/dashas/shodashottari/maha', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/dashas/shodashottari/maha',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/dashas/shodashottari/maha', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"level":{"type":"string","nullable":true},"ayanamsa":{"type":"number","nullable":true},"moonSiderealLongitude":{"type":"number","nullable":true},"nakshatra":{"type":"object","properties":{"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"nameRu":{"type":"string","nullable":true},"nameUk":{"type":"string","nullable":true},"ruler":{"type":"string","nullable":true},"startDeg":{"type":"number","nullable":true},"endDeg":{"type":"number","nullable":true},"pada":{"type":"number","nullable":true}},"nullable":true},"initial":{"type":"object","properties":{"initialPlanet":{"type":"string","nullable":true},"fullPeriodYears":{"type":"number","nullable":true},"elapsedYears":{"type":"number","nullable":true},"balanceYears":{"type":"number","nullable":true},"balanceFmt":{"type":"string","nullable":true},"pada":{"type":"number","nullable":true},"seedNakshatra":{"type":"string","nullable":true},"cycleYears":{"type":"number","nullable":true},"applicabilityNote":{"type":"string","nullable":true}},"nullable":true},"periods":{"type":"array","items":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"Shodashottari","level":"maha","ayanamsa":23.72254952235926,"moonSiderealLongitude":273.178879897163,"nakshatra":{"number":21,"name":"Uttara Ashadha","nameRu":"Уттара Ашадха","nameUk":"Уттара Ашадха","ruler":"Sun","startDeg":266.6667,"endDeg":280,"pada":2},"initial":{"initialPlanet":"Moon","fullPeriodYears":16,"elapsedYears":7.814655876595475,"balanceYears":8.185344123404526,"balanceFmt":"8y 2m 7d","pada":2,"seedNakshatra":"Pushya (8)","cycleYears":116,"applicabilityNote":"Per AmatyaKaraka tradition: applicable when lagna in Chandra hora during Krishna paksha OR Surya hora during Shukla paksha. Surfaced informationally; dasha is computed regardless. PyJHora source notes the hora gate is \"TODO\" even there."},"periods":[{"planet":1,"planetName":"Moon","startJd":2448026.9791666665,"endJd":2451016.67610774,"startDate":"1990-05-15 15:29","endDate":"1998-07-22 08:13","durationYears":8.185344123404526}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/dashas/shodashottari/antar":{"post":{"tags":["Vedic"],"summary":"Dashas: Shodashottari Antardasha","description":"Shodashottari Antardasha: 8 sub-periods of the running MD at `targetDate`. Recursive proportional split (parent_years × sub_planet_period / 116).","operationId":"vedic_dashas_shodashottari_antar","x-quality":"yellow","x-source":"PyJHora shodasottari.py.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashaInput"},"example":{"date":"1947-08-15","time":"02:00:00","timezoneOffset":5.5,"latitude":27.49,"longitude":77.67,"targetDate":"2026-05-06"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/dashas/shodashottari/antar \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1947-08-15\", \"time\": \"02:00:00\", \"timezoneOffset\": 5.5, \"latitude\": 27.49, \"longitude\": 77.67, \"targetDate\": \"2026-05-06\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/dashas/shodashottari/antar', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1947-08-15\",\n    \"time\": \"02:00:00\",\n    \"timezoneOffset\": 5.5,\n    \"latitude\": 27.49,\n    \"longitude\": 77.67,\n    \"targetDate\": \"2026-05-06\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/dashas/shodashottari/antar',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1947-08-15\",\n      'time': \"02:00:00\",\n      'timezoneOffset': 5.5,\n      'latitude': 27.49,\n      'longitude': 77.67,\n      'targetDate': \"2026-05-06\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/dashas/shodashottari/antar', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1947-08-15',\n        'time' => '02:00:00',\n        'timezoneOffset' => 5.5,\n        'latitude' => 27.49,\n        'longitude' => 77.67,\n        'targetDate' => '2026-05-06',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"level":{"type":"string","nullable":true},"ayanamsa":{"type":"number","nullable":true},"moonSiderealLongitude":{"type":"number","nullable":true},"nakshatra":{"type":"object","properties":{"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"nameRu":{"type":"string","nullable":true},"nameUk":{"type":"string","nullable":true},"ruler":{"type":"string","nullable":true},"startDeg":{"type":"number","nullable":true},"endDeg":{"type":"number","nullable":true},"pada":{"type":"number","nullable":true}},"nullable":true},"initial":{"type":"object","properties":{"initialPlanet":{"type":"string","nullable":true},"fullPeriodYears":{"type":"number","nullable":true},"elapsedYears":{"type":"number","nullable":true},"balanceYears":{"type":"number","nullable":true},"balanceFmt":{"type":"string","nullable":true},"pada":{"type":"number","nullable":true},"seedNakshatra":{"type":"string","nullable":true},"cycleYears":{"type":"number","nullable":true},"applicabilityNote":{"type":"string","nullable":true}},"nullable":true},"currentMaha":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"periods":{"type":"array","items":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"Shodashottari","level":"antar","ayanamsa":23.125454161038185,"moonSiderealLongitude":95.24121106113016,"nakshatra":{"number":8,"name":"Pushya","nameRu":"Пушья","nameUk":"Пушья","ruler":"Saturn","startDeg":93.3333,"endDeg":106.6667,"pada":1},"initial":{"initialPlanet":"Sun","fullPeriodYears":11,"elapsedYears":1.5739991254323846,"balanceYears":9.426000874567615,"balanceFmt":"9y 5m 3d","pada":1,"seedNakshatra":"Pushya (8)","cycleYears":116,"applicabilityNote":"Per AmatyaKaraka tradition: applicable when lagna in Chandra hora during Krishna paksha OR Surya hora during Shukla paksha. Surfaced informationally; dasha is computed regardless. PyJHora source notes the hora gate is \"TODO\" even there."},"currentMaha":{"planet":1,"planetName":"Moon","startJd":2455578.700986102,"endJd":2461422.700986102,"startDate":"2011-01-17 10:19","endDate":"2027-01-17 10:19","durationYears":16},"periods":[{"planet":1,"planetName":"Moon","startJd":2455578.700986102,"endJd":2456384.7699516197,"startDate":"2011-01-17 10:19","endDate":"2013-04-02 11:58","durationYears":2.206896551724138}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/dashas/shodashottari/pratyantar":{"post":{"tags":["Vedic"],"summary":"Dashas: Shodashottari Pratyantardasha","description":"Shodashottari Pratyantardasha: 3-level cascade (MD → AD → 8 PDs).","operationId":"vedic_dashas_shodashottari_pratyantar","x-quality":"yellow","x-source":"PyJHora shodasottari.py.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashaInput"},"example":{"date":"1947-08-15","time":"02:00:00","timezoneOffset":5.5,"latitude":27.49,"longitude":77.67,"targetDate":"2026-05-06"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/dashas/shodashottari/pratyantar \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1947-08-15\", \"time\": \"02:00:00\", \"timezoneOffset\": 5.5, \"latitude\": 27.49, \"longitude\": 77.67, \"targetDate\": \"2026-05-06\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/dashas/shodashottari/pratyantar', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1947-08-15\",\n    \"time\": \"02:00:00\",\n    \"timezoneOffset\": 5.5,\n    \"latitude\": 27.49,\n    \"longitude\": 77.67,\n    \"targetDate\": \"2026-05-06\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/dashas/shodashottari/pratyantar',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1947-08-15\",\n      'time': \"02:00:00\",\n      'timezoneOffset': 5.5,\n      'latitude': 27.49,\n      'longitude': 77.67,\n      'targetDate': \"2026-05-06\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/dashas/shodashottari/pratyantar', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1947-08-15',\n        'time' => '02:00:00',\n        'timezoneOffset' => 5.5,\n        'latitude' => 27.49,\n        'longitude' => 77.67,\n        'targetDate' => '2026-05-06',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"level":{"type":"string","nullable":true},"ayanamsa":{"type":"number","nullable":true},"moonSiderealLongitude":{"type":"number","nullable":true},"nakshatra":{"type":"object","properties":{"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"nameRu":{"type":"string","nullable":true},"nameUk":{"type":"string","nullable":true},"ruler":{"type":"string","nullable":true},"startDeg":{"type":"number","nullable":true},"endDeg":{"type":"number","nullable":true},"pada":{"type":"number","nullable":true}},"nullable":true},"initial":{"type":"object","properties":{"initialPlanet":{"type":"string","nullable":true},"fullPeriodYears":{"type":"number","nullable":true},"elapsedYears":{"type":"number","nullable":true},"balanceYears":{"type":"number","nullable":true},"balanceFmt":{"type":"string","nullable":true},"pada":{"type":"number","nullable":true},"seedNakshatra":{"type":"string","nullable":true},"cycleYears":{"type":"number","nullable":true},"applicabilityNote":{"type":"string","nullable":true}},"nullable":true},"currentMaha":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"currentAntar":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"periods":{"type":"array","items":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"Shodashottari","level":"pratyantar","ayanamsa":23.125454161038185,"moonSiderealLongitude":95.24121106113016,"nakshatra":{"number":8,"name":"Pushya","nameRu":"Пушья","nameUk":"Пушья","ruler":"Saturn","startDeg":93.3333,"endDeg":106.6667,"pada":1},"initial":{"initialPlanet":"Sun","fullPeriodYears":11,"elapsedYears":1.5739991254323846,"balanceYears":9.426000874567615,"balanceFmt":"9y 5m 3d","pada":1,"seedNakshatra":"Pushya (8)","cycleYears":116,"applicabilityNote":"Per AmatyaKaraka tradition: applicable when lagna in Chandra hora during Krishna paksha OR Surya hora during Shukla paksha. Surfaced informationally; dasha is computed regardless. PyJHora source notes the hora gate is \"TODO\" even there."},"currentMaha":{"planet":1,"planetName":"Moon","startJd":2455578.700986102,"endJd":2461422.700986102,"startDate":"2011-01-17 10:19","endDate":"2027-01-17 10:19","durationYears":16},"currentAntar":{"planet":100,"planetName":"Ketu","startJd":2460667.0113309296,"endJd":2461422.700986102,"startDate":"2024-12-22 17:46","endDate":"2027-01-17 10:19","durationYears":2.0689655172413794},"periods":[{"planet":100,"planetName":"Ketu","startJd":2460667.0113309296,"endJd":2460764.7298208224,"startDate":"2024-12-22 17:46","endDate":"2025-03-30 11:00","durationYears":0.267538644470868}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/dashas/shodashottari/sookshma":{"post":{"tags":["Vedic"],"summary":"Dashas: Shodashottari Sookshmadasha","description":"Shodashottari Sookshmadasha: 4-level cascade.","operationId":"vedic_dashas_shodashottari_sookshma","x-quality":"yellow","x-source":"PyJHora shodasottari.py.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashaInput"},"example":{"date":"1947-08-15","time":"02:00:00","timezoneOffset":5.5,"latitude":27.49,"longitude":77.67,"targetDate":"2026-05-06"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/dashas/shodashottari/sookshma \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1947-08-15\", \"time\": \"02:00:00\", \"timezoneOffset\": 5.5, \"latitude\": 27.49, \"longitude\": 77.67, \"targetDate\": \"2026-05-06\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/dashas/shodashottari/sookshma', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1947-08-15\",\n    \"time\": \"02:00:00\",\n    \"timezoneOffset\": 5.5,\n    \"latitude\": 27.49,\n    \"longitude\": 77.67,\n    \"targetDate\": \"2026-05-06\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/dashas/shodashottari/sookshma',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1947-08-15\",\n      'time': \"02:00:00\",\n      'timezoneOffset': 5.5,\n      'latitude': 27.49,\n      'longitude': 77.67,\n      'targetDate': \"2026-05-06\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/dashas/shodashottari/sookshma', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1947-08-15',\n        'time' => '02:00:00',\n        'timezoneOffset' => 5.5,\n        'latitude' => 27.49,\n        'longitude' => 77.67,\n        'targetDate' => '2026-05-06',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"level":{"type":"string","nullable":true},"ayanamsa":{"type":"number","nullable":true},"moonSiderealLongitude":{"type":"number","nullable":true},"nakshatra":{"type":"object","properties":{"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"nameRu":{"type":"string","nullable":true},"nameUk":{"type":"string","nullable":true},"ruler":{"type":"string","nullable":true},"startDeg":{"type":"number","nullable":true},"endDeg":{"type":"number","nullable":true},"pada":{"type":"number","nullable":true}},"nullable":true},"initial":{"type":"object","properties":{"initialPlanet":{"type":"string","nullable":true},"fullPeriodYears":{"type":"number","nullable":true},"elapsedYears":{"type":"number","nullable":true},"balanceYears":{"type":"number","nullable":true},"balanceFmt":{"type":"string","nullable":true},"pada":{"type":"number","nullable":true},"seedNakshatra":{"type":"string","nullable":true},"cycleYears":{"type":"number","nullable":true},"applicabilityNote":{"type":"string","nullable":true}},"nullable":true},"currentMaha":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"currentAntar":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"currentPratyantar":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"periods":{"type":"array","items":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"Shodashottari","level":"sookshma","ayanamsa":23.125454161038185,"moonSiderealLongitude":95.24121106113016,"nakshatra":{"number":8,"name":"Pushya","nameRu":"Пушья","nameUk":"Пушья","ruler":"Saturn","startDeg":93.3333,"endDeg":106.6667,"pada":1},"initial":{"initialPlanet":"Sun","fullPeriodYears":11,"elapsedYears":1.5739991254323846,"balanceYears":9.426000874567615,"balanceFmt":"9y 5m 3d","pada":1,"seedNakshatra":"Pushya (8)","cycleYears":116,"applicabilityNote":"Per AmatyaKaraka tradition: applicable when lagna in Chandra hora during Krishna paksha OR Surya hora during Shukla paksha. Surfaced informationally; dasha is computed regardless. PyJHora source notes the hora gate is \"TODO\" even there."},"currentMaha":{"planet":1,"planetName":"Moon","startJd":2455578.700986102,"endJd":2461422.700986102,"startDate":"2011-01-17 10:19","endDate":"2027-01-17 10:19","durationYears":16},"currentAntar":{"planet":100,"planetName":"Ketu","startJd":2460667.0113309296,"endJd":2461422.700986102,"startDate":"2024-12-22 17:46","endDate":"2027-01-17 10:19","durationYears":2.0689655172413794},"currentPratyantar":{"planet":0,"planetName":"Sun","startJd":2461096.9726864584,"endJd":2461168.6329123797,"startDate":"2026-02-25 16:50","endDate":"2026-05-08 08:41","durationYears":0.19619500594530323},"periods":[{"planet":0,"planetName":"Sun","startJd":2461096.9726864584,"endJd":2461103.7680527098,"startDate":"2026-02-25 16:50","endDate":"2026-03-04 11:55","durationYears":0.01860469883964082}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/dashas/shodashottari/prana":{"post":{"tags":["Vedic"],"summary":"Dashas: Shodashottari Pranadasha","description":"Shodashottari Pranadasha: 5-level cascade (finest grain).","operationId":"vedic_dashas_shodashottari_prana","x-quality":"yellow","x-source":"PyJHora shodasottari.py.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashaInput"},"example":{"date":"1947-08-15","time":"02:00:00","timezoneOffset":5.5,"latitude":27.49,"longitude":77.67,"targetDate":"2026-05-06"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/dashas/shodashottari/prana \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1947-08-15\", \"time\": \"02:00:00\", \"timezoneOffset\": 5.5, \"latitude\": 27.49, \"longitude\": 77.67, \"targetDate\": \"2026-05-06\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/dashas/shodashottari/prana', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1947-08-15\",\n    \"time\": \"02:00:00\",\n    \"timezoneOffset\": 5.5,\n    \"latitude\": 27.49,\n    \"longitude\": 77.67,\n    \"targetDate\": \"2026-05-06\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/dashas/shodashottari/prana',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1947-08-15\",\n      'time': \"02:00:00\",\n      'timezoneOffset': 5.5,\n      'latitude': 27.49,\n      'longitude': 77.67,\n      'targetDate': \"2026-05-06\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/dashas/shodashottari/prana', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1947-08-15',\n        'time' => '02:00:00',\n        'timezoneOffset' => 5.5,\n        'latitude' => 27.49,\n        'longitude' => 77.67,\n        'targetDate' => '2026-05-06',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"level":{"type":"string","nullable":true},"ayanamsa":{"type":"number","nullable":true},"moonSiderealLongitude":{"type":"number","nullable":true},"nakshatra":{"type":"object","properties":{"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"nameRu":{"type":"string","nullable":true},"nameUk":{"type":"string","nullable":true},"ruler":{"type":"string","nullable":true},"startDeg":{"type":"number","nullable":true},"endDeg":{"type":"number","nullable":true},"pada":{"type":"number","nullable":true}},"nullable":true},"initial":{"type":"object","properties":{"initialPlanet":{"type":"string","nullable":true},"fullPeriodYears":{"type":"number","nullable":true},"elapsedYears":{"type":"number","nullable":true},"balanceYears":{"type":"number","nullable":true},"balanceFmt":{"type":"string","nullable":true},"pada":{"type":"number","nullable":true},"seedNakshatra":{"type":"string","nullable":true},"cycleYears":{"type":"number","nullable":true},"applicabilityNote":{"type":"string","nullable":true}},"nullable":true},"currentMaha":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"currentAntar":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"currentPratyantar":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"currentSookshma":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"periods":{"type":"array","items":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"Shodashottari","level":"prana","ayanamsa":23.125454161038185,"moonSiderealLongitude":95.24121106113016,"nakshatra":{"number":8,"name":"Pushya","nameRu":"Пушья","nameUk":"Пушья","ruler":"Saturn","startDeg":93.3333,"endDeg":106.6667,"pada":1},"initial":{"initialPlanet":"Sun","fullPeriodYears":11,"elapsedYears":1.5739991254323846,"balanceYears":9.426000874567615,"balanceFmt":"9y 5m 3d","pada":1,"seedNakshatra":"Pushya (8)","cycleYears":116,"applicabilityNote":"Per AmatyaKaraka tradition: applicable when lagna in Chandra hora during Krishna paksha OR Surya hora during Shukla paksha. Surfaced informationally; dasha is computed regardless. PyJHora source notes the hora gate is \"TODO\" even there."},"currentMaha":{"planet":1,"planetName":"Moon","startJd":2455578.700986102,"endJd":2461422.700986102,"startDate":"2011-01-17 10:19","endDate":"2027-01-17 10:19","durationYears":16},"currentAntar":{"planet":100,"planetName":"Ketu","startJd":2460667.0113309296,"endJd":2461422.700986102,"startDate":"2024-12-22 17:46","endDate":"2027-01-17 10:19","durationYears":2.0689655172413794},"currentPratyantar":{"planet":0,"planetName":"Sun","startJd":2461096.9726864584,"endJd":2461168.6329123797,"startDate":"2026-02-25 16:50","endDate":"2026-05-08 08:41","durationYears":0.19619500594530323},"currentSookshma":{"planet":3,"planetName":"Venus","startJd":2461157.5132221505,"endJd":2461168.6329123797,"startDate":"2026-04-27 05:49","endDate":"2026-05-08 08:41","durationYears":0.030444052646684986},"periods":[{"planet":3,"planetName":"Venus","startJd":2461157.5132221505,"endJd":2461159.238691324,"startDate":"2026-04-27 05:49","endDate":"2026-04-28 23:13","durationYears":0.004724077134830429}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/dashas/sthira/maha":{"post":{"tags":["Vedic"],"summary":"Dashas: Sthira Mahadasha","description":"Sthira Dasha: Jaimini fixed rasi-dasha. Seed = sign of Brahma planet (PyJHora `house.brahma`: stronger of asc vs 7th → top-2 lords of 6/8/12 from stronger rasi → strongest by 6 Jaimini rasi-rules). MD walks 12 signs forward; per-sign duration 7y movable / 8y fixed / 9y dual. Sub-periods: equal 12-fold split, forward from parent. Year basis 365.256364d (sidereal year, PyJHora canon).","operationId":"vedic_dashas_sthira_maha","x-quality":"green","x-source":"BPHS Adhyaya 49 + Jaimini Sutras 2.x + PyJHora sthira.py + house.brahma.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashaInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/dashas/sthira/maha \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/dashas/sthira/maha', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/dashas/sthira/maha',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/dashas/sthira/maha', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"level":{"type":"string","nullable":true},"ayanamsa":{"type":"number","nullable":true},"lagna":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true}},"nullable":true},"seed":{"type":"object","properties":{"brahma":{"type":"number","nullable":true},"brahmaName":{"type":"string","nullable":true},"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true}},"nullable":true},"periods":{"type":"array","items":{"type":"object","properties":{"signIndex":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"rowIndex":{"type":"number","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"Sthira","level":"maha","ayanamsa":23.72254952235926,"lagna":{"sign":4,"signName":"Leo"},"seed":{"brahma":6,"brahmaName":"Saturn","sign":9,"signName":"Capricorn"},"periods":[{"signIndex":9,"signName":"Capricorn","durationYears":7,"startJd":2448026.9791666665,"endJd":2450583.7737146667,"startDate":"1990-05-15 15:29","endDate":"1997-05-15 10:34","rowIndex":0}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/dashas/sthira/antar":{"post":{"tags":["Vedic"],"summary":"Dashas: Sthira Antardasha","description":"Sthira Antardasha: equal-split sub-periods of running MD at `targetDate`.","operationId":"vedic_dashas_sthira_antar","x-quality":"green","x-source":"PyJHora sthira.py.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashaInput"},"example":{"date":"1996-12-07","time":"10:34:00","timezoneOffset":5.5,"latitude":13.0389,"longitude":80.2619,"targetDate":"2026-05-07"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/dashas/sthira/antar \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1996-12-07\", \"time\": \"10:34:00\", \"timezoneOffset\": 5.5, \"latitude\": 13.0389, \"longitude\": 80.2619, \"targetDate\": \"2026-05-07\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/dashas/sthira/antar', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1996-12-07\",\n    \"time\": \"10:34:00\",\n    \"timezoneOffset\": 5.5,\n    \"latitude\": 13.0389,\n    \"longitude\": 80.2619,\n    \"targetDate\": \"2026-05-07\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/dashas/sthira/antar',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1996-12-07\",\n      'time': \"10:34:00\",\n      'timezoneOffset': 5.5,\n      'latitude': 13.0389,\n      'longitude': 80.2619,\n      'targetDate': \"2026-05-07\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/dashas/sthira/antar', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1996-12-07',\n        'time' => '10:34:00',\n        'timezoneOffset' => 5.5,\n        'latitude' => 13.0389,\n        'longitude' => 80.2619,\n        'targetDate' => '2026-05-07',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"level":{"type":"string","nullable":true},"ayanamsa":{"type":"number","nullable":true},"lagna":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true}},"nullable":true},"seed":{"type":"object","properties":{"brahma":{"type":"number","nullable":true},"brahmaName":{"type":"string","nullable":true},"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true}},"nullable":true},"currentMaha":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"periods":{"type":"array","items":{"type":"object","properties":{"signIndex":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"rowIndex":{"type":"number","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"Sthira","level":"antar","ayanamsa":23.81424752115805,"lagna":{"sign":9,"signName":"Capricorn"},"seed":{"brahma":5,"brahmaName":"Jupiter","sign":8,"signName":"Sagittarius"},"currentMaha":{"sign":11,"signName":"Pisces","startJd":2459190.863847111,"endJd":2462478.1711231107,"startDate":"2020-12-07 14:13","endDate":"2029-12-07 21:36","durationYears":9},"periods":[{"signIndex":11,"signName":"Pisces","durationYears":0.75,"startJd":2459190.863847111,"endJd":2459464.8061201107,"startDate":"2020-12-07 14:13","endDate":"2021-09-07 12:50","rowIndex":0}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/dashas/sthira/pratyantar":{"post":{"tags":["Vedic"],"summary":"Dashas: Sthira Pratyantardasha","description":"Sthira Pratyantardasha: 3-level cascade.","operationId":"vedic_dashas_sthira_pratyantar","x-quality":"green","x-source":"PyJHora sthira.py.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashaInput"},"example":{"date":"1996-12-07","time":"10:34:00","timezoneOffset":5.5,"latitude":13.0389,"longitude":80.2619,"targetDate":"2026-05-07"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/dashas/sthira/pratyantar \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1996-12-07\", \"time\": \"10:34:00\", \"timezoneOffset\": 5.5, \"latitude\": 13.0389, \"longitude\": 80.2619, \"targetDate\": \"2026-05-07\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/dashas/sthira/pratyantar', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1996-12-07\",\n    \"time\": \"10:34:00\",\n    \"timezoneOffset\": 5.5,\n    \"latitude\": 13.0389,\n    \"longitude\": 80.2619,\n    \"targetDate\": \"2026-05-07\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/dashas/sthira/pratyantar',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1996-12-07\",\n      'time': \"10:34:00\",\n      'timezoneOffset': 5.5,\n      'latitude': 13.0389,\n      'longitude': 80.2619,\n      'targetDate': \"2026-05-07\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/dashas/sthira/pratyantar', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1996-12-07',\n        'time' => '10:34:00',\n        'timezoneOffset' => 5.5,\n        'latitude' => 13.0389,\n        'longitude' => 80.2619,\n        'targetDate' => '2026-05-07',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"level":{"type":"string","nullable":true},"ayanamsa":{"type":"number","nullable":true},"lagna":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true}},"nullable":true},"seed":{"type":"object","properties":{"brahma":{"type":"number","nullable":true},"brahmaName":{"type":"string","nullable":true},"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true}},"nullable":true},"currentMaha":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"currentAntar":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"periods":{"type":"array","items":{"type":"object","properties":{"signIndex":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"rowIndex":{"type":"number","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"Sthira","level":"pratyantar","ayanamsa":23.81424752115805,"lagna":{"sign":9,"signName":"Capricorn"},"seed":{"brahma":5,"brahmaName":"Jupiter","sign":8,"signName":"Sagittarius"},"currentMaha":{"sign":11,"signName":"Pisces","startJd":2459190.863847111,"endJd":2462478.1711231107,"startDate":"2020-12-07 14:13","endDate":"2029-12-07 21:36","durationYears":9},"currentAntar":{"sign":6,"signName":"Libra","startJd":2461108.4597581094,"endJd":2461382.402031109,"startDate":"2026-03-09 04:32","endDate":"2026-12-08 03:08","durationYears":0.75},"periods":[{"signIndex":6,"signName":"Libra","durationYears":0.0625,"startJd":2461108.4597581094,"endJd":2461131.2882808596,"startDate":"2026-03-09 04:32","endDate":"2026-04-01 00:25","rowIndex":0}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/dashas/sthira/sookshma":{"post":{"tags":["Vedic"],"summary":"Dashas: Sthira Sookshmadasha","description":"Sthira Sookshmadasha: 4-level cascade.","operationId":"vedic_dashas_sthira_sookshma","x-quality":"green","x-source":"PyJHora sthira.py.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashaInput"},"example":{"date":"1996-12-07","time":"10:34:00","timezoneOffset":5.5,"latitude":13.0389,"longitude":80.2619,"targetDate":"2026-05-07"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/dashas/sthira/sookshma \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1996-12-07\", \"time\": \"10:34:00\", \"timezoneOffset\": 5.5, \"latitude\": 13.0389, \"longitude\": 80.2619, \"targetDate\": \"2026-05-07\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/dashas/sthira/sookshma', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1996-12-07\",\n    \"time\": \"10:34:00\",\n    \"timezoneOffset\": 5.5,\n    \"latitude\": 13.0389,\n    \"longitude\": 80.2619,\n    \"targetDate\": \"2026-05-07\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/dashas/sthira/sookshma',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1996-12-07\",\n      'time': \"10:34:00\",\n      'timezoneOffset': 5.5,\n      'latitude': 13.0389,\n      'longitude': 80.2619,\n      'targetDate': \"2026-05-07\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/dashas/sthira/sookshma', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1996-12-07',\n        'time' => '10:34:00',\n        'timezoneOffset' => 5.5,\n        'latitude' => 13.0389,\n        'longitude' => 80.2619,\n        'targetDate' => '2026-05-07',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"level":{"type":"string","nullable":true},"ayanamsa":{"type":"number","nullable":true},"lagna":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true}},"nullable":true},"seed":{"type":"object","properties":{"brahma":{"type":"number","nullable":true},"brahmaName":{"type":"string","nullable":true},"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true}},"nullable":true},"currentMaha":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"currentAntar":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"currentPratyantar":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"periods":{"type":"array","items":{"type":"object","properties":{"signIndex":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"rowIndex":{"type":"number","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"Sthira","level":"sookshma","ayanamsa":23.81424752115805,"lagna":{"sign":9,"signName":"Capricorn"},"seed":{"brahma":5,"brahmaName":"Jupiter","sign":8,"signName":"Sagittarius"},"currentMaha":{"sign":11,"signName":"Pisces","startJd":2459190.863847111,"endJd":2462478.1711231107,"startDate":"2020-12-07 14:13","endDate":"2029-12-07 21:36","durationYears":9},"currentAntar":{"sign":6,"signName":"Libra","startJd":2461108.4597581094,"endJd":2461382.402031109,"startDate":"2026-03-09 04:32","endDate":"2026-12-08 03:08","durationYears":0.75},"currentPratyantar":{"sign":8,"signName":"Sagittarius","startJd":2461154.1168036098,"endJd":2461176.94532636,"startDate":"2026-04-23 20:18","endDate":"2026-05-16 16:11","durationYears":0.0625},"periods":[{"signIndex":8,"signName":"Sagittarius","durationYears":0.005208333333333333,"startJd":2461154.1168036098,"endJd":2461156.0191805055,"startDate":"2026-04-23 20:18","endDate":"2026-04-25 17:57","rowIndex":0}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/dashas/sthira/prana":{"post":{"tags":["Vedic"],"summary":"Dashas: Sthira Pranadasha","description":"Sthira Pranadasha: 5-level cascade (finest grain).","operationId":"vedic_dashas_sthira_prana","x-quality":"green","x-source":"PyJHora sthira.py.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashaInput"},"example":{"date":"1996-12-07","time":"10:34:00","timezoneOffset":5.5,"latitude":13.0389,"longitude":80.2619,"targetDate":"2026-05-07"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/dashas/sthira/prana \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1996-12-07\", \"time\": \"10:34:00\", \"timezoneOffset\": 5.5, \"latitude\": 13.0389, \"longitude\": 80.2619, \"targetDate\": \"2026-05-07\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/dashas/sthira/prana', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1996-12-07\",\n    \"time\": \"10:34:00\",\n    \"timezoneOffset\": 5.5,\n    \"latitude\": 13.0389,\n    \"longitude\": 80.2619,\n    \"targetDate\": \"2026-05-07\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/dashas/sthira/prana',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1996-12-07\",\n      'time': \"10:34:00\",\n      'timezoneOffset': 5.5,\n      'latitude': 13.0389,\n      'longitude': 80.2619,\n      'targetDate': \"2026-05-07\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/dashas/sthira/prana', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1996-12-07',\n        'time' => '10:34:00',\n        'timezoneOffset' => 5.5,\n        'latitude' => 13.0389,\n        'longitude' => 80.2619,\n        'targetDate' => '2026-05-07',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"level":{"type":"string","nullable":true},"ayanamsa":{"type":"number","nullable":true},"lagna":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true}},"nullable":true},"seed":{"type":"object","properties":{"brahma":{"type":"number","nullable":true},"brahmaName":{"type":"string","nullable":true},"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true}},"nullable":true},"currentMaha":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"currentAntar":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"currentPratyantar":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"currentSookshma":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"periods":{"type":"array","items":{"type":"object","properties":{"signIndex":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"rowIndex":{"type":"number","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"Sthira","level":"prana","ayanamsa":23.81424752115805,"lagna":{"sign":9,"signName":"Capricorn"},"seed":{"brahma":5,"brahmaName":"Jupiter","sign":8,"signName":"Sagittarius"},"currentMaha":{"sign":11,"signName":"Pisces","startJd":2459190.863847111,"endJd":2462478.1711231107,"startDate":"2020-12-07 14:13","endDate":"2029-12-07 21:36","durationYears":9},"currentAntar":{"sign":6,"signName":"Libra","startJd":2461108.4597581094,"endJd":2461382.402031109,"startDate":"2026-03-09 04:32","endDate":"2026-12-08 03:08","durationYears":0.75},"currentPratyantar":{"sign":8,"signName":"Sagittarius","startJd":2461154.1168036098,"endJd":2461176.94532636,"startDate":"2026-04-23 20:18","endDate":"2026-05-16 16:11","durationYears":0.0625},"currentSookshma":{"sign":3,"signName":"Cancer","startJd":2461167.43344188,"endJd":2461169.335818776,"startDate":"2026-05-07 03:54","endDate":"2026-05-09 01:33","durationYears":0.005208333333333333},"periods":[{"signIndex":3,"signName":"Cancer","durationYears":0.00043402777777777775,"startJd":2461167.43344188,"endJd":2461167.591973288,"startDate":"2026-05-07 03:54","endDate":"2026-05-07 07:42","rowIndex":0}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/dashas/shoola/maha":{"post":{"tags":["Vedic"],"summary":"Dashas: Shoola Mahadasha","description":"Shoola Dasha: Jaimini \"Trident\" rasi-dasha. Seed = stronger_rasi(asc, asc+6) by default (`houseIndex=1`; can be 1..12 to shift the lagna anchor). MD = 12 signs forward, 9 years each. Sub-period antara-seed `option=2` by default (stronger_rasi of parent vs parent+6); option 1 = sign of lord(parent), option 3 = sign of lord(stronger). Children: equal 12-fold split, forward from antara seed.","operationId":"vedic_dashas_shoola_maha","x-quality":"green","x-source":"Jaimini Sutras 2.x + BPHS Adhyaya 50 + PyJHora shoola.py.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShoolaInput"},"example":{"date":"1996-12-07","time":"10:34:00","timezoneOffset":5.5,"latitude":13.0389,"longitude":80.2619,"houseIndex":1,"antardasaSeedOption":2}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/dashas/shoola/maha \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1996-12-07\", \"time\": \"10:34:00\", \"timezoneOffset\": 5.5, \"latitude\": 13.0389, \"longitude\": 80.2619, \"houseIndex\": 1, \"antardasaSeedOption\": 2 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/dashas/shoola/maha', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1996-12-07\",\n    \"time\": \"10:34:00\",\n    \"timezoneOffset\": 5.5,\n    \"latitude\": 13.0389,\n    \"longitude\": 80.2619,\n    \"houseIndex\": 1,\n    \"antardasaSeedOption\": 2\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/dashas/shoola/maha',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1996-12-07\",\n      'time': \"10:34:00\",\n      'timezoneOffset': 5.5,\n      'latitude': 13.0389,\n      'longitude': 80.2619,\n      'houseIndex': 1,\n      'antardasaSeedOption': 2\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/dashas/shoola/maha', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1996-12-07',\n        'time' => '10:34:00',\n        'timezoneOffset' => 5.5,\n        'latitude' => 13.0389,\n        'longitude' => 80.2619,\n        'houseIndex' => 1,\n        'antardasaSeedOption' => 2,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"level":{"type":"string","nullable":true},"ayanamsa":{"type":"number","nullable":true},"lagna":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true}},"nullable":true},"seed":{"type":"object","properties":{"houseIndex":{"type":"number","nullable":true},"baseSign":{"type":"number","nullable":true},"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"antardasaSeedOption":{"type":"number","nullable":true}},"nullable":true},"periods":{"type":"array","items":{"type":"object","properties":{"signIndex":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"rowIndex":{"type":"number","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"Shoola","level":"maha","ayanamsa":23.81424752115805,"lagna":{"sign":9,"signName":"Capricorn"},"seed":{"houseIndex":1,"baseSign":9,"sign":9,"signName":"Capricorn","antardasaSeedOption":2},"periods":[{"signIndex":9,"signName":"Capricorn","durationYears":9,"startJd":2450424.711111111,"endJd":2453712.018387111,"startDate":"1996-12-07 10:33","endDate":"2005-12-07 17:56","rowIndex":0}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/dashas/shoola/antar":{"post":{"tags":["Vedic"],"summary":"Dashas: Shoola Antardasha","description":"Shoola Antardasha: sub-periods of running MD at `targetDate` per chosen `antardasaSeedOption`.","operationId":"vedic_dashas_shoola_antar","x-quality":"green","x-source":"PyJHora shoola.py.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShoolaInput"},"example":{"date":"1996-12-07","time":"10:34:00","timezoneOffset":5.5,"latitude":13.0389,"longitude":80.2619,"targetDate":"2026-05-07","antardasaSeedOption":2}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/dashas/shoola/antar \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1996-12-07\", \"time\": \"10:34:00\", \"timezoneOffset\": 5.5, \"latitude\": 13.0389, \"longitude\": 80.2619, \"targetDate\": \"2026-05-07\", \"antardasaSeedOption\": 2 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/dashas/shoola/antar', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1996-12-07\",\n    \"time\": \"10:34:00\",\n    \"timezoneOffset\": 5.5,\n    \"latitude\": 13.0389,\n    \"longitude\": 80.2619,\n    \"targetDate\": \"2026-05-07\",\n    \"antardasaSeedOption\": 2\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/dashas/shoola/antar',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1996-12-07\",\n      'time': \"10:34:00\",\n      'timezoneOffset': 5.5,\n      'latitude': 13.0389,\n      'longitude': 80.2619,\n      'targetDate': \"2026-05-07\",\n      'antardasaSeedOption': 2\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/dashas/shoola/antar', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1996-12-07',\n        'time' => '10:34:00',\n        'timezoneOffset' => 5.5,\n        'latitude' => 13.0389,\n        'longitude' => 80.2619,\n        'targetDate' => '2026-05-07',\n        'antardasaSeedOption' => 2,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"level":{"type":"string","nullable":true},"ayanamsa":{"type":"number","nullable":true},"lagna":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true}},"nullable":true},"seed":{"type":"object","properties":{"houseIndex":{"type":"number","nullable":true},"baseSign":{"type":"number","nullable":true},"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"antardasaSeedOption":{"type":"number","nullable":true}},"nullable":true},"currentMaha":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"periods":{"type":"array","items":{"type":"object","properties":{"signIndex":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"rowIndex":{"type":"number","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"Shoola","level":"antar","ayanamsa":23.81424752115805,"lagna":{"sign":9,"signName":"Capricorn"},"seed":{"houseIndex":1,"baseSign":9,"sign":9,"signName":"Capricorn","antardasaSeedOption":2},"currentMaha":{"sign":0,"signName":"Aries","startJd":2460286.6329391105,"endJd":2463573.9402151103,"startDate":"2023-12-08 08:41","endDate":"2032-12-07 16:03","durationYears":9},"periods":[{"signIndex":6,"signName":"Libra","durationYears":0.75,"startJd":2460286.6329391105,"endJd":2460560.5752121103,"startDate":"2023-12-08 08:41","endDate":"2024-09-07 07:18","rowIndex":0}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/dashas/shoola/pratyantar":{"post":{"tags":["Vedic"],"summary":"Dashas: Shoola Pratyantardasha","description":"Shoola Pratyantardasha: 3-level cascade.","operationId":"vedic_dashas_shoola_pratyantar","x-quality":"green","x-source":"PyJHora shoola.py.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShoolaInput"},"example":{"date":"1996-12-07","time":"10:34:00","timezoneOffset":5.5,"latitude":13.0389,"longitude":80.2619,"targetDate":"2026-05-07"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/dashas/shoola/pratyantar \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1996-12-07\", \"time\": \"10:34:00\", \"timezoneOffset\": 5.5, \"latitude\": 13.0389, \"longitude\": 80.2619, \"targetDate\": \"2026-05-07\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/dashas/shoola/pratyantar', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1996-12-07\",\n    \"time\": \"10:34:00\",\n    \"timezoneOffset\": 5.5,\n    \"latitude\": 13.0389,\n    \"longitude\": 80.2619,\n    \"targetDate\": \"2026-05-07\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/dashas/shoola/pratyantar',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1996-12-07\",\n      'time': \"10:34:00\",\n      'timezoneOffset': 5.5,\n      'latitude': 13.0389,\n      'longitude': 80.2619,\n      'targetDate': \"2026-05-07\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/dashas/shoola/pratyantar', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1996-12-07',\n        'time' => '10:34:00',\n        'timezoneOffset' => 5.5,\n        'latitude' => 13.0389,\n        'longitude' => 80.2619,\n        'targetDate' => '2026-05-07',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"level":{"type":"string","nullable":true},"ayanamsa":{"type":"number","nullable":true},"lagna":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true}},"nullable":true},"seed":{"type":"object","properties":{"houseIndex":{"type":"number","nullable":true},"baseSign":{"type":"number","nullable":true},"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"antardasaSeedOption":{"type":"number","nullable":true}},"nullable":true},"currentMaha":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"currentAntar":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"periods":{"type":"array","items":{"type":"object","properties":{"signIndex":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"rowIndex":{"type":"number","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"Shoola","level":"pratyantar","ayanamsa":23.81424752115805,"lagna":{"sign":9,"signName":"Capricorn"},"seed":{"houseIndex":1,"baseSign":9,"sign":9,"signName":"Capricorn","antardasaSeedOption":2},"currentMaha":{"sign":0,"signName":"Aries","startJd":2460286.6329391105,"endJd":2463573.9402151103,"startDate":"2023-12-08 08:41","endDate":"2032-12-07 16:03","durationYears":9},"currentAntar":{"sign":9,"signName":"Capricorn","startJd":2461108.45975811,"endJd":2461382.4020311097,"startDate":"2026-03-09 04:32","endDate":"2026-12-08 03:08","durationYears":0.75},"periods":[{"signIndex":9,"signName":"Capricorn","durationYears":0.0625,"startJd":2461108.45975811,"endJd":2461131.28828086,"startDate":"2026-03-09 04:32","endDate":"2026-04-01 00:25","rowIndex":0}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/dashas/shoola/sookshma":{"post":{"tags":["Vedic"],"summary":"Dashas: Shoola Sookshmadasha","description":"Shoola Sookshmadasha: 4-level cascade.","operationId":"vedic_dashas_shoola_sookshma","x-quality":"green","x-source":"PyJHora shoola.py.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShoolaInput"},"example":{"date":"1996-12-07","time":"10:34:00","timezoneOffset":5.5,"latitude":13.0389,"longitude":80.2619,"targetDate":"2026-05-07"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/dashas/shoola/sookshma \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1996-12-07\", \"time\": \"10:34:00\", \"timezoneOffset\": 5.5, \"latitude\": 13.0389, \"longitude\": 80.2619, \"targetDate\": \"2026-05-07\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/dashas/shoola/sookshma', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1996-12-07\",\n    \"time\": \"10:34:00\",\n    \"timezoneOffset\": 5.5,\n    \"latitude\": 13.0389,\n    \"longitude\": 80.2619,\n    \"targetDate\": \"2026-05-07\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/dashas/shoola/sookshma',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1996-12-07\",\n      'time': \"10:34:00\",\n      'timezoneOffset': 5.5,\n      'latitude': 13.0389,\n      'longitude': 80.2619,\n      'targetDate': \"2026-05-07\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/dashas/shoola/sookshma', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1996-12-07',\n        'time' => '10:34:00',\n        'timezoneOffset' => 5.5,\n        'latitude' => 13.0389,\n        'longitude' => 80.2619,\n        'targetDate' => '2026-05-07',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"level":{"type":"string","nullable":true},"ayanamsa":{"type":"number","nullable":true},"lagna":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true}},"nullable":true},"seed":{"type":"object","properties":{"houseIndex":{"type":"number","nullable":true},"baseSign":{"type":"number","nullable":true},"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"antardasaSeedOption":{"type":"number","nullable":true}},"nullable":true},"currentMaha":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"currentAntar":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"currentPratyantar":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"periods":{"type":"array","items":{"type":"object","properties":{"signIndex":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"rowIndex":{"type":"number","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"Shoola","level":"sookshma","ayanamsa":23.81424752115805,"lagna":{"sign":9,"signName":"Capricorn"},"seed":{"houseIndex":1,"baseSign":9,"sign":9,"signName":"Capricorn","antardasaSeedOption":2},"currentMaha":{"sign":0,"signName":"Aries","startJd":2460286.6329391105,"endJd":2463573.9402151103,"startDate":"2023-12-08 08:41","endDate":"2032-12-07 16:03","durationYears":9},"currentAntar":{"sign":9,"signName":"Capricorn","startJd":2461108.45975811,"endJd":2461382.4020311097,"startDate":"2026-03-09 04:32","endDate":"2026-12-08 03:08","durationYears":0.75},"currentPratyantar":{"sign":11,"signName":"Pisces","startJd":2461154.11680361,"endJd":2461176.9453263604,"startDate":"2026-04-23 20:18","endDate":"2026-05-16 16:11","durationYears":0.0625},"periods":[{"signIndex":11,"signName":"Pisces","durationYears":0.005208333333333333,"startJd":2461154.11680361,"endJd":2461156.019180506,"startDate":"2026-04-23 20:18","endDate":"2026-04-25 17:57","rowIndex":0}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/dashas/shoola/prana":{"post":{"tags":["Vedic"],"summary":"Dashas: Shoola Pranadasha","description":"Shoola Pranadasha: 5-level cascade (finest grain).","operationId":"vedic_dashas_shoola_prana","x-quality":"green","x-source":"PyJHora shoola.py.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShoolaInput"},"example":{"date":"1996-12-07","time":"10:34:00","timezoneOffset":5.5,"latitude":13.0389,"longitude":80.2619,"targetDate":"2026-05-07"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/dashas/shoola/prana \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1996-12-07\", \"time\": \"10:34:00\", \"timezoneOffset\": 5.5, \"latitude\": 13.0389, \"longitude\": 80.2619, \"targetDate\": \"2026-05-07\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/dashas/shoola/prana', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1996-12-07\",\n    \"time\": \"10:34:00\",\n    \"timezoneOffset\": 5.5,\n    \"latitude\": 13.0389,\n    \"longitude\": 80.2619,\n    \"targetDate\": \"2026-05-07\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/dashas/shoola/prana',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1996-12-07\",\n      'time': \"10:34:00\",\n      'timezoneOffset': 5.5,\n      'latitude': 13.0389,\n      'longitude': 80.2619,\n      'targetDate': \"2026-05-07\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/dashas/shoola/prana', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1996-12-07',\n        'time' => '10:34:00',\n        'timezoneOffset' => 5.5,\n        'latitude' => 13.0389,\n        'longitude' => 80.2619,\n        'targetDate' => '2026-05-07',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"level":{"type":"string","nullable":true},"ayanamsa":{"type":"number","nullable":true},"lagna":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true}},"nullable":true},"seed":{"type":"object","properties":{"houseIndex":{"type":"number","nullable":true},"baseSign":{"type":"number","nullable":true},"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"antardasaSeedOption":{"type":"number","nullable":true}},"nullable":true},"currentMaha":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"currentAntar":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"currentPratyantar":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"currentSookshma":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"periods":{"type":"array","items":{"type":"object","properties":{"signIndex":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true},"startJd":{"type":"number","nullable":true},"endJd":{"type":"number","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"rowIndex":{"type":"number","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"Shoola","level":"prana","ayanamsa":23.81424752115805,"lagna":{"sign":9,"signName":"Capricorn"},"seed":{"houseIndex":1,"baseSign":9,"sign":9,"signName":"Capricorn","antardasaSeedOption":2},"currentMaha":{"sign":0,"signName":"Aries","startJd":2460286.6329391105,"endJd":2463573.9402151103,"startDate":"2023-12-08 08:41","endDate":"2032-12-07 16:03","durationYears":9},"currentAntar":{"sign":9,"signName":"Capricorn","startJd":2461108.45975811,"endJd":2461382.4020311097,"startDate":"2026-03-09 04:32","endDate":"2026-12-08 03:08","durationYears":0.75},"currentPratyantar":{"sign":11,"signName":"Pisces","startJd":2461154.11680361,"endJd":2461176.9453263604,"startDate":"2026-04-23 20:18","endDate":"2026-05-16 16:11","durationYears":0.0625},"currentSookshma":{"sign":6,"signName":"Libra","startJd":2461167.4334418806,"endJd":2461169.3358187764,"startDate":"2026-05-07 03:54","endDate":"2026-05-09 01:33","durationYears":0.005208333333333333},"periods":[{"signIndex":6,"signName":"Libra","durationYears":0.00043402777777777775,"startJd":2461167.4334418806,"endJd":2461167.5919732885,"startDate":"2026-05-07 03:54","endDate":"2026-05-07 07:42","rowIndex":0}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/jaimini/karakas":{"post":{"tags":["Vedic"],"summary":"Jaimini: Karakas (Chara + Naisargika)","description":"Jaimini karakas: chara karakas (8-planet ranking by advancement-in-rasi, Atmakaraka..Darakaraka) + naisargika karakas (fixed planet→house mapping). Source: Jaimini Sutras 2.x + BPHS Adhyaya 47 + PyJHora chara_karakas/naisargika_karakas.","operationId":"vedic_jaimini_karakas","x-quality":"green","x-source":"Jaimini Sutras 2.x + BPHS A.47 + PyJHora `house.chara_karakas` + `const.naisargika_karakas`.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/jaimini/karakas \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/jaimini/karakas', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/jaimini/karakas',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/jaimini/karakas', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"lagna":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true}},"nullable":true},"ayanamsa":{"type":"number","nullable":true},"naisargika":{"type":"array","items":{"type":"object","properties":{"house":{"type":"number","nullable":true},"planet":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"planetName":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"chara":{"type":"array","items":{"type":"object","properties":{"rank":{"type":"number","nullable":true},"role":{"type":"string","nullable":true},"graha":{"type":"number","nullable":true},"grahaName":{"type":"string","nullable":true},"longitudeInSign":{"type":"number","nullable":true},"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"charaRoles":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"lagna":{"sign":4,"signName":"Leo"},"ayanamsa":23.72254952235926,"naisargika":[{"house":1,"planet":0,"name":"Self / vitality (Sun)","planetName":"Sun"}],"chara":[{"rank":1,"role":"Atmakaraka","graha":4,"grahaName":"Mars","longitudeInSign":24.59257,"sign":10,"signName":"Aquarius"}],"charaRoles":["Atmakaraka"]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/jaimini/chara-karakas":{"post":{"tags":["Vedic"],"summary":"Jaimini: Chara Karakas (detailed)","description":"Detailed chara karaka ranking with Atmakaraka/Darakaraka highlighted. Same algorithm as `/karakas` but focused output for AK/DK-driven analyses.","operationId":"vedic_jaimini_chara-karakas","x-quality":"green","x-source":"PyJHora `chara_karakas` (8-planet system Sun..Rahu).","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/jaimini/chara-karakas \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/jaimini/chara-karakas', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/jaimini/chara-karakas',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/jaimini/chara-karakas', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"lagna":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true}},"nullable":true},"atmakaraka":{"type":"object","properties":{"rank":{"type":"number","nullable":true},"role":{"type":"string","nullable":true},"graha":{"type":"number","nullable":true},"grahaName":{"type":"string","nullable":true},"longitudeInSign":{"type":"number","nullable":true},"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true}},"nullable":true},"darakaraka":{"type":"object","properties":{"rank":{"type":"number","nullable":true},"role":{"type":"string","nullable":true},"graha":{"type":"number","nullable":true},"grahaName":{"type":"string","nullable":true},"longitudeInSign":{"type":"number","nullable":true},"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true}},"nullable":true},"ranking":{"type":"array","items":{"type":"object","properties":{"rank":{"type":"number","nullable":true},"role":{"type":"string","nullable":true},"graha":{"type":"number","nullable":true},"grahaName":{"type":"string","nullable":true},"longitudeInSign":{"type":"number","nullable":true},"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"method":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"lagna":{"sign":4,"signName":"Leo"},"atmakaraka":{"rank":1,"role":"Atmakaraka","graha":4,"grahaName":"Mars","longitudeInSign":24.59257,"sign":10,"signName":"Aquarius"},"darakaraka":{"rank":8,"role":"Darakaraka","graha":0,"grahaName":"Sun","longitudeInSign":0.650212,"sign":1,"signName":"Taurus"},"ranking":[{"rank":1,"role":"Atmakaraka","graha":4,"grahaName":"Mars","longitudeInSign":24.59257,"sign":10,"signName":"Aquarius"}],"method":"8-planet system (Sun..Rahu) sorted by advancement in rasi (Rahu longitude inverted per Jaimini canon)."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/jaimini/padas":{"post":{"tags":["Vedic"],"summary":"Jaimini: Padas (Bhava/Surya/Chandra/Graha Arudhas)","description":"All canonical Arudhas: A1..A12 (Bhava Arudhas / lagna padas), S1..S12 (Surya/Sun arudhas), M1..M12 (Chandra/Moon arudhas), and Graha Arudhas (lagna + 9 planets). Implements 1/7-trim rule per BPHS Adhyaya 26 verse 4.","operationId":"vedic_jaimini_padas","x-quality":"green","x-source":"BPHS Adhyaya 26 + Jaimini Sutras 1.1 + PyJHora `arudhas.bhava_arudhas_from_planet_positions` + `graha_arudhas_from_planet_positions`.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/jaimini/padas \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/jaimini/padas', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/jaimini/padas',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/jaimini/padas', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"lagna":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true}},"nullable":true},"bhavaArudhas":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string","nullable":true},"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"suryaArudhas":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string","nullable":true},"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"chandraArudhas":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string","nullable":true},"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"grahaArudhas":{"type":"array","items":{"type":"object","properties":{"graha":{"type":"string","nullable":true},"grahaName":{"type":"string","nullable":true},"pada":{"type":"number","nullable":true},"padaSignName":{"type":"string","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"lagna":{"sign":4,"signName":"Leo"},"bhavaArudhas":[{"label":"A1","sign":7,"signName":"Scorpio"}],"suryaArudhas":[{"label":"S1","sign":9,"signName":"Capricorn"}],"chandraArudhas":[{"label":"M1","sign":6,"signName":"Libra"}],"grahaArudhas":[{"graha":"L","grahaName":"Lagna","pada":7,"padaSignName":"Scorpio"}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/jaimini/upapada":{"post":{"tags":["Vedic"],"summary":"Jaimini: Upapada Lagna (UL)","description":"Upapada Lagna (UL = A12): pada of the 12th house from lagna. Canonical Jaimini significator for spouse, marriage, partnerships.","operationId":"vedic_jaimini_upapada","x-quality":"green","x-source":"Jaimini Sutras 1.x + BPHS Adhyaya 26.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/jaimini/upapada \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/jaimini/upapada', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/jaimini/upapada',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/jaimini/upapada', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"lagna":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true}},"nullable":true},"upapada":{"type":"object","properties":{"label":{"type":"string","nullable":true},"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true}},"nullable":true},"meaning":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"lagna":{"sign":4,"signName":"Leo"},"upapada":{"label":"UL (A12)","sign":0,"signName":"Aries"},"meaning":"Upapada Lagna (UL): pada of the 12th house from lagna; canonical Jaimini significator for spouse, marriage, partnerships."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/jaimini/aspects":{"post":{"tags":["Vedic"],"summary":"Jaimini: Aspects (Rasi + Graha drishti)","description":"Combined Jaimini aspects: rasi drishti (12-rasi sign-aspect table per modality rules) + graha drishti (per-planet Parashari aspects). Convenience aggregate of `/drishti-rasi` and `/drishti-graha`.","operationId":"vedic_jaimini_aspects","x-quality":"green","x-source":"Jaimini Sutras 1.1 + BPHS graha drishti table.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/jaimini/aspects \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/jaimini/aspects', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/jaimini/aspects',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/jaimini/aspects', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"lagna":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true}},"nullable":true},"rasiDrishti":{"type":"array","items":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"modality":{"type":"string","nullable":true},"aspectingRasis":{"type":"array","items":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true}},"nullable":true},"nullable":true}},"nullable":true},"nullable":true},"grahaDrishti":{"type":"array","items":{"type":"object","properties":{"graha":{"type":"number","nullable":true},"grahaName":{"type":"string","nullable":true},"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"aspectingRasis":{"type":"array","items":{"type":"number","nullable":true},"nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"lagna":{"sign":4,"signName":"Leo"},"rasiDrishti":[{"sign":0,"signName":"Aries","modality":"movable","aspectingRasis":[{"sign":4,"signName":"Leo"}]}],"grahaDrishti":[{"graha":0,"grahaName":"Sun","sign":1,"signName":"Taurus","aspectingRasis":[7]}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/jaimini/drishti-rasi":{"post":{"tags":["Vedic"],"summary":"Jaimini: Rasi Drishti (sign aspects)","description":"Jaimini rasi drishti table: movable signs aspect all fixed except adjacent; fixed aspect all movable except adjacent; dual aspect all other dual. Per Jaimini Sutras 1.1.","operationId":"vedic_jaimini_drishti-rasi","x-quality":"green","x-source":"Jaimini Sutras 1.1 + PyJHora `_get_raasi_drishti`.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/jaimini/drishti-rasi \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/jaimini/drishti-rasi', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/jaimini/drishti-rasi',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/jaimini/drishti-rasi', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"lagna":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true}},"nullable":true},"rasiDrishti":{"type":"array","items":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"modality":{"type":"string","nullable":true},"aspectingRasis":{"type":"array","items":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true}},"nullable":true},"nullable":true}},"nullable":true},"nullable":true},"method":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"lagna":{"sign":4,"signName":"Leo"},"rasiDrishti":[{"sign":0,"signName":"Aries","modality":"movable","aspectingRasis":[{"sign":4,"signName":"Leo"}]}],"method":"Movable→all fixed except adjacent; fixed→all movable except adjacent; dual→all other dual (Jaimini Sutras 1.1)."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/jaimini/drishti-graha":{"post":{"tags":["Vedic"],"summary":"Jaimini: Graha Drishti (planet aspects)","description":"Per-planet graha drishti per Parashari rules (BPHS): Mars 4/7/8, Jupiter 5/7/9, Saturn 3/7/10, others 7th. Used in Jaimini-context dashboards alongside rasi drishti.","operationId":"vedic_jaimini_drishti-graha","x-quality":"green","x-source":"BPHS graha drishti table + PyJHora `graha_drishti_from_chart`.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/jaimini/drishti-graha \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/jaimini/drishti-graha', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/jaimini/drishti-graha',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/jaimini/drishti-graha', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"lagna":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true}},"nullable":true},"grahaDrishti":{"type":"array","items":{"type":"object","properties":{"graha":{"type":"number","nullable":true},"grahaName":{"type":"string","nullable":true},"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"aspectingRasis":{"type":"array","items":{"type":"number","nullable":true},"nullable":true}},"nullable":true},"nullable":true},"method":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"lagna":{"sign":4,"signName":"Leo"},"grahaDrishti":[{"graha":0,"grahaName":"Sun","sign":1,"signName":"Taurus","aspectingRasis":[7]}],"method":"Per Parashari graha drishti (BPHS): Mars 4/7/8, Jupiter 5/7/9, Saturn 3/7/10, others 7th."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/jaimini/atmakaraka-navamsa":{"post":{"tags":["Vedic"],"summary":"Jaimini: Karakamsa (AK in Navamsa)","description":"Karakamsa: sign occupied by the Atmakaraka in the Navamsa (D9). Per Jaimini Sutras 1.2: indicates soul-level destiny, deity worship orientation, primary spiritual path.","operationId":"vedic_jaimini_atmakaraka-navamsa","x-quality":"green","x-source":"Jaimini Sutras 1.2 + BPHS Adhyaya 7 (D9 derivation).","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/jaimini/atmakaraka-navamsa \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/jaimini/atmakaraka-navamsa', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/jaimini/atmakaraka-navamsa',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/jaimini/atmakaraka-navamsa', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"lagna":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true}},"nullable":true},"ak":{"type":"number","nullable":true},"akName":{"type":"string","nullable":true},"d9Sign":{"type":"number","nullable":true},"d9SignName":{"type":"string","nullable":true},"meaning":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"lagna":{"sign":4,"signName":"Leo"},"ak":4,"akName":"Mars","d9Sign":1,"d9SignName":"Taurus","meaning":"Karakamsa: sign occupied by the Atmakaraka in the Navamsa (D9). Per Jaimini Sutras 1.2: indicates soul-level destiny, deity worship, and primary spiritual orientation."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/jaimini/dasha-summary":{"post":{"tags":["Vedic"],"summary":"Jaimini: Running Dasha Summary","description":"Convenience aggregate: returns the running Mahadasha for Chara, Sthira, and Shoola at `targetDate` (default = now). Same builders as the dedicated `/dashas/{chara,sthira,shoola}/maha` endpoints; this one returns three running periods in a single call.","operationId":"vedic_jaimini_dasha-summary","x-quality":"green","x-source":"Aggregates Chara/Sthira/Shoola dasha builders.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JaiminiDashaSummary"},"example":{"date":"1996-12-07","time":"10:34:00","timezoneOffset":5.5,"latitude":13.0389,"longitude":80.2619,"targetDate":"2026-05-07"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/jaimini/dasha-summary \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1996-12-07\", \"time\": \"10:34:00\", \"timezoneOffset\": 5.5, \"latitude\": 13.0389, \"longitude\": 80.2619, \"targetDate\": \"2026-05-07\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/jaimini/dasha-summary', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1996-12-07\",\n    \"time\": \"10:34:00\",\n    \"timezoneOffset\": 5.5,\n    \"latitude\": 13.0389,\n    \"longitude\": 80.2619,\n    \"targetDate\": \"2026-05-07\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/jaimini/dasha-summary',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1996-12-07\",\n      'time': \"10:34:00\",\n      'timezoneOffset': 5.5,\n      'latitude': 13.0389,\n      'longitude': 80.2619,\n      'targetDate': \"2026-05-07\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/jaimini/dasha-summary', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1996-12-07',\n        'time' => '10:34:00',\n        'timezoneOffset' => 5.5,\n        'latitude' => 13.0389,\n        'longitude' => 80.2619,\n        'targetDate' => '2026-05-07',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"lagna":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true}},"nullable":true},"ayanamsa":{"type":"number","nullable":true},"summary":{"type":"object","properties":{"chara":{"type":"object","properties":{"system":{"type":"string","nullable":true},"signName":{"type":"string","nullable":true},"lordName":{"type":"string","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"sthira":{"type":"object","properties":{"system":{"type":"string","nullable":true},"signName":{"type":"string","nullable":true},"brahmaSeed":{"type":"string","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true},"shoola":{"type":"object","properties":{"system":{"type":"string","nullable":true},"signName":{"type":"string","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true}},"nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"lagna":{"sign":9,"signName":"Capricorn"},"ayanamsa":23.81424752115805,"summary":{"chara":{"system":"Chara","signName":"Cancer","lordName":"Moon","startDate":"2023-12-07T23:03:59Z","endDate":"2026-12-07T17:03:59Z","durationYears":3},"sthira":{"system":"Sthira","signName":"Pisces","brahmaSeed":"Jupiter","startDate":"2020-12-07T08:43:56Z","endDate":"2029-12-07T16:06:25Z","durationYears":9},"shoola":{"system":"Shoola","signName":"Aries","startDate":"2023-12-08T03:11:25Z","endDate":"2032-12-07T10:33:54Z","durationYears":9}}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/jaimini/yogas":{"post":{"tags":["Vedic"],"summary":"Jaimini: Yogas (basic AK/DK/PK set)","description":"Basic Jaimini-yoga checks based on chara karakas: Raja yoga (AK in Lagna/Kendra), marriage yoga (DK in trine), AK+PK conjunction (success yoga), AK in dusthana (challenge flag). Phase 2 block 19 will add 5 dedicated `/yogas/jaimini/*` endpoints with Raja/Dhana/Daridra/Viparita Raja yogas per Jaimini canon.","operationId":"vedic_jaimini_yogas","x-quality":"green","x-source":"Jaimini Sutras 2.x + Sanjay Rath modern commentary.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/jaimini/yogas \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/jaimini/yogas', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/jaimini/yogas',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/jaimini/yogas', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"lagna":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true}},"nullable":true},"atmakaraka":{"type":"object","properties":{"graha":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"sign":{"type":"string","nullable":true},"houseFromLagna":{"type":"number","nullable":true}},"nullable":true},"darakaraka":{"type":"object","properties":{"graha":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"sign":{"type":"string","nullable":true},"houseFromLagna":{"type":"number","nullable":true}},"nullable":true},"yogas":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","nullable":true},"present":{"type":"boolean","nullable":true},"description":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"note":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"lagna":{"sign":4,"signName":"Leo"},"atmakaraka":{"graha":4,"name":"Mars","sign":"Aquarius","houseFromLagna":7},"darakaraka":{"graha":0,"name":"Sun","sign":"Taurus","houseFromLagna":10},"yogas":[{"name":"Raja Yoga (AK in Lagna/Kendra)","present":true,"description":"Atmakaraka Mars in house 7 from lagna. Raja yoga active when AK occupies a kendra (1/4/7/10)."}],"note":"Basic Jaimini yoga set. Full Phase-2 block 19 will add 5 dedicated `/yogas/jaimini/*` endpoints with Raja/Dhana/Daridra/Viparita Raja yogas per Jaimini canon."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/jaimini/atmakaraka-rotation":{"post":{"tags":["Vedic"],"summary":"Jaimini: Atmakaraka rotation (timeline)","description":"Naisargika 1°/year symbolic progression of sidereal longitudes; scans for moments when the rank-1 chara karaka (Atmakaraka) changes. Returns timeline of soul-significator transitions with age-of-event + before/after planets + life-event hints. Default span 84 years; capped at 120.","operationId":"vedic_jaimini_atmakaraka-rotation","x-quality":"green","x-source":"Jaimini Sutras 2.x (chara karaka ordering) + Sanjay Rath *Karaka Phala* + PyJHora `chara_karakas`.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1996-12-07","time":"10:34:00","timezoneOffset":5.5,"latitude":13.0389,"longitude":80.2619,"years":84}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/jaimini/atmakaraka-rotation \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1996-12-07\", \"time\": \"10:34:00\", \"timezoneOffset\": 5.5, \"latitude\": 13.0389, \"longitude\": 80.2619, \"years\": 84 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/jaimini/atmakaraka-rotation', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1996-12-07\",\n    \"time\": \"10:34:00\",\n    \"timezoneOffset\": 5.5,\n    \"latitude\": 13.0389,\n    \"longitude\": 80.2619,\n    \"years\": 84\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/jaimini/atmakaraka-rotation',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1996-12-07\",\n      'time': \"10:34:00\",\n      'timezoneOffset': 5.5,\n      'latitude': 13.0389,\n      'longitude': 80.2619,\n      'years': 84\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/jaimini/atmakaraka-rotation', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1996-12-07',\n        'time' => '10:34:00',\n        'timezoneOffset' => 5.5,\n        'latitude' => 13.0389,\n        'longitude' => 80.2619,\n        'years' => 84,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"lagna":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true}},"nullable":true},"birthAtmakaraka":{"type":"object","properties":{"graha":{"type":"number","nullable":true},"grahaName":{"type":"string","nullable":true}},"nullable":true},"yearsScanned":{"type":"number","nullable":true},"method":{"type":"string","nullable":true},"events":{"type":"array","items":{"type":"object","properties":{"ageYears":{"type":"number","nullable":true},"fromPlanet":{"type":"object","properties":{"graha":{"type":"number","nullable":true},"grahaName":{"type":"string","nullable":true}},"nullable":true},"toPlanet":{"type":"object","properties":{"graha":{"type":"number","nullable":true},"grahaName":{"type":"string","nullable":true}},"nullable":true},"triggers":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"lagna":{"sign":9,"signName":"Capricorn"},"birthAtmakaraka":{"graha":5,"grahaName":"Jupiter"},"yearsScanned":84,"method":"Naisargika 1°/year symbolic progression of sidereal longitudes; AK = rank-1 of charaKarakas at each step.","events":[{"ageYears":4.18,"fromPlanet":{"graha":5,"grahaName":"Jupiter"},"toPlanet":{"graha":3,"grahaName":"Venus"},"triggers":["Soul-significator shifts from Jupiter to Venus: expect a re-orientation in life-direction during age ~4.2."]}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/jaimini/argala-analysis":{"post":{"tags":["Vedic"],"summary":"Jaimini: Argala / Virodhargala scan","description":"Full Argala (intervention) + Virodhargala (counter-intervention) scan across all 12 houses. Argala from 2/4/11 (primary), 5 (secondary), 8 (special); Virodhargala from 12/10/3 (primary), 9 (secondary), 6 (special). Net influence and dominant-over metric per house.","operationId":"vedic_jaimini_argala-analysis","x-quality":"green","x-source":"Jaimini Sutras 1.1 (Suryanarain Rao 1949 trans.) + Sanjay Rath *Crux of Vedic Astrology* + PyJHora `house._argala`.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/jaimini/argala-analysis \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/jaimini/argala-analysis', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/jaimini/argala-analysis',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/jaimini/argala-analysis', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"lagna":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true}},"nullable":true},"houses":{"type":"array","items":{"type":"object","properties":{"houseNum":{"type":"number","nullable":true},"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"argalas":{"type":"array","items":{"type":"object","properties":{"from":{"type":"number","nullable":true},"fromSign":{"type":"number","nullable":true},"fromSignName":{"type":"string","nullable":true},"planets":{"type":"array","items":{},"nullable":true},"strength":{"type":"number","nullable":true},"type":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"virodhargalas":{"type":"array","items":{"type":"object","properties":{"from":{"type":"number","nullable":true},"fromSign":{"type":"number","nullable":true},"fromSignName":{"type":"string","nullable":true},"planets":{"type":"array","items":{"type":"object","properties":{"graha":{"type":"number","nullable":true},"grahaName":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"strength":{"type":"number","nullable":true},"type":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"netInfluence":{"type":"number","nullable":true},"dominantOver":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"strongestArgala":{"type":"object","properties":{"houseNum":{"type":"number","nullable":true},"score":{"type":"number","nullable":true}},"nullable":true},"weakestArgala":{"type":"object","properties":{"houseNum":{"type":"number","nullable":true},"score":{"type":"number","nullable":true}},"nullable":true},"method":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"lagna":{"sign":4,"signName":"Leo"},"houses":[{"houseNum":1,"sign":4,"signName":"Leo","argalas":[{"from":2,"fromSign":5,"fromSignName":"Virgo","planets":[],"strength":0,"type":"primary"}],"virodhargalas":[{"from":12,"fromSign":3,"fromSignName":"Cancer","planets":[{"graha":100,"grahaName":"Ketu"}],"strength":55,"type":"primary"}],"netInfluence":22,"dominantOver":19}],"strongestArgala":{"houseNum":5,"score":81},"weakestArgala":{"houseNum":10,"score":19},"method":"Argala from 2/4/11 (primary), 5 (secondary), 8 (special); Virodhargala from 12/10/3 (primary), 9 (secondary), 6 (special). Per Jaimini Sutras 1.1 + Sanjay Rath."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/kp/cusps":{"post":{"tags":["Vedic"],"summary":"KP: Placidus cusps with sub-lord chain","description":"KP-canonical Placidus cusps (12) with full sub-lord chain (sign / star / sub / sub-sub) for each cusp. Sub-lord chain follows K.S. Krishnamurti 1971 Vimshottari proportional sub-divisions.","operationId":"vedic_kp_cusps","x-quality":"green","x-source":"K.S. Krishnamurti *Reader II* (1971) + Vimshottari proportional 27×9 sub-divisions.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/kp/cusps \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/kp/cusps', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/kp/cusps',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/kp/cusps', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"lagna":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"longitude":{"type":"number","nullable":true}},"nullable":true},"ayanamsa":{"type":"number","nullable":true},"cusps":{"type":"array","items":{"type":"object","properties":{"house":{"type":"number","nullable":true},"longitude":{"type":"number","nullable":true},"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"signLord":{"type":"number","nullable":true},"signLordName":{"type":"string","nullable":true},"star":{"type":"number","nullable":true},"starName":{"type":"string","nullable":true},"starLord":{"type":"number","nullable":true},"starLordName":{"type":"string","nullable":true},"sub":{"type":"number","nullable":true},"subName":{"type":"string","nullable":true},"subSub":{"type":"number","nullable":true},"subSubName":{"type":"string","nullable":true},"positionInSign":{"type":"number","nullable":true},"positionInStar":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"method":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"lagna":{"sign":4,"signName":"Leo","longitude":146.24540052582552},"ayanamsa":23.72254952235926,"cusps":[{"house":1,"longitude":146.24540052582552,"sign":4,"signName":"Leo","signLord":0,"signLordName":"Sun","star":11,"starName":"Purva Phalguni","starLord":3,"starLordName":"Venus","sub":100,"subName":"Ketu","subSub":11,"subSubName":"Rahu","positionInSign":26.245400525825517,"positionInStar":12.912067192492174}],"method":"KP Placidus cusps with sub-lord chain (sign / star / sub / sub-sub) per K.S. Krishnamurti 1971."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/kp/sub-lords":{"post":{"tags":["Vedic"],"summary":"KP: Sub-lords (cusps + planets)","description":"Full KP \"horoscope at a glance\" table: sub-lord chain for every cusp + every planet (lagna, 9 grahas including Ketu).","operationId":"vedic_kp_sub-lords","x-quality":"green","x-source":"K.S. Krishnamurti *Reader I-II*.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/kp/sub-lords \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/kp/sub-lords', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/kp/sub-lords',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/kp/sub-lords', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"lagna":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true}},"nullable":true},"cusps":{"type":"array","items":{"type":"object","properties":{"house":{"type":"number","nullable":true},"longitude":{"type":"number","nullable":true},"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"signLord":{"type":"number","nullable":true},"signLordName":{"type":"string","nullable":true},"star":{"type":"number","nullable":true},"starName":{"type":"string","nullable":true},"starLord":{"type":"number","nullable":true},"starLordName":{"type":"string","nullable":true},"sub":{"type":"number","nullable":true},"subName":{"type":"string","nullable":true},"subSub":{"type":"number","nullable":true},"subSubName":{"type":"string","nullable":true},"positionInSign":{"type":"number","nullable":true},"positionInStar":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"planets":{"type":"array","items":{"type":"object","properties":{"graha":{"type":"number","nullable":true},"grahaName":{"type":"string","nullable":true},"longitude":{"type":"number","nullable":true},"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"signLord":{"type":"number","nullable":true},"signLordName":{"type":"string","nullable":true},"star":{"type":"number","nullable":true},"starName":{"type":"string","nullable":true},"starLord":{"type":"number","nullable":true},"starLordName":{"type":"string","nullable":true},"sub":{"type":"number","nullable":true},"subName":{"type":"string","nullable":true},"subSub":{"type":"number","nullable":true},"subSubName":{"type":"string","nullable":true},"positionInSign":{"type":"number","nullable":true},"positionInStar":{"type":"number","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"lagna":{"sign":4,"signName":"Leo"},"cusps":[{"house":1,"longitude":146.24540052582552,"sign":4,"signName":"Leo","signLord":0,"signLordName":"Sun","star":11,"starName":"Purva Phalguni","starLord":3,"starLordName":"Venus","sub":100,"subName":"Ketu","subSub":11,"subSubName":"Rahu","positionInSign":26.245400525825517,"positionInStar":12.912067192492174}],"planets":[{"graha":0,"grahaName":"Sun","longitude":30.650211922318988,"sign":1,"signName":"Taurus","signLord":3,"signLordName":"Venus","star":3,"starName":"Krittika","starLord":0,"starLordName":"Sun","sub":11,"subName":"Rahu","subSub":3,"subSubName":"Venus","positionInSign":0.650211922318988,"positionInStar":3.98354525565232}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/kp/ruling-planets":{"post":{"tags":["Vedic"],"summary":"KP: Ruling Planets","description":"Canonical KP ruling planets: Day-lord + Hora-lord + Asc-sign + Asc-star + Asc-sub + Moon-sign + Moon-star + Moon-sub, deduplicated. Used in horary timing analysis.","operationId":"vedic_kp_ruling-planets","x-quality":"green","x-source":"K.S. Krishnamurti *Reader III* (Horary).","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/kp/ruling-planets \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/kp/ruling-planets', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/kp/ruling-planets',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/kp/ruling-planets', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"ayanamsa":{"type":"number","nullable":true},"dayLord":{"type":"object","properties":{"graha":{"type":"number","nullable":true},"name":{"type":"string","nullable":true}},"nullable":true},"horaLord":{"type":"object","properties":{"graha":{"type":"number","nullable":true},"name":{"type":"string","nullable":true}},"nullable":true},"ascendant":{"type":"object","properties":{"longitude":{"type":"number","nullable":true},"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"signLord":{"type":"number","nullable":true},"signLordName":{"type":"string","nullable":true},"star":{"type":"number","nullable":true},"starName":{"type":"string","nullable":true},"starLord":{"type":"number","nullable":true},"starLordName":{"type":"string","nullable":true},"sub":{"type":"number","nullable":true},"subName":{"type":"string","nullable":true},"subSub":{"type":"number","nullable":true},"subSubName":{"type":"string","nullable":true},"positionInSign":{"type":"number","nullable":true},"positionInStar":{"type":"number","nullable":true}},"nullable":true},"moon":{"type":"object","properties":{"longitude":{"type":"number","nullable":true},"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"signLord":{"type":"number","nullable":true},"signLordName":{"type":"string","nullable":true},"star":{"type":"number","nullable":true},"starName":{"type":"string","nullable":true},"starLord":{"type":"number","nullable":true},"starLordName":{"type":"string","nullable":true},"sub":{"type":"number","nullable":true},"subName":{"type":"string","nullable":true},"subSub":{"type":"number","nullable":true},"subSubName":{"type":"string","nullable":true},"positionInSign":{"type":"number","nullable":true},"positionInStar":{"type":"number","nullable":true}},"nullable":true},"rulingPlanets":{"type":"array","items":{"type":"object","properties":{"graha":{"type":"number","nullable":true},"name":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"method":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"ayanamsa":23.72254952235926,"dayLord":{"graha":2,"name":"Mercury"},"horaLord":{"graha":4,"name":"Mars"},"ascendant":{"longitude":146.24540052582552,"sign":4,"signName":"Leo","signLord":0,"signLordName":"Sun","star":11,"starName":"Purva Phalguni","starLord":3,"starLordName":"Venus","sub":100,"subName":"Ketu","subSub":11,"subSubName":"Rahu","positionInSign":26.245400525825517,"positionInStar":12.912067192492174},"moon":{"longitude":273.1788798971629,"sign":9,"signName":"Capricorn","signLord":6,"signLordName":"Saturn","star":21,"starName":"Uttara Ashadha","starLord":0,"starLordName":"Sun","sub":6,"subName":"Saturn","subSub":6,"subSubName":"Saturn","positionInSign":3.178879897162915,"positionInStar":6.512213230496229},"rulingPlanets":[{"graha":2,"name":"Mercury"}],"method":"Day-lord + Hora-lord + Asc(sign/star/sub) + Moon(sign/star/sub), deduplicated. Hora calculation uses simple JD-hour Chaldean cascade (canonical sunrise-anchored hora deferred to v2)."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/kp/horary":{"post":{"tags":["Vedic"],"summary":"KP: Horary chart (1..249)","description":"KP number chart: the number 1..249 fixes the sidereal ascendant (249-entry table, the six subs on a sign edge split in two); cusps are Placidus for the moment of the question day when that degree rises at the place, planets are taken at the question time. ascendantAt picks the centre (default) or the first degree of the segment. Latitudes past 66.5 are refused.","operationId":"vedic_kp_horary","x-quality":"green","x-source":"K.S. Krishnamurti, Reader VI: number horary.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HoraryInput"},"example":{"horaryNumber":108,"date":"2026-05-07","time":"12:00:00","timezoneOffset":0,"latitude":13.0389,"longitude":80.2619}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/kp/horary \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"horaryNumber\": 108, \"date\": \"2026-05-07\", \"time\": \"12:00:00\", \"timezoneOffset\": 0, \"latitude\": 13.0389, \"longitude\": 80.2619 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/kp/horary', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"horaryNumber\": 108,\n    \"date\": \"2026-05-07\",\n    \"time\": \"12:00:00\",\n    \"timezoneOffset\": 0,\n    \"latitude\": 13.0389,\n    \"longitude\": 80.2619\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/kp/horary',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'horaryNumber': 108,\n      'date': \"2026-05-07\",\n      'time': \"12:00:00\",\n      'timezoneOffset': 0,\n      'latitude': 13.0389,\n      'longitude': 80.2619\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/kp/horary', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'horaryNumber' => 108,\n        'date' => '2026-05-07',\n        'time' => '12:00:00',\n        'timezoneOffset' => 0,\n        'latitude' => 13.0389,\n        'longitude' => 80.2619,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"horaryNumber":{"type":"number","nullable":true},"ascendantAt":{"type":"string","nullable":true},"segment":{"type":"object","properties":{"start":{"type":"number","nullable":true},"end":{"type":"number","nullable":true}},"nullable":true},"ascSidereal":{"type":"number","nullable":true},"ascendant":{"type":"object","properties":{"longitude":{"type":"number","nullable":true},"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"signLord":{"type":"number","nullable":true},"signLordName":{"type":"string","nullable":true},"star":{"type":"number","nullable":true},"starName":{"type":"string","nullable":true},"starLord":{"type":"number","nullable":true},"starLordName":{"type":"string","nullable":true},"sub":{"type":"number","nullable":true},"subName":{"type":"string","nullable":true},"subSub":{"type":"number","nullable":true},"subSubName":{"type":"string","nullable":true},"positionInSign":{"type":"number","nullable":true},"positionInStar":{"type":"number","nullable":true}},"nullable":true},"ayanamsa":{"type":"number","nullable":true},"housesJd":{"type":"number","nullable":true},"housesOffsetHours":{"type":"number","nullable":true},"cusps":{"type":"array","items":{"type":"object","properties":{"house":{"type":"number","nullable":true},"longitude":{"type":"number","nullable":true},"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"signLord":{"type":"number","nullable":true},"signLordName":{"type":"string","nullable":true},"star":{"type":"number","nullable":true},"starName":{"type":"string","nullable":true},"starLord":{"type":"number","nullable":true},"starLordName":{"type":"string","nullable":true},"sub":{"type":"number","nullable":true},"subName":{"type":"string","nullable":true},"subSub":{"type":"number","nullable":true},"subSubName":{"type":"string","nullable":true},"positionInSign":{"type":"number","nullable":true},"positionInStar":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"planets":{"type":"array","items":{"type":"object","properties":{"graha":{"type":"number","nullable":true},"grahaName":{"type":"string","nullable":true},"house":{"type":"number","nullable":true},"retrograde":{"type":"boolean","nullable":true},"longitude":{"type":"number","nullable":true},"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"signLord":{"type":"number","nullable":true},"signLordName":{"type":"string","nullable":true},"star":{"type":"number","nullable":true},"starName":{"type":"string","nullable":true},"starLord":{"type":"number","nullable":true},"starLordName":{"type":"string","nullable":true},"sub":{"type":"number","nullable":true},"subName":{"type":"string","nullable":true},"subSub":{"type":"number","nullable":true},"subSubName":{"type":"string","nullable":true},"positionInSign":{"type":"number","nullable":true},"positionInStar":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"method":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"horaryNumber":108,"ascendantAt":"middle","segment":{"start":152.99999999999997,"end":155.1111111111111},"ascSidereal":154.05555555555554,"ascendant":{"longitude":154.05555555555554,"sign":5,"signName":"Virgo","signLord":2,"signLordName":"Mercury","star":12,"starName":"Uttara Phalguni","starLord":0,"starLordName":"Sun","sub":6,"subName":"Saturn","subSub":3,"subSubName":"Venus","positionInSign":4.055555555555543,"positionInStar":7.388888888888857},"ayanamsa":24.225142492142083,"housesJd":2461167.896548448,"housesOffsetHours":-2.4828372448682785,"cusps":[{"house":1,"longitude":154.05555555555554,"sign":5,"signName":"Virgo","signLord":2,"signLordName":"Mercury","star":12,"starName":"Uttara Phalguni","starLord":0,"starLordName":"Sun","sub":6,"subName":"Saturn","subSub":3,"subSubName":"Venus","positionInSign":4.055555555555543,"positionInStar":7.388888888888857}],"planets":[{"graha":0,"grahaName":"Sun","house":8,"retrograde":false,"longitude":22.717262228598713,"sign":0,"signName":"Aries","signLord":4,"signLordName":"Mars","star":2,"starName":"Bharani","starLord":3,"starLordName":"Venus","sub":6,"subName":"Saturn","subSub":3,"subSubName":"Venus","positionInSign":22.717262228598713,"positionInStar":9.38392889526538}],"method":"KP number chart (Krishnamurti, Reader VI). The number 1..249 fixes the sidereal ascendant; cusps are Placidus for the moment of the question day when that degree rises at the given place, the one nearest the question time (housesOffsetHours); planets are taken at the question time. Ruling planets for the same moment: /vedic/kp/ruling-planets."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/kp/significators":{"post":{"tags":["Vedic"],"summary":"KP: Significators (primary/secondary/tertiary)","description":"KP significator hierarchy per planet: primary = houses occupied by the star-lord; secondary = houses occupied by the planet itself; tertiary = houses occupied by the sign-lord. K.S. Krishnamurti *Reader IV*.","operationId":"vedic_kp_significators","x-quality":"green","x-source":"K.S. Krishnamurti *Reader IV* significator hierarchy.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/kp/significators \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/kp/significators', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/kp/significators',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/kp/significators', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"lagna":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true}},"nullable":true},"significators":{"type":"array","items":{"type":"object","properties":{"graha":{"type":"number","nullable":true},"grahaName":{"type":"string","nullable":true},"occupies":{"type":"number","nullable":true},"primary":{"type":"number","nullable":true},"secondary":{"type":"number","nullable":true},"tertiary":{"type":"number","nullable":true},"chain":{"type":"object","properties":{"signLord":{"type":"number","nullable":true},"starLord":{"type":"number","nullable":true},"sub":{"type":"number","nullable":true},"subSub":{"type":"number","nullable":true}},"nullable":true}},"nullable":true},"nullable":true},"method":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"lagna":{"sign":4,"signName":"Leo"},"significators":[{"graha":0,"grahaName":"Sun","occupies":9,"primary":9,"secondary":9,"tertiary":7,"chain":{"signLord":3,"starLord":0,"sub":11,"subSub":3}}],"method":"KP significator hierarchy: primary = houses occupied by the star-lord; secondary = houses occupied by the planet; tertiary = houses occupied by the sign-lord. K.S. Krishnamurti *Reader IV*."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/kp/planet-cuspal-position":{"post":{"tags":["Vedic"],"summary":"KP: Planet cuspal positions","description":"For each planet: sidereal longitude + KP chain (sign/star/sub/sub-sub) + Placidus house occupied. Convenience layout for KP analyses.","operationId":"vedic_kp_planet-cuspal-position","x-quality":"green","x-source":"K.S. Krishnamurti *Reader II*.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/kp/planet-cuspal-position \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/kp/planet-cuspal-position', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/kp/planet-cuspal-position',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/kp/planet-cuspal-position', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"lagna":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"longitude":{"type":"number","nullable":true}},"nullable":true},"planets":{"type":"array","items":{"type":"object","properties":{"graha":{"type":"number","nullable":true},"grahaName":{"type":"string","nullable":true},"house":{"type":"number","nullable":true},"longitude":{"type":"number","nullable":true},"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"signLord":{"type":"number","nullable":true},"signLordName":{"type":"string","nullable":true},"star":{"type":"number","nullable":true},"starName":{"type":"string","nullable":true},"starLord":{"type":"number","nullable":true},"starLordName":{"type":"string","nullable":true},"sub":{"type":"number","nullable":true},"subName":{"type":"string","nullable":true},"subSub":{"type":"number","nullable":true},"subSubName":{"type":"string","nullable":true},"positionInSign":{"type":"number","nullable":true},"positionInStar":{"type":"number","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"lagna":{"sign":4,"signName":"Leo","longitude":146.24540052582552},"planets":[{"graha":0,"grahaName":"Sun","house":9,"longitude":30.650211922318988,"sign":1,"signName":"Taurus","signLord":3,"signLordName":"Venus","star":3,"starName":"Krittika","starLord":0,"starLordName":"Sun","sub":11,"subName":"Rahu","subSub":3,"subSubName":"Venus","positionInSign":0.650211922318988,"positionInStar":3.98354525565232}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/kp/sub-sub-lord":{"post":{"tags":["Vedic"],"summary":"KP: Sub-sub-lord lookup","description":"Returns the full sub-lord chain (sign/star/sub/sub-sub) at any sidereal longitude 0..360. Useful for transit-trigger and dasha-bhukti exact-moment analysis.","operationId":"vedic_kp_sub-sub-lord","x-quality":"green","x-source":"K.S. Krishnamurti Vimshottari sub-divisions (27 × 9).","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubSubLord"},"example":{"longitude":215.5}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/kp/sub-sub-lord \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"longitude\": 215.5 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/kp/sub-sub-lord', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"longitude\": 215.5\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/kp/sub-sub-lord',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'longitude': 215.5\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/kp/sub-sub-lord', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'longitude' => 215.5,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"chain":{"type":"object","properties":{"longitude":{"type":"number","nullable":true},"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"signLord":{"type":"number","nullable":true},"signLordName":{"type":"string","nullable":true},"star":{"type":"number","nullable":true},"starName":{"type":"string","nullable":true},"starLord":{"type":"number","nullable":true},"starLordName":{"type":"string","nullable":true},"sub":{"type":"number","nullable":true},"subName":{"type":"string","nullable":true},"subSub":{"type":"number","nullable":true},"subSubName":{"type":"string","nullable":true},"positionInSign":{"type":"number","nullable":true},"positionInStar":{"type":"number","nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"chain":{"longitude":215.5,"sign":7,"signName":"Scorpio","signLord":4,"signLordName":"Mars","star":17,"starName":"Anuradha","starLord":6,"starLordName":"Saturn","sub":2,"subName":"Mercury","subSub":2,"subSubName":"Mercury","positionInSign":5.5,"positionInStar":2.166666666666657}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/kp/asc-sub":{"post":{"tags":["Vedic"],"summary":"KP: Ascendant sub-lord","description":"Sub-lord of the Ascendant: the canonical \"ruling indicator\" for the chart's primary motivation, life direction, and dominant karmic theme per K.S. Krishnamurti *Reader I-II*.","operationId":"vedic_kp_asc-sub","x-quality":"green","x-source":"K.S. Krishnamurti *Reader I-II*.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/kp/asc-sub \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/kp/asc-sub', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/kp/asc-sub',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/kp/asc-sub', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"lagna":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"longitude":{"type":"number","nullable":true}},"nullable":true},"chain":{"type":"object","properties":{"longitude":{"type":"number","nullable":true},"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"signLord":{"type":"number","nullable":true},"signLordName":{"type":"string","nullable":true},"star":{"type":"number","nullable":true},"starName":{"type":"string","nullable":true},"starLord":{"type":"number","nullable":true},"starLordName":{"type":"string","nullable":true},"sub":{"type":"number","nullable":true},"subName":{"type":"string","nullable":true},"subSub":{"type":"number","nullable":true},"subSubName":{"type":"string","nullable":true},"positionInSign":{"type":"number","nullable":true},"positionInStar":{"type":"number","nullable":true}},"nullable":true},"ascSubLord":{"type":"object","properties":{"graha":{"type":"number","nullable":true},"name":{"type":"string","nullable":true}},"nullable":true},"meaning":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"lagna":{"sign":4,"signName":"Leo","longitude":146.24540052582552},"chain":{"longitude":146.24540052582552,"sign":4,"signName":"Leo","signLord":0,"signLordName":"Sun","star":11,"starName":"Purva Phalguni","starLord":3,"starLordName":"Venus","sub":100,"subName":"Ketu","subSub":11,"subSubName":"Rahu","positionInSign":26.245400525825517,"positionInStar":12.912067192492174},"ascSubLord":{"graha":100,"name":"Ketu"},"meaning":"KP: the sub-lord of the Ascendant signifies the chart-bearer's primary motivation, life direction, and dominant karmic theme (K.S. Krishnamurti *Reader I-II*)."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/kp/fortuna":{"post":{"tags":["Vedic"],"summary":"KP: Part of Fortune","description":"Part of Fortune (Lot of Fortune): ASC + Moon − Sun (day birth) or ASC + Sun − Moon (night birth). Sub-lord chain attached for KP-style usage.","operationId":"vedic_kp_fortuna","x-quality":"green","x-source":"Hellenistic Lot of Fortune (Ptolemy *Tetrabiblos* III.10) + KP sub-lord overlay.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/kp/fortuna \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/kp/fortuna', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/kp/fortuna',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/kp/fortuna', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"lagna":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true}},"nullable":true},"isDayBirth":{"type":"boolean","nullable":true},"fortunaLongitude":{"type":"number","nullable":true},"house":{"type":"number","nullable":true},"chain":{"type":"object","properties":{"longitude":{"type":"number","nullable":true},"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"signLord":{"type":"number","nullable":true},"signLordName":{"type":"string","nullable":true},"star":{"type":"number","nullable":true},"starName":{"type":"string","nullable":true},"starLord":{"type":"number","nullable":true},"starLordName":{"type":"string","nullable":true},"sub":{"type":"number","nullable":true},"subName":{"type":"string","nullable":true},"subSub":{"type":"number","nullable":true},"subSubName":{"type":"string","nullable":true},"positionInSign":{"type":"number","nullable":true},"positionInStar":{"type":"number","nullable":true}},"nullable":true},"formula":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"lagna":{"sign":4,"signName":"Leo"},"isDayBirth":true,"fortunaLongitude":28.7740685006695,"house":9,"chain":{"longitude":28.7740685006695,"sign":0,"signName":"Aries","signLord":4,"signLordName":"Mars","star":3,"starName":"Krittika","starLord":0,"starLordName":"Sun","sub":4,"subName":"Mars","subSub":6,"subSubName":"Saturn","positionInSign":28.7740685006695,"positionInStar":2.1074018340028324},"formula":"ASC + Moon − Sun"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/kp/transit-kp":{"post":{"tags":["Vedic"],"summary":"KP: Transit positions","description":"Sidereal positions of all 9 grahas (incl. Ketu) at `targetDate` (default = now) with KP sub-lord chain attached. Use for KP transit-timing.","operationId":"vedic_kp_transit-kp","x-quality":"green","x-source":"Swiss Ephemeris sidereal positions + KP chain.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Transit"},"example":{"date":"2026-05-07","time":"12:00:00","timezoneOffset":0}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/kp/transit-kp \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"2026-05-07\", \"time\": \"12:00:00\", \"timezoneOffset\": 0 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/kp/transit-kp', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"2026-05-07\",\n    \"time\": \"12:00:00\",\n    \"timezoneOffset\": 0\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/kp/transit-kp',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"2026-05-07\",\n      'time': \"12:00:00\",\n      'timezoneOffset': 0\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/kp/transit-kp', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '2026-05-07',\n        'time' => '12:00:00',\n        'timezoneOffset' => 0,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"jd":{"type":"number","nullable":true},"ayanamsa":{"type":"number","nullable":true},"planets":{"type":"array","items":{"type":"object","properties":{"graha":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"longitude":{"type":"number","nullable":true},"chain":{"type":"object","properties":{"longitude":{"type":"number","nullable":true},"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"signLord":{"type":"number","nullable":true},"signLordName":{"type":"string","nullable":true},"star":{"type":"number","nullable":true},"starName":{"type":"string","nullable":true},"starLord":{"type":"number","nullable":true},"starLordName":{"type":"string","nullable":true},"sub":{"type":"number","nullable":true},"subName":{"type":"string","nullable":true},"subSub":{"type":"number","nullable":true},"subSubName":{"type":"string","nullable":true},"positionInSign":{"type":"number","nullable":true},"positionInStar":{"type":"number","nullable":true}},"nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"jd":2461168,"ayanamsa":24.225142492142083,"planets":[{"graha":0,"name":"Sun","longitude":22.717262228598695,"chain":{"longitude":22.717262228598713,"sign":0,"signName":"Aries","signLord":4,"signLordName":"Mars","star":2,"starName":"Bharani","starLord":3,"starLordName":"Venus","sub":6,"subName":"Saturn","subSub":3,"subSubName":"Venus","positionInSign":22.717262228598713,"positionInStar":9.38392889526538}}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/lal-kitab/teva":{"post":{"tags":["Vedic"],"summary":"Lal Kitab: Teva (fixed-house chart)","description":"Lal Kitab teva: fixed-house chart where house = sign (Aries=1..Pisces=12), no ASC rotation. Each planet placed by sign with state (own/exalted/debilitated/neutral) + pakka-ghar match flag. YELLOW: Lal Kitab is single-school; we ship K. Ashant + R.D. Mathur consensus.","operationId":"vedic_lal-kitab_teva","x-quality":"yellow","x-source":"K. Ashant *Lal Kitab Astrology in Practice* + R.D. Mathur. Anonymous Urdu MSS 1939-1952 (Pandit Roop Chand Joshi attribution).","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/lal-kitab/teva \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/lal-kitab/teva', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/lal-kitab/teva',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/lal-kitab/teva', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"lagna":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true}},"nullable":true},"teva":{"type":"array","items":{"type":"object","properties":{"graha":{"type":"number","nullable":true},"grahaName":{"type":"string","nullable":true},"house":{"type":"number","nullable":true},"houseName":{"type":"string","nullable":true},"pakkaGhar":{"type":"number","nullable":true},"inPakkaGhar":{"type":"boolean","nullable":true},"state":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"pakkaGhars":{"type":"array","items":{"type":"object","properties":{"graha":{"type":"number","nullable":true},"house":{"type":"number","nullable":true},"houseName":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"lagna":{"sign":4,"signName":"Leo"},"teva":[{"graha":0,"grahaName":"Sun","house":1,"houseName":"Taurus","pakkaGhar":0,"inPakkaGhar":false,"state":"neutral"}],"pakkaGhars":[{"graha":0,"house":0,"houseName":"Aries"}],"disclaimer":"Lal Kitab is a North-Indian Vedic school based on anonymous Urdu manuscripts (1939-1952). This implementation aggregates the K. Ashant + R.D. Mathur + U.C. Mahajan modern English-language consensus. Some rules diverge across authors, flagged YELLOW where they do."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/lal-kitab/lal-kundali":{"post":{"tags":["Vedic"],"summary":"Lal Kitab: Kundali (12-house grid)","description":"Lal Kitab kundali grid layout: 12 houses, each listing planets currently in it with state. Companion to /teva for chart visualization.","operationId":"vedic_lal-kitab_lal-kundali","x-quality":"yellow","x-source":"K. Ashant Vol. I.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/lal-kitab/lal-kundali \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/lal-kitab/lal-kundali', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/lal-kitab/lal-kundali',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/lal-kitab/lal-kundali', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"lagna":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true}},"nullable":true},"grid":{"type":"array","items":{"type":"object","properties":{"house":{"type":"number","nullable":true},"houseName":{"type":"string","nullable":true},"planets":{"type":"array","items":{"type":"object","properties":{"graha":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"state":{"type":"string","nullable":true}},"nullable":true},"nullable":true}},"nullable":true},"nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"lagna":{"sign":4,"signName":"Leo"},"grid":[{"house":0,"houseName":"Aries","planets":[{"graha":2,"name":"Mercury","state":"neutral"}]}],"disclaimer":"Lal Kitab is a North-Indian Vedic school based on anonymous Urdu manuscripts (1939-1952). This implementation aggregates the K. Ashant + R.D. Mathur + U.C. Mahajan modern English-language consensus. Some rules diverge across authors, flagged YELLOW where they do."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/lal-kitab/kismat":{"post":{"tags":["Vedic"],"summary":"Lal Kitab: Kismat (fortune indicator)","description":"LK fortune score: +2 pakka ghar, +1 own sign, +2 exalted, −2 debilitated. Higher = more fortunate per K. Ashant Vol. III.","operationId":"vedic_lal-kitab_kismat","x-quality":"yellow","x-source":"K. Ashant Vol. III scoring rubric.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/lal-kitab/kismat \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/lal-kitab/kismat', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/lal-kitab/kismat',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/lal-kitab/kismat', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"lagna":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true}},"nullable":true},"kismat":{"type":"object","properties":{"score":{"type":"number","nullable":true},"factors":{"type":"array","items":{"type":"object","properties":{"graha":{"type":"number","nullable":true},"grahaName":{"type":"string","nullable":true},"bonus":{"type":"number","nullable":true},"reason":{"type":"string","nullable":true}},"nullable":true},"nullable":true}},"nullable":true},"interpretation":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"lagna":{"sign":4,"signName":"Leo"},"kismat":{"score":5,"factors":[{"graha":3,"grahaName":"Venus","bonus":2,"reason":"exalted (+2)"}]},"interpretation":"Moderate fortune","disclaimer":"Lal Kitab is a North-Indian Vedic school based on anonymous Urdu manuscripts (1939-1952). This implementation aggregates the K. Ashant + R.D. Mathur + U.C. Mahajan modern English-language consensus. Some rules diverge across authors, flagged YELLOW where they do."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/lal-kitab/dasha":{"post":{"tags":["Vedic"],"summary":"Lal Kitab: Dasha (35-year cycle)","description":"Lal Kitab dasha: 35-year cycle, 1 house per ~2.917 years from age 0 forward. Per K. Ashant tradition (alternate 38y impl in some authors flagged in `method`).","operationId":"vedic_lal-kitab_dasha","x-quality":"yellow","x-source":"K. Ashant 35y tradition (R.D. Mathur 38y variant noted).","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/lal-kitab/dasha \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/lal-kitab/dasha', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/lal-kitab/dasha',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/lal-kitab/dasha', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"lagna":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true}},"nullable":true},"dasha":{"type":"array","items":{"type":"object","properties":{"house":{"type":"number","nullable":true},"houseName":{"type":"string","nullable":true},"ruler":{"type":"number","nullable":true},"rulerName":{"type":"string","nullable":true},"ageStart":{"type":"number","nullable":true},"ageEnd":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"cycleYears":{"type":"number","nullable":true},"method":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"lagna":{"sign":4,"signName":"Leo"},"dasha":[{"house":0,"houseName":"Aries","ruler":4,"rulerName":"Mars","ageStart":0,"ageEnd":2.9166666666666665}],"cycleYears":35,"method":"35-year cycle, one house per ~2.917 years from age 0. Per K. Ashant tradition (R.D. Mathur uses 38y in some impls; caller can scale).","disclaimer":"Lal Kitab is a North-Indian Vedic school based on anonymous Urdu manuscripts (1939-1952). This implementation aggregates the K. Ashant + R.D. Mathur + U.C. Mahajan modern English-language consensus. Some rules diverge across authors, flagged YELLOW where they do."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/lal-kitab/varshphal":{"post":{"tags":["Vedic"],"summary":"Lal Kitab: Varshphal (annual)","description":"Lal Kitab annual progression at given `age`. Returns the running 35-year-cycle dasha house + approximate solar-return JD for full annual chart casting.","operationId":"vedic_lal-kitab_varshphal","x-quality":"yellow","x-source":"K. Ashant Vol. II varshphal.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Varshphal"},"example":{"date":"1996-12-07","time":"10:34:00","timezoneOffset":5.5,"latitude":13.0389,"longitude":80.2619,"age":29}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/lal-kitab/varshphal \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1996-12-07\", \"time\": \"10:34:00\", \"timezoneOffset\": 5.5, \"latitude\": 13.0389, \"longitude\": 80.2619, \"age\": 29 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/lal-kitab/varshphal', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1996-12-07\",\n    \"time\": \"10:34:00\",\n    \"timezoneOffset\": 5.5,\n    \"latitude\": 13.0389,\n    \"longitude\": 80.2619,\n    \"age\": 29\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/lal-kitab/varshphal',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1996-12-07\",\n      'time': \"10:34:00\",\n      'timezoneOffset': 5.5,\n      'latitude': 13.0389,\n      'longitude': 80.2619,\n      'age': 29\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/lal-kitab/varshphal', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1996-12-07',\n        'time' => '10:34:00',\n        'timezoneOffset' => 5.5,\n        'latitude' => 13.0389,\n        'longitude' => 80.2619,\n        'age' => 29,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"lagna":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true}},"nullable":true},"varshphal":{"type":"object","properties":{"yearNumber":{"type":"number","nullable":true},"approxJd":{"type":"number","nullable":true},"ageYears":{"type":"number","nullable":true}},"nullable":true},"runningDashaHouse":{"type":"object","properties":{"house":{"type":"number","nullable":true},"houseName":{"type":"string","nullable":true},"ruler":{"type":"number","nullable":true},"rulerName":{"type":"string","nullable":true},"ageStart":{"type":"number","nullable":true},"ageEnd":{"type":"number","nullable":true}},"nullable":true},"note":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"lagna":{"sign":9,"signName":"Capricorn"},"varshphal":{"yearNumber":30,"approxJd":2461016.734911111,"ageYears":29},"runningDashaHouse":{"house":9,"houseName":"Capricorn","ruler":6,"rulerName":"Saturn","ageStart":26.25,"ageEnd":29.166666666666664},"note":"Lal Kitab varshphal traditionally uses the solar-return chart cast at the precise solar-return moment. Call /chart with that moment for the full chart. This endpoint returns the LK 35-year-cycle running house at the queried age.","disclaimer":"Lal Kitab is a North-Indian Vedic school based on anonymous Urdu manuscripts (1939-1952). This implementation aggregates the K. Ashant + R.D. Mathur + U.C. Mahajan modern English-language consensus. Some rules diverge across authors, flagged YELLOW where they do."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/lal-kitab/debts":{"post":{"tags":["Vedic"],"summary":"Lal Kitab: Rin (6 ancestral debts)","description":"Detects six ancestral debts (Pitri / Stree / Kanya / Atma / Rishi / Daiva Rin) per Lal Kitab planet-affliction patterns. Each rin returns trigger conditions + recommended remedy. Per K. Ashant Vol. IV + R.D. Mathur consensus.","operationId":"vedic_lal-kitab_debts","x-quality":"yellow","x-source":"K. Ashant Vol. IV + R.D. Mathur. Author divergence flagged.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/lal-kitab/debts \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/lal-kitab/debts', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/lal-kitab/debts',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/lal-kitab/debts', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"lagna":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true}},"nullable":true},"rins":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","nullable":true},"hindiName":{"type":"string","nullable":true},"present":{"type":"boolean","nullable":true},"triggers":{"type":"array","items":{},"nullable":true},"remedy":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"activeCount":{"type":"number","nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"lagna":{"sign":4,"signName":"Leo"},"rins":[{"name":"Pitri Rin","hindiName":"पितृ ऋण","present":false,"triggers":[],"remedy":"Donate wheat, jaggery, or copper on Sundays; serve father / father-figures."}],"activeCount":1,"disclaimer":"Lal Kitab is a North-Indian Vedic school based on anonymous Urdu manuscripts (1939-1952). This implementation aggregates the K. Ashant + R.D. Mathur + U.C. Mahajan modern English-language consensus. Some rules diverge across authors, flagged YELLOW where they do."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/lal-kitab/remedies":{"post":{"tags":["Vedic"],"summary":"Lal Kitab: Remedies (Upayas)","description":"Per-planet Lal Kitab remedies (upayas): the canonical Mathur-tradition remedy + day + donation + mantra. With optional `planet` param, returns single-planet upaya; without, returns all 9.","operationId":"vedic_lal-kitab_remedies","x-quality":"yellow","x-source":"K. Ashant Vol. V remedies + R.D. Mathur upaya manual.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Remedies"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/lal-kitab/remedies \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/lal-kitab/remedies', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/lal-kitab/remedies',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/lal-kitab/remedies', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"remedies":{"type":"array","items":{"type":"object","properties":{"graha":{"type":"string","nullable":true},"grahaName":{"type":"string","nullable":true},"remedy":{"type":"object","properties":{"remedy":{"type":"string","nullable":true},"day":{"type":"string","nullable":true},"donation":{"type":"string","nullable":true},"mantra":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"remedies":[{"graha":"0","grahaName":"Sun","remedy":{"remedy":"Respect father; offer water at sunrise...","day":"Sunday","donation":"Wheat, jaggery, copper","mantra":"Om Suryaya Namah"}}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/lal-kitab/planet-house-effect":{"post":{"tags":["Vedic"],"summary":"Lal Kitab: Planet-in-house effect","description":"Short summary of a (planet, house) placement per LK. Caller passes `planet` (0..6, 11=Rahu, 100=Ketu) and `house` (1..12). Currently Sun-only full data; remaining 8 planets are placeholder text; the full 144-cell reading database is a Phase 3 content task.","operationId":"vedic_lal-kitab_planet-house-effect","x-quality":"yellow","x-source":"K. Ashant Vol. VI planet-house tables (Sun fully ported; rest deferred).","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanetHouseEffect"},"example":{"planet":0,"house":1}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/lal-kitab/planet-house-effect \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"planet\": 0, \"house\": 1 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/lal-kitab/planet-house-effect', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"planet\": 0,\n    \"house\": 1\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/lal-kitab/planet-house-effect',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'planet': 0,\n      'house': 1\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/lal-kitab/planet-house-effect', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'planet' => 0,\n        'house' => 1,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"planet":{"type":"number","nullable":true},"house":{"type":"number","nullable":true},"effect":{"type":"string","nullable":true},"pakkaGhar":{"type":"boolean","nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"planet":0,"house":1,"effect":"Sun in 1: confident, leadership, possible father issues.","pakkaGhar":true,"disclaimer":"..."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/lal-kitab/blind-house":{"post":{"tags":["Vedic"],"summary":"Lal Kitab: Blind houses (Andha bhava)","description":"Houses with no planet AND no Parashari aspect. Per Lal Kitab, blind houses indicate areas where karma is \"unilluminated\" and remedies are essential.","operationId":"vedic_lal-kitab_blind-house","x-quality":"yellow","x-source":"K. Ashant Vol. II.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/lal-kitab/blind-house \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/lal-kitab/blind-house', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/lal-kitab/blind-house',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/lal-kitab/blind-house', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"lagna":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true}},"nullable":true},"blindHouses":{"type":"array","items":{},"nullable":true},"meaning":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"lagna":{"sign":4,"signName":"Leo"},"blindHouses":[],"meaning":"Andha bhava: house with no planet AND no Parashari aspect. Per Lal Kitab, blind houses indicate areas where karma is \"unilluminated\" and remedies are essential.","disclaimer":"Lal Kitab is a North-Indian Vedic school based on anonymous Urdu manuscripts (1939-1952). This implementation aggregates the K. Ashant + R.D. Mathur + U.C. Mahajan modern English-language consensus. Some rules diverge across authors, flagged YELLOW where they do."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/lal-kitab/sleeping-house":{"post":{"tags":["Vedic"],"summary":"Lal Kitab: Sleeping houses","description":"Houses where a planet is in its pakka ghar with no companions/aspects. LK considers such planets dormant; remedies activate them.","operationId":"vedic_lal-kitab_sleeping-house","x-quality":"yellow","x-source":"K. Ashant Vol. II sleeping-planet rules.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/lal-kitab/sleeping-house \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/lal-kitab/sleeping-house', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/lal-kitab/sleeping-house',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/lal-kitab/sleeping-house', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"lagna":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true}},"nullable":true},"sleepingHouses":{"type":"array","items":{},"nullable":true},"meaning":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"lagna":{"sign":4,"signName":"Leo"},"sleepingHouses":[],"meaning":"Sleeping house: planet alone in its pakka ghar (no aspects, no companions). LK considers such planets dormant; remedies activate them.","disclaimer":"Lal Kitab is a North-Indian Vedic school based on anonymous Urdu manuscripts (1939-1952). This implementation aggregates the K. Ashant + R.D. Mathur + U.C. Mahajan modern English-language consensus. Some rules diverge across authors, flagged YELLOW where they do."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/lal-kitab/prosperity":{"post":{"tags":["Vedic"],"summary":"Lal Kitab: Sukh (prosperity yoga)","description":"LK dhana yoga sum: count benefics (Moon/Mercury/Venus/Jupiter) in 2/5/9/11 houses (LK fixed). +2 each. Higher = more prosperity yoga.","operationId":"vedic_lal-kitab_prosperity","x-quality":"yellow","x-source":"K. Ashant Vol. III dhana yoga.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/lal-kitab/prosperity \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/lal-kitab/prosperity', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/lal-kitab/prosperity',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/lal-kitab/prosperity', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"lagna":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true}},"nullable":true},"sukh":{"type":"object","properties":{"score":{"type":"number","nullable":true},"factors":{"type":"array","items":{},"nullable":true}},"nullable":true},"interpretation":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"lagna":{"sign":4,"signName":"Leo"},"sukh":{"score":0,"factors":[]},"interpretation":"No active prosperity yoga","disclaimer":"Lal Kitab is a North-Indian Vedic school based on anonymous Urdu manuscripts (1939-1952). This implementation aggregates the K. Ashant + R.D. Mathur + U.C. Mahajan modern English-language consensus. Some rules diverge across authors, flagged YELLOW where they do."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/lal-kitab/life-graph":{"post":{"tags":["Vedic"],"summary":"Lal Kitab: Life graph (age-by-age)","description":"Year-by-year (age 0..35) Lal Kitab dasha snapshot showing the running house, its ruler, and the ruler's current state in the chart. Use as a rough timing index.","operationId":"vedic_lal-kitab_life-graph","x-quality":"yellow","x-source":"K. Ashant 35y dasha + state lookup.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/lal-kitab/life-graph \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/lal-kitab/life-graph', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/lal-kitab/life-graph',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/lal-kitab/life-graph', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"lagna":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true}},"nullable":true},"lifeGraph":{"type":"array","items":{"type":"object","properties":{"age":{"type":"number","nullable":true},"house":{"type":"number","nullable":true},"ruler":{"type":"number","nullable":true},"rulerName":{"type":"string","nullable":true},"rulerState":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"lagna":{"sign":4,"signName":"Leo"},"lifeGraph":[{"age":0,"house":0,"ruler":4,"rulerName":"Mars","rulerState":"neutral"}],"meaning":"Year-by-year (age 0..35) Lal Kitab dasha snapshot showing the running house, its ruler, and the ruler's current state in the chart. Use as a rough timing index, not predictive.","disclaimer":"Lal Kitab is a North-Indian Vedic school based on anonymous Urdu manuscripts (1939-1952). This implementation aggregates the K. Ashant + R.D. Mathur + U.C. Mahajan modern English-language consensus. Some rules diverge across authors, flagged YELLOW where they do."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/yogas/jaimini/raja":{"post":{"tags":["Vedic"],"summary":"Yogas: Jaimini Raja yoga","description":"Jaimini Raja yoga: Atmakaraka in Lagna/Kendra OR conjunct Amatyakaraka. Sources: Jaimini Sutras 2.x + Sanjay Rath modern commentary.","operationId":"vedic_yogas_jaimini_raja","x-quality":"green","x-source":"Jaimini Sutras 2.x + Sanjay Rath commentary.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/yogas/jaimini/raja \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/yogas/jaimini/raja', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/yogas/jaimini/raja',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/yogas/jaimini/raja', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"yoga":{"type":"string","nullable":true},"school":{"type":"string","nullable":true},"lagnaSign":{"type":"number","nullable":true},"present":{"type":"boolean","nullable":true},"atmakaraka":{"type":"object","properties":{"graha":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"sign":{"type":"number","nullable":true},"house":{"type":"number","nullable":true}},"nullable":true},"amatyakaraka":{"type":"object","properties":{"graha":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"sign":{"type":"number","nullable":true},"house":{"type":"number","nullable":true}},"nullable":true},"details":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"yoga":"Raja","school":"jaimini","lagnaSign":4,"present":true,"atmakaraka":{"graha":4,"name":"Mars","sign":10,"house":7},"amatyakaraka":{"graha":3,"name":"Venus","sign":11,"house":8},"details":"Jaimini Raja yoga active: AK + Amatyakaraka favourable placement."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/yogas/jaimini/dhana":{"post":{"tags":["Vedic"],"summary":"Yogas: Jaimini Dhana yoga","description":"Jaimini Dhana yoga: AK or AmK in 2nd / 11th from lagna. Wealth indicator.","operationId":"vedic_yogas_jaimini_dhana","x-quality":"green","x-source":"Jaimini Sutras 2.x.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/yogas/jaimini/dhana \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/yogas/jaimini/dhana', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/yogas/jaimini/dhana',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/yogas/jaimini/dhana', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"yoga":{"type":"string","nullable":true},"school":{"type":"string","nullable":true},"lagnaSign":{"type":"number","nullable":true},"present":{"type":"boolean","nullable":true},"atmakaraka":{"type":"object","properties":{"graha":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"house":{"type":"number","nullable":true}},"nullable":true},"amatyakaraka":{"type":"object","properties":{"graha":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"house":{"type":"number","nullable":true}},"nullable":true},"details":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"yoga":"Dhana","school":"jaimini","lagnaSign":4,"present":false,"atmakaraka":{"graha":4,"name":"Mars","house":7},"amatyakaraka":{"graha":3,"name":"Venus","house":8},"details":"No AK/AmK presence in 2nd / 11th from lagna."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/yogas/jaimini/daridra":{"post":{"tags":["Vedic"],"summary":"Yogas: Jaimini Daridra yoga","description":"Jaimini Daridra yoga: AK + AmK both in dusthanas (6/8/12), poverty/struggle flag. Remedies recommended.","operationId":"vedic_yogas_jaimini_daridra","x-quality":"green","x-source":"Jaimini Sutras 2.x + Sanjay Rath.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/yogas/jaimini/daridra \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/yogas/jaimini/daridra', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/yogas/jaimini/daridra',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/yogas/jaimini/daridra', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"yoga":{"type":"string","nullable":true},"school":{"type":"string","nullable":true},"lagnaSign":{"type":"number","nullable":true},"present":{"type":"boolean","nullable":true},"atmakaraka":{"type":"object","properties":{"graha":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"house":{"type":"number","nullable":true},"inDusthana":{"type":"boolean","nullable":true}},"nullable":true},"amatyakaraka":{"type":"object","properties":{"graha":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"house":{"type":"number","nullable":true},"inDusthana":{"type":"boolean","nullable":true}},"nullable":true},"details":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"yoga":"Daridra","school":"jaimini","lagnaSign":4,"present":false,"atmakaraka":{"graha":4,"name":"Mars","house":7,"inDusthana":false},"amatyakaraka":{"graha":3,"name":"Venus","house":8,"inDusthana":true},"details":"No daridra configuration."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/yogas/jaimini/viparita":{"post":{"tags":["Vedic"],"summary":"Yogas: Jaimini Viparita Raja yoga","description":"Reverse Raja yoga: AK in 6/8/12, success after struggle. Per Sanjay Rath modern commentary.","operationId":"vedic_yogas_jaimini_viparita","x-quality":"green","x-source":"Sanjay Rath, *Vedic Astrology* (1998).","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/yogas/jaimini/viparita \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/yogas/jaimini/viparita', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/yogas/jaimini/viparita',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/yogas/jaimini/viparita', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"yoga":{"type":"string","nullable":true},"school":{"type":"string","nullable":true},"lagnaSign":{"type":"number","nullable":true},"present":{"type":"boolean","nullable":true},"atmakaraka":{"type":"object","properties":{"graha":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"house":{"type":"number","nullable":true}},"nullable":true},"details":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"yoga":"Viparita Raja","school":"jaimini","lagnaSign":4,"present":false,"atmakaraka":{"graha":4,"name":"Mars","house":7},"details":"AK not in dusthana; standard raja-yoga pathway."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/yogas/jaimini/full":{"post":{"tags":["Vedic"],"summary":"Yogas: Jaimini full summary","description":"Composite Jaimini yoga summary: Raja / Dhana / Daridra / Viparita with karaka details.","operationId":"vedic_yogas_jaimini_full","x-quality":"green","x-source":"Aggregates Jaimini yoga detectors.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/yogas/jaimini/full \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/yogas/jaimini/full', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/yogas/jaimini/full',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/yogas/jaimini/full', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"school":{"type":"string","nullable":true},"lagnaSign":{"type":"number","nullable":true},"atmakaraka":{"type":"object","properties":{"graha":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"sign":{"type":"number","nullable":true},"house":{"type":"number","nullable":true}},"nullable":true},"amatyakaraka":{"type":"object","properties":{"graha":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"sign":{"type":"number","nullable":true},"house":{"type":"number","nullable":true}},"nullable":true},"raja":{"type":"object","properties":{"present":{"type":"boolean","nullable":true}},"nullable":true},"dhana":{"type":"object","properties":{"present":{"type":"boolean","nullable":true}},"nullable":true},"daridra":{"type":"object","properties":{"present":{"type":"boolean","nullable":true}},"nullable":true},"viparita":{"type":"object","properties":{"present":{"type":"boolean","nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"school":"jaimini","lagnaSign":4,"atmakaraka":{"graha":4,"name":"Mars","sign":10,"house":7},"amatyakaraka":{"graha":3,"name":"Venus","sign":11,"house":8},"raja":{"present":true},"dhana":{"present":false},"daridra":{"present":false},"viparita":{"present":false}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/yogas/jaimini/karaka-yoga":{"post":{"tags":["Vedic"],"summary":"Yogas: Jaimini Karaka yoga (all 8 karakas)","description":"Scans every chara karaka (Atmakaraka..Darakaraka) for house-based yogas. Each karaka in kendra/trine/dusthana receives a strength score and manifestation hint (e.g. \"Atmakaraka-in-5: creative/spiritual purpose\"). Returns 8 yogas with karaka role + house + strength 0-100.","operationId":"vedic_yogas_jaimini_karaka-yoga","x-quality":"green","x-source":"Jaimini Sutras 2.x + Sanjay Rath *Karaka Phala* + PyJHora `chara_karakas`.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/yogas/jaimini/karaka-yoga \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/yogas/jaimini/karaka-yoga', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/yogas/jaimini/karaka-yoga',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/yogas/jaimini/karaka-yoga', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"lagna":{"type":"object","properties":{"sign":{"type":"number","nullable":true}},"nullable":true},"atmakaraka":{"type":"object","properties":{"graha":{"type":"number","nullable":true},"grahaName":{"type":"string","nullable":true},"house":{"type":"number","nullable":true}},"nullable":true},"yogas":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","nullable":true},"karaka":{"type":"string","nullable":true},"graha":{"type":"number","nullable":true},"grahaName":{"type":"string","nullable":true},"house":{"type":"number","nullable":true},"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"kendra":{"type":"boolean","nullable":true},"trine":{"type":"boolean","nullable":true},"dusthana":{"type":"boolean","nullable":true},"manifestation":{"type":"string","nullable":true},"strength":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"summary":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"lagna":{"sign":4},"atmakaraka":{"graha":4,"grahaName":"Mars","house":7},"yogas":[{"name":"Atmakaraka-in-7","karaka":"Atmakaraka","graha":4,"grahaName":"Mars","house":7,"sign":10,"signName":"Aquarius","kendra":true,"trine":false,"dusthana":false,"manifestation":"soul finds itself through partnership","strength":75}],"summary":"Atmakaraka Mars in 7H: soul finds itself through partnership."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/yogas/jaimini/karakamsa":{"post":{"tags":["Vedic"],"summary":"Yogas: Karakamsa chart (12-house projection)","description":"Karakamsa = Atmakaraka's sign in D9 Navamsha, treated as lagna for a 12-house projection. Each house carries canonical iṣṭa-devata / moksha / spiritual significations per Sanjay Rath. Yogas surfaced: 5th-house planet = Ishta Devata; 12th-house planet = Moksha Indicator.","operationId":"vedic_yogas_jaimini_karakamsa","x-quality":"green","x-source":"Jaimini Sutras 1.2 + Sanjay Rath *Crux of Vedic Astrology* (Karakamsa chapter).","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/yogas/jaimini/karakamsa \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/yogas/jaimini/karakamsa', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/yogas/jaimini/karakamsa',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/yogas/jaimini/karakamsa', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"lagna":{"type":"object","properties":{"sign":{"type":"number","nullable":true}},"nullable":true},"karakamsa":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"planet":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true}},"nullable":true},"houses":{"type":"array","items":{"type":"object","properties":{"houseNum":{"type":"number","nullable":true},"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"planets":{"type":"array","items":{"type":"object","properties":{"graha":{"type":"number","nullable":true},"grahaName":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"significations":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}},"nullable":true},"nullable":true},"yogas":{"type":"array","items":{},"nullable":true}}}}},"example":{"ok":true,"data":{"lagna":{"sign":4},"karakamsa":{"sign":1,"signName":"Taurus","planet":4,"planetName":"Mars"},"houses":[{"houseNum":1,"sign":1,"signName":"Taurus","planets":[{"graha":4,"grahaName":"Mars"}],"significations":["self"]}],"yogas":[]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/yogas/jaimini/shubha-graha":{"post":{"tags":["Vedic"],"summary":"Yogas: Shubha-graha (functional natures)","description":"Functional benefic / malefic identification per Lagna-lord ownership. Returns each of the 7 visible grahas with natural nature + functional nature (yogakaraka / functional-benefic / neutral / functional-malefic / maraka) + houses owned + reasoning per BPHS Adhyaya 34 kendradhipati & maraka rules.","operationId":"vedic_yogas_jaimini_shubha-graha","x-quality":"green","x-source":"BPHS Adhyaya 34 (Sharma trans.) + K.N. Rao *Predicting through Karakamsa* + Sanjay Rath *Vedic Astrology* (1998).","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/yogas/jaimini/shubha-graha \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/yogas/jaimini/shubha-graha', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/yogas/jaimini/shubha-graha',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/yogas/jaimini/shubha-graha', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"lagna":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true}},"nullable":true},"planets":{"type":"array","items":{"type":"object","properties":{"graha":{"type":"number","nullable":true},"grahaName":{"type":"string","nullable":true},"naturalNature":{"type":"string","nullable":true},"functionalNature":{"type":"string","nullable":true},"housesOwned":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"reasoning":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"yogakarakas":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"marakas":{"type":"array","items":{"type":"number","nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"lagna":{"sign":4,"signName":"Leo"},"planets":[{"graha":0,"grahaName":"Sun","naturalNature":"malefic","functionalNature":"yogakaraka","housesOwned":[1,9],"reasoning":"..."}],"yogakarakas":[0],"marakas":[2]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/doshas/lal-kitab/manglik":{"post":{"tags":["Vedic"],"summary":"Doshas: Lal Kitab Manglik","description":"Manglik dosha per Lal Kitab: Mars in 1/4/7/8/12 with LK-specific cancellation (Mars in Aries/Scorpio/Gemini cancels).","operationId":"vedic_doshas_lal-kitab_manglik","x-quality":"yellow","x-source":"K. Ashant Vol. III + R.D. Mathur Manglik tables.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/doshas/lal-kitab/manglik \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/doshas/lal-kitab/manglik', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/doshas/lal-kitab/manglik',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/doshas/lal-kitab/manglik', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"dosha":{"type":"string","nullable":true},"school":{"type":"string","nullable":true},"lagnaSign":{"type":"number","nullable":true},"present":{"type":"boolean","nullable":true},"mars":{"type":"object","properties":{"sign":{"type":"number","nullable":true},"houseFromLagna":{"type":"number","nullable":true}},"nullable":true},"cancellation":{"nullable":true},"remedy":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"dosha":"Manglik (Lal Kitab)","school":"lal-kitab","lagnaSign":4,"present":true,"mars":{"sign":10,"houseFromLagna":7},"cancellation":null,"remedy":"Donate red lentils + jaggery on Tuesdays; recite Hanuman Chalisa; help younger brothers.","disclaimer":"Lal Kitab is a North-Indian Vedic school based on anonymous Urdu MSS (1939-1952). Disclosures aggregate K. Ashant + R.D. Mathur consensus; modern authors diverge, flagged YELLOW."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/doshas/lal-kitab/kalsarpa":{"post":{"tags":["Vedic"],"summary":"Doshas: Lal Kitab Kalsarpa","description":"Kalsarpa dosha (Rahu-Ketu encirclement) with Lal Kitab remedies.","operationId":"vedic_doshas_lal-kitab_kalsarpa","x-quality":"yellow","x-source":"K. Ashant Vol. IV + R.D. Mathur.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/doshas/lal-kitab/kalsarpa \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/doshas/lal-kitab/kalsarpa', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/doshas/lal-kitab/kalsarpa',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/doshas/lal-kitab/kalsarpa', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"dosha":{"type":"string","nullable":true},"present":{"type":"boolean","nullable":true},"remedy":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"dosha":"Kalsarpa (Lal Kitab)","present":false,"remedy":"..."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/doshas/lal-kitab/pitra":{"post":{"tags":["Vedic"],"summary":"Doshas: Lal Kitab Pitra","description":"Pitri Rin (paternal-debt dosha) per Lal Kitab patterns. Triggers + remedy.","operationId":"vedic_doshas_lal-kitab_pitra","x-quality":"yellow","x-source":"K. Ashant Vol. IV Rin patterns.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/doshas/lal-kitab/pitra \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/doshas/lal-kitab/pitra', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/doshas/lal-kitab/pitra',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/doshas/lal-kitab/pitra', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"dosha":{"type":"string","nullable":true},"school":{"type":"string","nullable":true},"lagnaSign":{"type":"number","nullable":true},"present":{"type":"boolean","nullable":true},"triggers":{"type":"array","items":{},"nullable":true},"remedy":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"dosha":"Pitra (Lal Kitab)","school":"lal-kitab","lagnaSign":4,"present":false,"triggers":[],"remedy":"Donate wheat, jaggery, or copper on Sundays; serve father / father-figures.","disclaimer":"Lal Kitab is a North-Indian Vedic school based on anonymous Urdu MSS (1939-1952). Disclosures aggregate K. Ashant + R.D. Mathur consensus; modern authors diverge, flagged YELLOW."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/doshas/lal-kitab/shrapit":{"post":{"tags":["Vedic"],"summary":"Doshas: Lal Kitab Shrapit","description":"Shrapit dosha (ancestral curse) per LK: Saturn conjunct Rahu/Ketu. Specific remedies provided.","operationId":"vedic_doshas_lal-kitab_shrapit","x-quality":"yellow","x-source":"R.D. Mathur shrapit chapter.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/doshas/lal-kitab/shrapit \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/doshas/lal-kitab/shrapit', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/doshas/lal-kitab/shrapit',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/doshas/lal-kitab/shrapit', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"dosha":{"type":"string","nullable":true},"present":{"type":"boolean","nullable":true},"details":{"type":"string","nullable":true},"remedy":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"dosha":"Shrapit (Lal Kitab)","present":true,"details":"...","remedy":"..."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/doshas/lal-kitab/rin":{"post":{"tags":["Vedic"],"summary":"Doshas: Lal Kitab Rin (6 ancestral debts)","description":"Aggregate of all 6 Rin (Pitri/Stree/Kanya/Atma/Rishi/Daiva) with active count. Same engine as /lal-kitab/debts but framed as dosha.","operationId":"vedic_doshas_lal-kitab_rin","x-quality":"yellow","x-source":"K. Ashant Vol. IV + R.D. Mathur.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/doshas/lal-kitab/rin \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/doshas/lal-kitab/rin', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/doshas/lal-kitab/rin',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/doshas/lal-kitab/rin', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"dosha":{"type":"string","nullable":true},"school":{"type":"string","nullable":true},"lagnaSign":{"type":"number","nullable":true},"rins":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","nullable":true},"hindiName":{"type":"string","nullable":true},"present":{"type":"boolean","nullable":true},"triggers":{"type":"array","items":{},"nullable":true},"remedy":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"activeCount":{"type":"number","nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"dosha":"Rin (6 ancestral debts, Lal Kitab)","school":"lal-kitab","lagnaSign":4,"rins":[{"name":"Pitri Rin","hindiName":"पितृ ऋण","present":false,"triggers":[],"remedy":"Donate wheat, jaggery, or copper on Sundays; serve father / father-figures."}],"activeCount":1,"disclaimer":"Lal Kitab is a North-Indian Vedic school based on anonymous Urdu MSS (1939-1952). Disclosures aggregate K. Ashant + R.D. Mathur consensus; modern authors diverge, flagged YELLOW."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/doshas/lal-kitab/full":{"post":{"tags":["Vedic"],"summary":"Doshas: Lal Kitab full summary","description":"Composite Lal Kitab dosha summary: manglik + kalsarpa + pitra + shrapit + 6 Rin + kismat score.","operationId":"vedic_doshas_lal-kitab_full","x-quality":"yellow","x-source":"Aggregates Lal Kitab dosha detectors.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/doshas/lal-kitab/full \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/doshas/lal-kitab/full', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/doshas/lal-kitab/full',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/doshas/lal-kitab/full', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"school":{"type":"string","nullable":true},"lagnaSign":{"type":"number","nullable":true},"manglik":{"type":"object","properties":{"present":{"type":"boolean","nullable":true}},"nullable":true},"kalsarpa":{"type":"object","properties":{"present":{"type":"boolean","nullable":true},"subType":{"nullable":true},"partial":{"type":"boolean","nullable":true},"severity":{"type":"string","nullable":true},"affectedHouses":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"contributingPlanets":{"type":"array","items":{},"nullable":true},"details":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}},"nullable":true},"pitra":{"type":"object","properties":{"name":{"type":"string","nullable":true},"hindiName":{"type":"string","nullable":true},"present":{"type":"boolean","nullable":true},"triggers":{"type":"array","items":{},"nullable":true},"remedy":{"type":"string","nullable":true}},"nullable":true},"shrapit":{"type":"object","properties":{"present":{"type":"boolean","nullable":true}},"nullable":true},"rins":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","nullable":true},"hindiName":{"type":"string","nullable":true},"present":{"type":"boolean","nullable":true},"triggers":{"type":"array","items":{},"nullable":true},"remedy":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"kismat":{"type":"object","properties":{"score":{"type":"number","nullable":true},"factors":{"type":"array","items":{"type":"object","properties":{"graha":{"type":"number","nullable":true},"grahaName":{"type":"string","nullable":true},"bonus":{"type":"number","nullable":true},"reason":{"type":"string","nullable":true}},"nullable":true},"nullable":true}},"nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"school":"lal-kitab","lagnaSign":4,"manglik":{"present":true},"kalsarpa":{"present":false,"subType":null,"partial":false,"severity":"none","affectedHouses":[6],"contributingPlanets":[],"details":["5 grahas on Rahu-side, 2 on Ketu-side: Kaal Sarp not formed"]},"pitra":{"name":"Pitri Rin","hindiName":"पितृ ऋण","present":false,"triggers":[],"remedy":"Donate wheat, jaggery, or copper on Sundays; serve father / father-figures."},"shrapit":{"present":true},"rins":[{"name":"Pitri Rin","hindiName":"पितृ ऋण","present":false,"triggers":[],"remedy":"Donate wheat, jaggery, or copper on Sundays; serve father / father-figures."}],"kismat":{"score":5,"factors":[{"graha":3,"grahaName":"Venus","bonus":2,"reason":"exalted (+2)"}]},"disclaimer":"Lal Kitab is a North-Indian Vedic school based on anonymous Urdu MSS (1939-1952). Disclosures aggregate K. Ashant + R.D. Mathur consensus; modern authors diverge, flagged YELLOW."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/doshas/kp/manglik":{"post":{"tags":["Vedic"],"summary":"Doshas: KP Manglik","description":"Manglik dosha with KP sub-lord precision attached. Sub-lord chain of Mars added for transit-trigger analysis.","operationId":"vedic_doshas_kp_manglik","x-quality":"green","x-source":"BPHS Manglik rules + K.S. Krishnamurti sub-lord overlay.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/doshas/kp/manglik \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/doshas/kp/manglik', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/doshas/kp/manglik',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/doshas/kp/manglik', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"dosha":{"type":"string","nullable":true},"school":{"type":"string","nullable":true},"lagnaSign":{"type":"number","nullable":true},"present":{"type":"boolean","nullable":true},"severity":{"type":"string","nullable":true},"affectedHouses":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"contributingPlanets":{"type":"array","items":{"type":"object","properties":{"graha":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"sign":{"type":"number","nullable":true},"house":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"details":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"kpSubLord":{"type":"object","properties":{"sign":{"type":"string","nullable":true},"star":{"type":"string","nullable":true},"sub":{"type":"string","nullable":true},"subSub":{"type":"string","nullable":true}},"nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"dosha":"Manglik (KP)","school":"kp","lagnaSign":4,"present":true,"severity":"strong","affectedHouses":[7],"contributingPlanets":[{"graha":4,"planetName":"Mars","sign":10,"house":7}],"details":["School: south (houses checked: 1,2,4,7,8,12 from Lagna+Moon+Venus)"],"kpSubLord":{"sign":"Aquarius","star":"Purva Bhadrapada","sub":"Mercury","subSub":"Sun"},"disclaimer":"KP dosha variants apply K.S. Krishnamurti sub-lord precision to classical dosha detection. Sub-lord positions add transit-trigger granularity."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/doshas/kp/kalasarpa":{"post":{"tags":["Vedic"],"summary":"Doshas: KP Kalasarpa","description":"Kalasarpa dosha with KP Rahu sub-lord chain attached.","operationId":"vedic_doshas_kp_kalasarpa","x-quality":"green","x-source":"BPHS Kalasarpa + KP overlay.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/doshas/kp/kalasarpa \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/doshas/kp/kalasarpa', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/doshas/kp/kalasarpa',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/doshas/kp/kalasarpa', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"dosha":{"type":"string","nullable":true},"school":{"type":"string","nullable":true},"lagnaSign":{"type":"number","nullable":true},"present":{"type":"boolean","nullable":true},"subType":{"nullable":true},"partial":{"type":"boolean","nullable":true},"severity":{"type":"string","nullable":true},"affectedHouses":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"contributingPlanets":{"type":"array","items":{},"nullable":true},"details":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"kpRahuChain":{"type":"object","properties":{"sign":{"type":"string","nullable":true},"star":{"type":"string","nullable":true},"sub":{"type":"string","nullable":true}},"nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"dosha":"Kalasarpa (KP)","school":"kp","lagnaSign":4,"present":false,"subType":null,"partial":false,"severity":"none","affectedHouses":[6],"contributingPlanets":[],"details":["5 grahas on Rahu-side, 2 on Ketu-side: Kaal Sarp not formed"],"kpRahuChain":{"sign":"Capricorn","star":"Shravana","sub":"Saturn"},"disclaimer":"KP dosha variants apply K.S. Krishnamurti sub-lord precision to classical dosha detection. Sub-lord positions add transit-trigger granularity."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/doshas/kp/pitra":{"post":{"tags":["Vedic"],"summary":"Doshas: KP Pitra","description":"Pitra dosha (Sun affliction) with KP Sun sub-lord chain.","operationId":"vedic_doshas_kp_pitra","x-quality":"green","x-source":"BPHS Pitra + KP overlay.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/doshas/kp/pitra \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/doshas/kp/pitra', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/doshas/kp/pitra',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/doshas/kp/pitra', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"dosha":{"type":"string","nullable":true},"school":{"type":"string","nullable":true},"lagnaSign":{"type":"number","nullable":true},"present":{"type":"boolean","nullable":true},"severity":{"type":"string","nullable":true},"affectedHouses":{"type":"array","items":{},"nullable":true},"contributingPlanets":{"type":"array","items":{},"nullable":true},"details":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"kpSunChain":{"type":"object","properties":{"sign":{"type":"string","nullable":true},"star":{"type":"string","nullable":true},"sub":{"type":"string","nullable":true}},"nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"dosha":"Pitra (KP)","school":"kp","lagnaSign":4,"present":false,"severity":"none","affectedHouses":[],"contributingPlanets":[],"details":["No Sun+Rahu/Saturn conjunction: Pitru Dosha not formed"],"kpSunChain":{"sign":"Taurus","star":"Krittika","sub":"Rahu"},"disclaimer":"KP dosha variants apply K.S. Krishnamurti sub-lord precision to classical dosha detection. Sub-lord positions add transit-trigger granularity."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/doshas/kp/sade-sati":{"post":{"tags":["Vedic"],"summary":"Doshas: KP Sade Sati","description":"Sade Sati state at `targetDate`: Saturn transit through 12th/1st/2nd from natal Moon (7.5y total). Returns the active phase with KP Saturn sub-lord chain.","operationId":"vedic_doshas_kp_sade-sati","x-quality":"green","x-source":"BPHS Sade Sati transit rule + KP overlay.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SadeSati"},"example":{"date":"1996-12-07","time":"10:34:00","timezoneOffset":5.5,"latitude":13.0389,"longitude":80.2619,"targetDate":"2026-05-07"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/doshas/kp/sade-sati \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1996-12-07\", \"time\": \"10:34:00\", \"timezoneOffset\": 5.5, \"latitude\": 13.0389, \"longitude\": 80.2619, \"targetDate\": \"2026-05-07\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/doshas/kp/sade-sati', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1996-12-07\",\n    \"time\": \"10:34:00\",\n    \"timezoneOffset\": 5.5,\n    \"latitude\": 13.0389,\n    \"longitude\": 80.2619,\n    \"targetDate\": \"2026-05-07\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/doshas/kp/sade-sati',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1996-12-07\",\n      'time': \"10:34:00\",\n      'timezoneOffset': 5.5,\n      'latitude': 13.0389,\n      'longitude': 80.2619,\n      'targetDate': \"2026-05-07\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/doshas/kp/sade-sati', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1996-12-07',\n        'time' => '10:34:00',\n        'timezoneOffset' => 5.5,\n        'latitude' => 13.0389,\n        'longitude' => 80.2619,\n        'targetDate' => '2026-05-07',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"dosha":{"type":"string","nullable":true},"school":{"type":"string","nullable":true},"lagnaSign":{"type":"number","nullable":true},"present":{"type":"boolean","nullable":true},"phase":{"nullable":true},"moonSign":{"type":"number","nullable":true},"transitSaturnSign":{"type":"number","nullable":true},"transitDate":{"type":"string","nullable":true},"kpSaturnChain":{"type":"object","properties":{"longitude":{"type":"number","nullable":true},"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"signLord":{"type":"number","nullable":true},"signLordName":{"type":"string","nullable":true},"star":{"type":"number","nullable":true},"starName":{"type":"string","nullable":true},"starLord":{"type":"number","nullable":true},"starLordName":{"type":"string","nullable":true},"sub":{"type":"number","nullable":true},"subName":{"type":"string","nullable":true},"subSub":{"type":"number","nullable":true},"subSubName":{"type":"string","nullable":true},"positionInSign":{"type":"number","nullable":true},"positionInStar":{"type":"number","nullable":true}},"nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"dosha":"Sade Sati (KP)","school":"kp","lagnaSign":9,"present":false,"phase":null,"moonSign":6,"transitSaturnSign":11,"transitDate":"2026-05-07","kpSaturnChain":{"longitude":345.6380439085194,"sign":11,"signName":"Pisces","signLord":5,"signLordName":"Jupiter","star":26,"starName":"Uttara Bhadrapada","starLord":6,"starLordName":"Saturn","sub":5,"subName":"Jupiter","subSub":2,"subSubName":"Mercury","positionInSign":15.638043908519421,"positionInStar":12.30471057518605},"disclaimer":"KP dosha variants apply K.S. Krishnamurti sub-lord precision to classical dosha detection. Sub-lord positions add transit-trigger granularity."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/doshas/kp/kemadruma":{"post":{"tags":["Vedic"],"summary":"Doshas: KP Kemadruma","description":"Kemadruma yoga: no planet (excl. Sun, Rahu, Ketu) in 2nd or 12th from Moon. Moon-isolation flag, emotional/financial volatility indicator. KP Moon sub-lord chain attached.","operationId":"vedic_doshas_kp_kemadruma","x-quality":"green","x-source":"BPHS Kemadruma + KP overlay.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/doshas/kp/kemadruma \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/doshas/kp/kemadruma', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/doshas/kp/kemadruma',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/doshas/kp/kemadruma', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"dosha":{"type":"string","nullable":true},"school":{"type":"string","nullable":true},"lagnaSign":{"type":"number","nullable":true},"present":{"type":"boolean","nullable":true},"moonSign":{"type":"number","nullable":true},"details":{"type":"string","nullable":true},"kpMoonChain":{"type":"object","properties":{"longitude":{"type":"number","nullable":true},"sign":{"type":"number","nullable":true},"signName":{"type":"string","nullable":true},"signLord":{"type":"number","nullable":true},"signLordName":{"type":"string","nullable":true},"star":{"type":"number","nullable":true},"starName":{"type":"string","nullable":true},"starLord":{"type":"number","nullable":true},"starLordName":{"type":"string","nullable":true},"sub":{"type":"number","nullable":true},"subName":{"type":"string","nullable":true},"subSub":{"type":"number","nullable":true},"subSubName":{"type":"string","nullable":true},"positionInSign":{"type":"number","nullable":true},"positionInStar":{"type":"number","nullable":true}},"nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"dosha":"Kemadruma (KP)","school":"kp","lagnaSign":4,"present":false,"moonSign":9,"details":"Moon has companion in 2nd / 12th: no Kemadruma.","kpMoonChain":{"longitude":273.1788798971629,"sign":9,"signName":"Capricorn","signLord":6,"signLordName":"Saturn","star":21,"starName":"Uttara Ashadha","starLord":0,"starLordName":"Sun","sub":6,"subName":"Saturn","subSub":6,"subSubName":"Saturn","positionInSign":3.178879897162915,"positionInStar":6.512213230496229},"disclaimer":"KP dosha variants apply K.S. Krishnamurti sub-lord precision to classical dosha detection. Sub-lord positions add transit-trigger granularity."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/vedic/doshas/kp/full":{"post":{"tags":["Vedic"],"summary":"Doshas: KP full summary","description":"Composite KP dosha summary: manglik + kalasarpa + pitra + kemadruma + Sade-Sati pointer. (Sade Sati requires an explicit targetDate; call /sade-sati separately.)","operationId":"vedic_doshas_kp_full","x-quality":"green","x-source":"Aggregates KP dosha detectors.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/vedic/doshas/kp/full \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/vedic/doshas/kp/full', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/vedic/doshas/kp/full',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('vedic/doshas/kp/full', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"school":{"type":"string","nullable":true},"lagnaSign":{"type":"number","nullable":true},"manglik":{"type":"object","properties":{"present":{"type":"boolean","nullable":true},"severity":{"type":"string","nullable":true},"affectedHouses":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"contributingPlanets":{"type":"array","items":{"type":"object","properties":{"graha":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"sign":{"type":"number","nullable":true},"house":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"details":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}},"nullable":true},"kalasarpa":{"type":"object","properties":{"present":{"type":"boolean","nullable":true},"subType":{"nullable":true},"partial":{"type":"boolean","nullable":true},"severity":{"type":"string","nullable":true},"affectedHouses":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"contributingPlanets":{"type":"array","items":{},"nullable":true},"details":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}},"nullable":true},"pitra":{"type":"object","properties":{"present":{"type":"boolean","nullable":true},"severity":{"type":"string","nullable":true},"affectedHouses":{"type":"array","items":{},"nullable":true},"contributingPlanets":{"type":"array","items":{},"nullable":true},"details":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}},"nullable":true},"kemadruma":{"type":"object","properties":{"present":{"type":"boolean","nullable":true},"moonSign":{"type":"number","nullable":true}},"nullable":true},"sadeSatiNote":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"school":"kp","lagnaSign":4,"manglik":{"present":true,"severity":"strong","affectedHouses":[7],"contributingPlanets":[{"graha":4,"planetName":"Mars","sign":10,"house":7}],"details":["School: south (houses checked: 1,2,4,7,8,12 from Lagna+Moon+Venus)"]},"kalasarpa":{"present":false,"subType":null,"partial":false,"severity":"none","affectedHouses":[6],"contributingPlanets":[],"details":["5 grahas on Rahu-side, 2 on Ketu-side: Kaal Sarp not formed"]},"pitra":{"present":false,"severity":"none","affectedHouses":[],"contributingPlanets":[],"details":["No Sun+Rahu/Saturn conjunction: Pitru Dosha not formed"]},"kemadruma":{"present":false,"moonSign":9},"sadeSatiNote":"Use /vedic/doshas/kp/sade-sati endpoint with targetDate for transit-specific Sade Sati state.","disclaimer":"KP dosha variants apply K.S. Krishnamurti sub-lord precision to classical dosha detection. Sub-lord positions add transit-trigger granularity."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/kabbalah/gematria":{"post":{"tags":["Kabbalah"],"summary":"Gematria ciphers","description":"Seven standard ciphers over a Hebrew text: absolute, large, small, ordinal, inclusive, AtBash and AlBam. Vowel points and cantillation are stripped; a final letter counts as its ordinary form in the absolute value and as 500-900 in the large one, and both are returned rather than one being chosen.","operationId":"kabbalah_gematria","x-quality":"green","x-source":"Gematria is arithmetic over the standard letter table and is pinned against the values the tradition quotes (chai 18, YHWH 26, emet 441, shalom 376). The seventy-two names are DERIVED from Exodus 14:19-21, seventy-two consonants each, read boustrophedon per Rashi and Sefer HaBahir, and the derivation reproduces 71 of the 72 commonly published names; the one divergence is an error in the received list. The sephirot table is the Hermetic Qabalah (Golden Dawn) attribution and is marked as editorial in the response.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/KabbalahGematria"},"example":{"text":"שלום"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/kabbalah/gematria \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"text\": \"שלום\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/kabbalah/gematria', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"text\": \"שלום\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/kabbalah/gematria',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'text': \"שלום\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('kabbalah/gematria', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'text' => 'שלום',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"input":{"type":"string","nullable":true},"consonants":{"type":"string","nullable":true},"letterCount":{"type":"number","nullable":true},"ciphers":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","nullable":true},"hebrew":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"value":{"type":"number","nullable":true},"note":{"type":"string","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"input":"שלום","consonants":"שלום","letterCount":4,"ciphers":[{"id":"hechrachi","hebrew":"מספר הכרחי","name":"Absolute","value":376,"note":"..."},{"id":"gadol","name":"Large","value":936},{"id":"atbash","name":"AtBash","value":216,"mapped":"בכפי"}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/kabbalah/shem-names":{"get":{"tags":["Kabbalah"],"summary":"The seventy-two names (Shem HaMephorash)","description":"The 72 three-letter names, computed from Exodus 14:19-21 rather than read from a table, each with its five degrees of the zodiac. Filter with ?index=1..72 or ?longitude=0..360.","operationId":"kabbalah_shem-names_get","x-quality":"green","x-source":"Gematria is arithmetic over the standard letter table and is pinned against the values the tradition quotes (chai 18, YHWH 26, emet 441, shalom 376). The seventy-two names are DERIVED from Exodus 14:19-21, seventy-two consonants each, read boustrophedon per Rashi and Sefer HaBahir, and the derivation reproduces 71 of the 72 commonly published names; the one divergence is an error in the received list. The sephirot table is the Hermetic Qabalah (Golden Dawn) attribution and is marked as editorial in the response.","security":[{"ApiKeyAuth":[]}],"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X GET https://api.astroway.info/v1/kabbalah/shem-names \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/kabbalah/shem-names', {\n  method: 'GET',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.get(\n    'https://api.astroway.info/v1/kabbalah/shem-names',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->get('kabbalah/shem-names', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"names":{"type":"array","items":{"type":"object","properties":{"index":{"type":"number","nullable":true},"letters":{"type":"string","nullable":true},"normalised":{"type":"string","nullable":true},"zodiac":{"type":"object","properties":{"sign":{"type":"string","nullable":true},"startDegree":{"type":"number","nullable":true},"endDegree":{"type":"number","nullable":true}},"nullable":true}},"nullable":true},"nullable":true},"count":{"type":"number","nullable":true},"derivation":{"type":"string","nullable":true},"absent":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"names":[{"index":1,"letters":"והו","normalised":"והו","zodiac":{"sign":"Aries","startDegree":0,"endDegree":5}}],"count":72,"derivation":"Exodus 14:19-21, 72 consonants each, read boustrophedon...","absent":"Latin transliterations, the el/yah suffix per name and any birth-angel attribution are not included..."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/kabbalah/sephiroth":{"get":{"tags":["Kabbalah"],"summary":"The ten sephirot","description":"The Tree of Life as a reference table: Hebrew, meaning, pillar, triad and the Golden Dawn planetary attribution, grouped by pillar. Nothing here is computed, and the response says so.","operationId":"kabbalah_sephiroth_get","x-quality":"yellow","x-source":"Gematria is arithmetic over the standard letter table and is pinned against the values the tradition quotes (chai 18, YHWH 26, emet 441, shalom 376). The seventy-two names are DERIVED from Exodus 14:19-21, seventy-two consonants each, read boustrophedon per Rashi and Sefer HaBahir, and the derivation reproduces 71 of the 72 commonly published names; the one divergence is an error in the received list. The sephirot table is the Hermetic Qabalah (Golden Dawn) attribution and is marked as editorial in the response.","security":[{"ApiKeyAuth":[]}],"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X GET https://api.astroway.info/v1/kabbalah/sephiroth \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/kabbalah/sephiroth', {\n  method: 'GET',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.get(\n    'https://api.astroway.info/v1/kabbalah/sephiroth',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->get('kabbalah/sephiroth', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"sephiroth":{"type":"array","items":{"type":"object","properties":{"number":{"type":"number","nullable":true},"hebrew":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"meaning":{"type":"string","nullable":true},"pillar":{"type":"string","nullable":true},"attribution":{"type":"string","nullable":true},"triad":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"count":{"type":"number","nullable":true},"pillars":{"type":"object","properties":{"Middle":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}},"nullable":true},"attributionSet":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"sephiroth":[{"number":6,"hebrew":"תפארת","name":"Tiphareth","meaning":"Beauty","pillar":"Middle","attribution":"Sun","triad":"Ethical"}],"count":10,"pillars":{"Middle":["Kether","Tiphareth","Yesod","Malkuth"]},"attributionSet":"Hermetic Qabalah (Golden Dawn)"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/iching":{"post":{"tags":["Esoteric"],"summary":"I Ching Hexagram (DEPRECATED: use /iching/throw-coins)","description":"DEPRECATED: legacy un-namespaced random hexagram cast. Superseded by the /iching/* namespace: `/iching/throw-coins` (seeded + reproducible), `/iching/by-question`, `/iching/with-changing-lines`, `/iching/daily`, `/iching/lookup/{n}`, all on the Wilhelm-Baynes hexagram set. Still works until its 2027-06-16 sunset, then removed. Casts a single I Ching hexagram (input ignored).","operationId":"iching","x-quality":"yellow","x-source":"I Ching (Book of Changes): public-domain ancient Chinese text; Wilhelm-Baynes 1923/1950 (Princeton) hexagram names via the /iching/* standalone group. Sunset 2027-06-16 (auto-410 via middleware/sunset.ts).","deprecated":true,"security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmptyBody"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/iching \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/iching', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/iching',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('iching', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"chinese":{"type":"string","nullable":true},"trigrams":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"lines":{"type":"array","items":{"type":"object","properties":{"value":{"type":"number","nullable":true},"isYang":{"type":"boolean","nullable":true},"isChanging":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"number":5,"name":"Waiting","chinese":"䷄","trigrams":[0],"lines":[{"value":7,"isYang":true,"isChanging":false}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/djamaspa":{"post":{"tags":["Esoteric"],"summary":"Djamaspa (DEPRECATED: RED quality, sunset 2027-06-15)","description":"DEPRECATED: RED quality (oral Zoroastrian tradition, scattered manuscripts, no canonical reference). Still works until its 2027-06-15 sunset (12-month, per the /v1 stability policy), then will be removed. Migrate to broader /reference endpoints or remove the dependency. Calculate Djamaspa planetary positions for date.","operationId":"djamaspa","x-quality":"red","x-source":"Persian astrology technique attributed to Jamasp (Zoroastrian sage). No canonical text widely available, no OSS impl, no reference API for cross-check. Sunset 2027-06-15 (auto-410 via middleware/sunset.ts); see roadmap §13.2.","deprecated":true,"security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Djamaspa"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/djamaspa \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/djamaspa', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/djamaspa',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('djamaspa', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"year":{"type":"object","properties":{"animal":{"type":"object","properties":{"id":{"type":"number","nullable":true},"ru":{"type":"string","nullable":true},"uk":{"type":"string","nullable":true},"en":{"type":"string","nullable":true},"symbol":{"type":"string","nullable":true}},"nullable":true},"number":{"type":"number","nullable":true}},"nullable":true},"month":{"type":"object","properties":{"animal":{"type":"object","properties":{"id":{"type":"number","nullable":true},"ru":{"type":"string","nullable":true},"uk":{"type":"string","nullable":true},"en":{"type":"string","nullable":true},"symbol":{"type":"string","nullable":true}},"nullable":true},"number":{"type":"number","nullable":true}},"nullable":true},"day":{"type":"object","properties":{"animal":{"type":"object","properties":{"id":{"type":"number","nullable":true},"ru":{"type":"string","nullable":true},"uk":{"type":"string","nullable":true},"en":{"type":"string","nullable":true},"symbol":{"type":"string","nullable":true}},"nullable":true},"number":{"type":"number","nullable":true}},"nullable":true},"hour":{"type":"object","properties":{"animal":{"type":"object","properties":{"id":{"type":"number","nullable":true},"ru":{"type":"string","nullable":true},"uk":{"type":"string","nullable":true},"en":{"type":"string","nullable":true},"symbol":{"type":"string","nullable":true}},"nullable":true},"number":{"type":"number","nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"year":{"animal":{"id":21,"ru":"Гепард","uk":"Гепард","en":"Cheetah","symbol":"🐆"},"number":21},"month":{"animal":{"id":18,"ru":"Лань","uk":"Лань","en":"Doe","symbol":"🦌"},"number":18},"day":{"animal":{"id":16,"ru":"Верблюд","uk":"Верблюд","en":"Camel","symbol":"🐫"},"number":16},"hour":{"animal":{"id":1,"ru":"Олень","uk":"Олень","en":"Deer","symbol":"🦌"},"number":1}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/horoscope/daily":{"post":{"tags":["Horoscope"],"summary":"Daily Horoscope","description":"Daily horoscope for a zodiac sign in 21 languages, written by a model from that sign's solar houses and the day's transits. `style: \"plain\"` gives everyday words with no astrological terms, written once in English and translated so every language says the same; `length` (short, medium) and `topics` choose its size and sections. Returns `sections` (overview, love, career, health, finance, advice) and the same text as `horoscope`, plus computed `transits` with solar houses, `aspects`, `events`, `energy` (1-10 with its factors), `lucky` and `compatibleSigns`.","operationId":"horoscope_daily","x-quality":"green","x-source":"Daily/monthly horoscope generation via natal-transit composite + sign-based archetype. AI-augmented narrative via chatCompletion gateway (multi-provider chain).","security":[{"ApiKeyAuth":[]}],"parameters":[{"in":"header","name":"Accept-Language","required":false,"schema":{"type":"string","enum":["uk","en","de","ru","pl","es","pt","fr","it","nl","cs","ro","hu","el","tr","ar","hi","ja","ko","vi","id"]},"description":"Target language for response text fields. RFC 7231 q-weighted. Falls back to ?lang= query param, then body.language, then source uk. Unknown codes silently fall through to uk.","example":"de"},{"in":"query","name":"lang","required":false,"schema":{"type":"string","enum":["uk","en","de","ru","pl","es","pt","fr","it","nl","cs","ro","hu","el","tr","ar","hi","ja","ko","vi","id"]},"description":"Alternative to Accept-Language for clients without header control.","example":"hi"},{"in":"header","name":"X-Provider","required":false,"schema":{"type":"string","enum":["openai","anthropic","google","groq","mistral","openrouter","deepseek","together"]},"description":"Bring your own model key: the LLM provider that should run this completion. Send together with X-Provider-Key or the request is refused: a key with no provider bills us for tokens you meant to pay for, and a provider with no key would look like it worked. The endpoint is fixed per provider on our side and is never taken from the request. There is no fallback to our own chain: if your key fails you get the provider's status and message.","example":"anthropic"},{"in":"header","name":"X-Provider-Key","required":false,"schema":{"type":"string"},"description":"Your own credential for X-Provider. Never logged, stored or cached: it travels in a header because the request body is hashed into two cache keys, and a BYOK turn bypasses both caches in each direction. A provider error that quotes the key back is redacted before it reaches our logs or your response. Such a turn costs 5 credits instead of the endpoint price, and only when a completion actually ran on your key.","example":"sk-ant-..."},{"in":"header","name":"X-Provider-Model","required":false,"schema":{"type":"string","maxLength":120},"description":"Optional model id, overriding the default for that provider. Defaults: openai → gpt-4o-mini, anthropic → claude-sonnet-4-5, google → gemini-2.5-flash, groq → openai/gpt-oss-120b, mistral → mistral-large-latest, openrouter → meta-llama/llama-3.3-70b-instruct, deepseek → deepseek-chat, together → meta-llama/Llama-3.3-70B-Instruct-Turbo.","example":"claude-sonnet-4-5"},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignHoroscope"},"example":{"sign":"aries","date":"2026-05-04","language":"uk"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/horoscope/daily \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"sign\": \"aries\", \"date\": \"2026-05-04\", \"language\": \"uk\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/horoscope/daily', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"sign\": \"aries\",\n    \"date\": \"2026-05-04\",\n    \"language\": \"uk\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/horoscope/daily',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'sign': \"aries\",\n      'date': \"2026-05-04\",\n      'language': \"uk\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('horoscope/daily', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'sign' => 'aries',\n        'date' => '2026-05-04',\n        'language' => 'uk',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"horoscope":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true},"model":{"type":"string","nullable":true},"language":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"horoscope":"Сьогодні ваша енергія візьме гору…","disclaimer":"AI-generated interpretation for guidance only.","model":"openai/gpt-oss-120b","language":"uk"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}}}},"/horoscope/weekly":{"post":{"tags":["Horoscope"],"summary":"Weekly Horoscope","description":"Weekly horoscope for a zodiac sign: the same shape as the daily one, with the week's ingresses, stations and lunar phases in `events` and in the text.","operationId":"horoscope_weekly","x-quality":"green","x-source":"Daily/monthly horoscope generation via natal-transit composite + sign-based archetype. AI-augmented narrative via chatCompletion gateway (multi-provider chain).","security":[{"ApiKeyAuth":[]}],"parameters":[{"in":"header","name":"Accept-Language","required":false,"schema":{"type":"string","enum":["uk","en","de","ru","pl","es","pt","fr","it","nl","cs","ro","hu","el","tr","ar","hi","ja","ko","vi","id"]},"description":"Target language for response text fields. RFC 7231 q-weighted. Falls back to ?lang= query param, then body.language, then source uk. Unknown codes silently fall through to uk.","example":"de"},{"in":"query","name":"lang","required":false,"schema":{"type":"string","enum":["uk","en","de","ru","pl","es","pt","fr","it","nl","cs","ro","hu","el","tr","ar","hi","ja","ko","vi","id"]},"description":"Alternative to Accept-Language for clients without header control.","example":"hi"},{"in":"header","name":"X-Provider","required":false,"schema":{"type":"string","enum":["openai","anthropic","google","groq","mistral","openrouter","deepseek","together"]},"description":"Bring your own model key: the LLM provider that should run this completion. Send together with X-Provider-Key or the request is refused: a key with no provider bills us for tokens you meant to pay for, and a provider with no key would look like it worked. The endpoint is fixed per provider on our side and is never taken from the request. There is no fallback to our own chain: if your key fails you get the provider's status and message.","example":"anthropic"},{"in":"header","name":"X-Provider-Key","required":false,"schema":{"type":"string"},"description":"Your own credential for X-Provider. Never logged, stored or cached: it travels in a header because the request body is hashed into two cache keys, and a BYOK turn bypasses both caches in each direction. A provider error that quotes the key back is redacted before it reaches our logs or your response. Such a turn costs 5 credits instead of the endpoint price, and only when a completion actually ran on your key.","example":"sk-ant-..."},{"in":"header","name":"X-Provider-Model","required":false,"schema":{"type":"string","maxLength":120},"description":"Optional model id, overriding the default for that provider. Defaults: openai → gpt-4o-mini, anthropic → claude-sonnet-4-5, google → gemini-2.5-flash, groq → openai/gpt-oss-120b, mistral → mistral-large-latest, openrouter → meta-llama/llama-3.3-70b-instruct, deepseek → deepseek-chat, together → meta-llama/Llama-3.3-70B-Instruct-Turbo.","example":"claude-sonnet-4-5"},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignHoroscope"},"example":{"sign":"aries","language":"uk"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/horoscope/weekly \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"sign\": \"aries\", \"language\": \"uk\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/horoscope/weekly', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"sign\": \"aries\",\n    \"language\": \"uk\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/horoscope/weekly',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'sign': \"aries\",\n      'language': \"uk\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('horoscope/weekly', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'sign' => 'aries',\n        'language' => 'uk',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"weekStart":{"type":"string","nullable":true},"weekEnd":{"type":"string","nullable":true},"language":{"type":"string","nullable":true},"title":{"type":"string","nullable":true},"body":{"type":"string","nullable":true},"keyTransits":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string","nullable":true},"type":{"type":"string","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"weekStart":"2026-05-04","weekEnd":"2026-05-10","language":"uk","title":"Тиждень переоцінки","body":"...","keyTransits":[{"date":"2026-05-07","type":"Mercury-trine-Saturn"}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}}}},"/horoscope/monthly":{"post":{"tags":["Horoscope"],"summary":"Monthly Horoscope","description":"Monthly horoscope for a zodiac sign: the same shape as the daily one, over 30 days from `date`, with the month's ingresses, stations and lunar phases.","operationId":"horoscope_monthly","x-quality":"green","x-source":"Daily/monthly horoscope generation via natal-transit composite + sign-based archetype. AI-augmented narrative via chatCompletion gateway (multi-provider chain).","security":[{"ApiKeyAuth":[]}],"parameters":[{"in":"header","name":"Accept-Language","required":false,"schema":{"type":"string","enum":["uk","en","de","ru","pl","es","pt","fr","it","nl","cs","ro","hu","el","tr","ar","hi","ja","ko","vi","id"]},"description":"Target language for response text fields. RFC 7231 q-weighted. Falls back to ?lang= query param, then body.language, then source uk. Unknown codes silently fall through to uk.","example":"de"},{"in":"query","name":"lang","required":false,"schema":{"type":"string","enum":["uk","en","de","ru","pl","es","pt","fr","it","nl","cs","ro","hu","el","tr","ar","hi","ja","ko","vi","id"]},"description":"Alternative to Accept-Language for clients without header control.","example":"hi"},{"in":"header","name":"X-Provider","required":false,"schema":{"type":"string","enum":["openai","anthropic","google","groq","mistral","openrouter","deepseek","together"]},"description":"Bring your own model key: the LLM provider that should run this completion. Send together with X-Provider-Key or the request is refused: a key with no provider bills us for tokens you meant to pay for, and a provider with no key would look like it worked. The endpoint is fixed per provider on our side and is never taken from the request. There is no fallback to our own chain: if your key fails you get the provider's status and message.","example":"anthropic"},{"in":"header","name":"X-Provider-Key","required":false,"schema":{"type":"string"},"description":"Your own credential for X-Provider. Never logged, stored or cached: it travels in a header because the request body is hashed into two cache keys, and a BYOK turn bypasses both caches in each direction. A provider error that quotes the key back is redacted before it reaches our logs or your response. Such a turn costs 5 credits instead of the endpoint price, and only when a completion actually ran on your key.","example":"sk-ant-..."},{"in":"header","name":"X-Provider-Model","required":false,"schema":{"type":"string","maxLength":120},"description":"Optional model id, overriding the default for that provider. Defaults: openai → gpt-4o-mini, anthropic → claude-sonnet-4-5, google → gemini-2.5-flash, groq → openai/gpt-oss-120b, mistral → mistral-large-latest, openrouter → meta-llama/llama-3.3-70b-instruct, deepseek → deepseek-chat, together → meta-llama/Llama-3.3-70B-Instruct-Turbo.","example":"claude-sonnet-4-5"},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignHoroscope"},"example":{"sign":"aries","language":"uk"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/horoscope/monthly \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"sign\": \"aries\", \"language\": \"uk\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/horoscope/monthly', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"sign\": \"aries\",\n    \"language\": \"uk\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/horoscope/monthly',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'sign': \"aries\",\n      'language': \"uk\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('horoscope/monthly', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'sign' => 'aries',\n        'language' => 'uk',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"horoscope":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true},"model":{"type":"string","nullable":true},"language":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"horoscope":"Поточна енергія місяця підкреслює поєднання практичності та інтуїтивного підходу. Сонце у Діві (0,4°) дарує ясність мислення, а його **трин до Місяця у Козерозі** створює гармонію між внутрішніми відчуттями та зовнішніми діями. Це сприяє більш збалансованому сприйняттю реальності, дозволяючи вам впевнено планувати справи, не втрачаючи при цьому чутливості до власних потреб. Кон'юнкція Сонця з Меркурі в Леві підсилює комунікативну активність, а одночасний опозиційний аспект Сонця до Північного Вузла вказує на можливість переосмислення довгострокових цілей.\n\n**Ключові дати та планетарні події**\n\n- **23 серпня** – Сонце в кон'юнкції з Меркурі (розумові ідеї, важливі розмови).  \n- **24 серпня** – Місяць у опозиції до Марса (емоційна напруга, потреба у самоконтролі).  \n- **26 серпня** – Місяць квадрат до Нептуна (можливі ілюзії, важливо залишатися реалістичним).  \n- **27 серпня** – Венера у секстилі до Юпітера (можливості у стосунках та фінансах).  \n- **30 серпня** – Венера в опозиції до Сатурна (випробування в особистих зв’язках, потреба у відповідальності).  \n- **31 серпня** – Уран у трині до Плутону (неочікувані прозріння, трансформація).\n\n**Теми кожного тижня**\n\n*Тиждень 1 (1‑7 серпня)* – Під впливом Меркурія в опозиції до Північного Вузла ваші думки можуть виявитися суперечливими. Це час, коли варто переглянути старі плани, відкинути зайве та сфокусуватись на нових напрямках. **Внутрішня гармонія** досягатиметься через письмову рефлексію та діалог із наставниками.\n\n*Тиждень 2 (8‑14 серпня)* – Місяць у опозиції до Марса підкреслює емоційну напругу. Ви можете відчувати імпульсивність, тому важливо практикувати техніки розслаблення та встановлювати здорові межі. Працюйте над **самоконтролем** у стресових ситуаціях, уникайте конфліктів, які не несуть конструктивного результату.\n\n*Тиждень 3 (15‑21 серпня)* – Венера в секстилі до Юпітера відкриває двері до нових можливостей у любові та фінансах. Це сприятливий період для спільних проєктів, романтичних ініціатив та інвестування в особистий розвиток. Однак опозиція Венери до Сатурна нагадує про необхідність **реалістичних очікувань** і планування довгострокових зобов’язань.\n\n*Тиждень 4 (22‑31 серпня)* – Уран у трині до Плутону та Нептун у секстилі до Плутону активізують процеси трансформації та глибокого зцілення. Плутон у квадраті до Хірона підказує, що старі рани можуть знову з’явитися, проте це шанс їх переосмислити і звільнитися від обмежень. **Ліліт у трині до Хірона** підтримує інтуїтивне розуміння власних меж і потреб.\n\n**Сфери фокусу**\n\n- **Любов:** відкритість до нових знайомств (27 серпня), одночасно будьте готові до випробувань у стосунках (30 серпня).  \n- **Кар’єра:** використайте ясність розуму (23 серпня) для планування проєктів; уникайте поспішних рішень під час емоційної напруги (24‑26 серпня).  \n- **Фінанси:** можливості зростання через творчі інвестиції (27 серпня), проте дотримуйтесь бюджету та не піддавайтеся надмірному ризику (30 серпня).  \n- **Здоров’я:** звертайте увагу на сигнали тіла під час Місяця в опозиції до Марса; практики дихання та легкі фізичні навантаження допоможуть зберегти баланс.  \n- **Особистий розвиток:** працюйте над самосвідомістю через письмові практики (1‑7 серпня) і медитації, що підтримують процеси трансформації (22‑31 серпня).\n\nМісяць пропонує вам поєднати аналітичний підхід з гнучкістю інтуїції. Використайте **трин Сонця до Місяця** як підґрунтя для гармонійного руху вперед, пам’ятаючи, що кожна можливість - це лише потенціал, який розкривається вашою активною участю та свідомим вибором. Нехай цей період принесе вам нові відкриття та внутрішнє зростання.","disclaimer":"Це згенеровано ШІ виключно для розваги та саморефлексії. Не є медичною, юридичною чи фінансовою порадою. З відповідних питань зверніться до кваліфікованих спеціалістів.","model":"openai/gpt-oss-120b","language":"uk"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}}}},"/horoscope/yearly":{"post":{"tags":["Horoscope"],"summary":"Yearly Horoscope","description":"Generate a year-ahead horoscope (12-month window) with major transit cycles, solar return chart context, and time-lord (profection) for the year.","operationId":"horoscope_yearly","x-quality":"green","x-source":"Daily/monthly horoscope generation via natal-transit composite + sign-based archetype. AI-augmented narrative via chatCompletion gateway (multi-provider chain).","security":[{"ApiKeyAuth":[]}],"parameters":[{"in":"header","name":"Accept-Language","required":false,"schema":{"type":"string","enum":["uk","en","de","ru","pl","es","pt","fr","it","nl","cs","ro","hu","el","tr","ar","hi","ja","ko","vi","id"]},"description":"Target language for response text fields. RFC 7231 q-weighted. Falls back to ?lang= query param, then body.language, then source uk. Unknown codes silently fall through to uk.","example":"de"},{"in":"query","name":"lang","required":false,"schema":{"type":"string","enum":["uk","en","de","ru","pl","es","pt","fr","it","nl","cs","ro","hu","el","tr","ar","hi","ja","ko","vi","id"]},"description":"Alternative to Accept-Language for clients without header control.","example":"hi"},{"in":"header","name":"X-Provider","required":false,"schema":{"type":"string","enum":["openai","anthropic","google","groq","mistral","openrouter","deepseek","together"]},"description":"Bring your own model key: the LLM provider that should run this completion. Send together with X-Provider-Key or the request is refused: a key with no provider bills us for tokens you meant to pay for, and a provider with no key would look like it worked. The endpoint is fixed per provider on our side and is never taken from the request. There is no fallback to our own chain: if your key fails you get the provider's status and message.","example":"anthropic"},{"in":"header","name":"X-Provider-Key","required":false,"schema":{"type":"string"},"description":"Your own credential for X-Provider. Never logged, stored or cached: it travels in a header because the request body is hashed into two cache keys, and a BYOK turn bypasses both caches in each direction. A provider error that quotes the key back is redacted before it reaches our logs or your response. Such a turn costs 5 credits instead of the endpoint price, and only when a completion actually ran on your key.","example":"sk-ant-..."},{"in":"header","name":"X-Provider-Model","required":false,"schema":{"type":"string","maxLength":120},"description":"Optional model id, overriding the default for that provider. Defaults: openai → gpt-4o-mini, anthropic → claude-sonnet-4-5, google → gemini-2.5-flash, groq → openai/gpt-oss-120b, mistral → mistral-large-latest, openrouter → meta-llama/llama-3.3-70b-instruct, deepseek → deepseek-chat, together → meta-llama/Llama-3.3-70B-Instruct-Turbo.","example":"claude-sonnet-4-5"},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignHoroscope"},"example":{"sign":"aries","language":"uk"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/horoscope/yearly \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"sign\": \"aries\", \"language\": \"uk\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/horoscope/yearly', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"sign\": \"aries\",\n    \"language\": \"uk\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/horoscope/yearly',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'sign': \"aries\",\n      'language': \"uk\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('horoscope/yearly', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'sign' => 'aries',\n        'language' => 'uk',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"year":{"type":"number","nullable":true},"language":{"type":"string","nullable":true},"title":{"type":"string","nullable":true},"body":{"type":"string","nullable":true},"profectionLord":{"type":"string","nullable":true},"solarReturn":{"type":"object","properties":{"date":{"type":"string","nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"year":2026,"language":"uk","title":"Рік відновлення","body":"...","profectionLord":"Mercury","solarReturn":{"date":"2026-05-15T14:32:11Z"}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}}}},"/horoscope/compatibility":{"post":{"tags":["Horoscope"],"summary":"Compatibility Horoscope","description":"Generate a relationship horoscope based on synastry between two charts: strengths, friction points, and themes for the next 30 days.","operationId":"horoscope_compatibility","x-quality":"green","x-source":"Daily/monthly horoscope generation via natal-transit composite + sign-based archetype. AI-augmented narrative via chatCompletion gateway (multi-provider chain).","security":[{"ApiKeyAuth":[]}],"parameters":[{"in":"header","name":"Accept-Language","required":false,"schema":{"type":"string","enum":["uk","en","de","ru","pl","es","pt","fr","it","nl","cs","ro","hu","el","tr","ar","hi","ja","ko","vi","id"]},"description":"Target language for response text fields. RFC 7231 q-weighted. Falls back to ?lang= query param, then body.language, then source uk. Unknown codes silently fall through to uk.","example":"de"},{"in":"query","name":"lang","required":false,"schema":{"type":"string","enum":["uk","en","de","ru","pl","es","pt","fr","it","nl","cs","ro","hu","el","tr","ar","hi","ja","ko","vi","id"]},"description":"Alternative to Accept-Language for clients without header control.","example":"hi"},{"in":"header","name":"X-Provider","required":false,"schema":{"type":"string","enum":["openai","anthropic","google","groq","mistral","openrouter","deepseek","together"]},"description":"Bring your own model key: the LLM provider that should run this completion. Send together with X-Provider-Key or the request is refused: a key with no provider bills us for tokens you meant to pay for, and a provider with no key would look like it worked. The endpoint is fixed per provider on our side and is never taken from the request. There is no fallback to our own chain: if your key fails you get the provider's status and message.","example":"anthropic"},{"in":"header","name":"X-Provider-Key","required":false,"schema":{"type":"string"},"description":"Your own credential for X-Provider. Never logged, stored or cached: it travels in a header because the request body is hashed into two cache keys, and a BYOK turn bypasses both caches in each direction. A provider error that quotes the key back is redacted before it reaches our logs or your response. Such a turn costs 5 credits instead of the endpoint price, and only when a completion actually ran on your key.","example":"sk-ant-..."},{"in":"header","name":"X-Provider-Model","required":false,"schema":{"type":"string","maxLength":120},"description":"Optional model id, overriding the default for that provider. Defaults: openai → gpt-4o-mini, anthropic → claude-sonnet-4-5, google → gemini-2.5-flash, groq → openai/gpt-oss-120b, mistral → mistral-large-latest, openrouter → meta-llama/llama-3.3-70b-instruct, deepseek → deepseek-chat, together → meta-llama/Llama-3.3-70B-Instruct-Turbo.","example":"claude-sonnet-4-5"},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Compatibility"},"example":{"sign1":"aries","sign2":"leo"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/horoscope/compatibility \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"sign1\": \"aries\", \"sign2\": \"leo\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/horoscope/compatibility', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"sign1\": \"aries\",\n    \"sign2\": \"leo\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/horoscope/compatibility',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'sign1': \"aries\",\n      'sign2': \"leo\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('horoscope/compatibility', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'sign1' => 'aries',\n        'sign2' => 'leo',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"score":{"type":"number","nullable":true},"language":{"type":"string","nullable":true},"summary":{"type":"string","nullable":true},"strengths":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"challenges":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"score":72,"language":"uk","summary":"Сильна емоційна резонансність, але…","strengths":["Sun-Moon trine","Venus-Mars sextile"],"challenges":["Saturn-Mars square"]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}}}},"/interpret/natal":{"post":{"tags":["AI Interpretations"],"summary":"Natal Chart Interpretation","description":"Generate AI interpretation of a natal chart: personality traits, life themes, strongest archetypes. Multi-language. Token-cached for repeats.","operationId":"interpret_natal","x-quality":"green","x-source":"AI-powered interpretation via chatCompletion gateway (Gemini/Groq/OpenRouter chain). Prompts based on Robert Hand + Stephen Forrest interpretive lineage. Cached via ai-cache middleware.","security":[{"ApiKeyAuth":[]}],"parameters":[{"in":"header","name":"Accept-Language","required":false,"schema":{"type":"string","enum":["uk","en","de","ru","pl","es","pt","fr","it","nl","cs","ro","hu","el","tr","ar","hi","ja","ko","vi","id"]},"description":"Target language for response text fields. RFC 7231 q-weighted. Falls back to ?lang= query param, then body.language, then source uk. Unknown codes silently fall through to uk.","example":"de"},{"in":"query","name":"lang","required":false,"schema":{"type":"string","enum":["uk","en","de","ru","pl","es","pt","fr","it","nl","cs","ro","hu","el","tr","ar","hi","ja","ko","vi","id"]},"description":"Alternative to Accept-Language for clients without header control.","example":"hi"},{"in":"header","name":"X-Provider","required":false,"schema":{"type":"string","enum":["openai","anthropic","google","groq","mistral","openrouter","deepseek","together"]},"description":"Bring your own model key: the LLM provider that should run this completion. Send together with X-Provider-Key or the request is refused: a key with no provider bills us for tokens you meant to pay for, and a provider with no key would look like it worked. The endpoint is fixed per provider on our side and is never taken from the request. There is no fallback to our own chain: if your key fails you get the provider's status and message.","example":"anthropic"},{"in":"header","name":"X-Provider-Key","required":false,"schema":{"type":"string"},"description":"Your own credential for X-Provider. Never logged, stored or cached: it travels in a header because the request body is hashed into two cache keys, and a BYOK turn bypasses both caches in each direction. A provider error that quotes the key back is redacted before it reaches our logs or your response. Such a turn costs 5 credits instead of the endpoint price, and only when a completion actually ran on your key.","example":"sk-ant-..."},{"in":"header","name":"X-Provider-Model","required":false,"schema":{"type":"string","maxLength":120},"description":"Optional model id, overriding the default for that provider. Defaults: openai → gpt-4o-mini, anthropic → claude-sonnet-4-5, google → gemini-2.5-flash, groq → openai/gpt-oss-120b, mistral → mistral-large-latest, openrouter → meta-llama/llama-3.3-70b-instruct, deepseek → deepseek-chat, together → meta-llama/Llama-3.3-70B-Instruct-Turbo.","example":"claude-sonnet-4-5"},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InterpretNatal"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52,"language":"uk"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/interpret/natal \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52, \"language\": \"uk\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/interpret/natal', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52,\n    \"language\": \"uk\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/interpret/natal',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52,\n      'language': \"uk\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('interpret/natal', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n        'language' => 'uk',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"interpretation":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true},"model":{"type":"string","nullable":true},"language":{"type":"string","nullable":true},"chart_summary":{"type":"object","properties":{"sun":{"type":"string","nullable":true},"moon":{"type":"string","nullable":true},"ascendant":{"type":"string","nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"interpretation":"# Натальна карта\nСонце у Тельці, Місяць у Терезах…","disclaimer":"AI-generated interpretation for guidance only.","model":"openai/gpt-oss-120b","language":"uk","chart_summary":{"sun":"Taurus","moon":"Libra","ascendant":"Scorpio"}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}}}},"/interpret/synastry":{"post":{"tags":["AI Interpretations"],"summary":"Synastry Interpretation","description":"AI interpretation of synastry between two charts: relationship dynamics, attractions, friction points, long-term outlook.","operationId":"interpret_synastry","x-quality":"green","x-source":"AI-powered interpretation via chatCompletion gateway (Gemini/Groq/OpenRouter chain). Prompts based on Robert Hand + Stephen Forrest interpretive lineage. Cached via ai-cache middleware.","security":[{"ApiKeyAuth":[]}],"parameters":[{"in":"header","name":"Accept-Language","required":false,"schema":{"type":"string","enum":["uk","en","de","ru","pl","es","pt","fr","it","nl","cs","ro","hu","el","tr","ar","hi","ja","ko","vi","id"]},"description":"Target language for response text fields. RFC 7231 q-weighted. Falls back to ?lang= query param, then body.language, then source uk. Unknown codes silently fall through to uk.","example":"de"},{"in":"query","name":"lang","required":false,"schema":{"type":"string","enum":["uk","en","de","ru","pl","es","pt","fr","it","nl","cs","ro","hu","el","tr","ar","hi","ja","ko","vi","id"]},"description":"Alternative to Accept-Language for clients without header control.","example":"hi"},{"in":"header","name":"X-Provider","required":false,"schema":{"type":"string","enum":["openai","anthropic","google","groq","mistral","openrouter","deepseek","together"]},"description":"Bring your own model key: the LLM provider that should run this completion. Send together with X-Provider-Key or the request is refused: a key with no provider bills us for tokens you meant to pay for, and a provider with no key would look like it worked. The endpoint is fixed per provider on our side and is never taken from the request. There is no fallback to our own chain: if your key fails you get the provider's status and message.","example":"anthropic"},{"in":"header","name":"X-Provider-Key","required":false,"schema":{"type":"string"},"description":"Your own credential for X-Provider. Never logged, stored or cached: it travels in a header because the request body is hashed into two cache keys, and a BYOK turn bypasses both caches in each direction. A provider error that quotes the key back is redacted before it reaches our logs or your response. Such a turn costs 5 credits instead of the endpoint price, and only when a completion actually ran on your key.","example":"sk-ant-..."},{"in":"header","name":"X-Provider-Model","required":false,"schema":{"type":"string","maxLength":120},"description":"Optional model id, overriding the default for that provider. Defaults: openai → gpt-4o-mini, anthropic → claude-sonnet-4-5, google → gemini-2.5-flash, groq → openai/gpt-oss-120b, mistral → mistral-large-latest, openrouter → meta-llama/llama-3.3-70b-instruct, deepseek → deepseek-chat, together → meta-llama/Llama-3.3-70B-Instruct-Turbo.","example":"claude-sonnet-4-5"},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InterpretSynastry"},"example":{"chart1":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52},"chart2":{"date":"1985-11-03","time":"09:15:00","timezone":"Europe/Kyiv","latitude":48.46,"longitude":35.04}}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/interpret/synastry \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"chart1\": { \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }, \"chart2\": { \"date\": \"1985-11-03\", \"time\": \"09:15:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 48.46, \"longitude\": 35.04 } }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/interpret/synastry', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"chart1\": {\n      \"date\": \"1990-05-15\",\n      \"time\": \"15:30:00\",\n      \"timezone\": \"Europe/Kyiv\",\n      \"latitude\": 50.45,\n      \"longitude\": 30.52\n    },\n    \"chart2\": {\n      \"date\": \"1985-11-03\",\n      \"time\": \"09:15:00\",\n      \"timezone\": \"Europe/Kyiv\",\n      \"latitude\": 48.46,\n      \"longitude\": 35.04\n    }\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/interpret/synastry',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'chart1': {\n        'date': \"1990-05-15\",\n        'time': \"15:30:00\",\n        'timezone': \"Europe/Kyiv\",\n        'latitude': 50.45,\n        'longitude': 30.52\n      },\n      'chart2': {\n        'date': \"1985-11-03\",\n        'time': \"09:15:00\",\n        'timezone': \"Europe/Kyiv\",\n        'latitude': 48.46,\n        'longitude': 35.04\n      }\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('interpret/synastry', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'chart1' => [\n            'date' => '1990-05-15',\n            'time' => '15:30:00',\n            'timezone' => 'Europe/Kyiv',\n            'latitude' => 50.45,\n            'longitude' => 30.52,\n        ],\n        'chart2' => [\n            'date' => '1985-11-03',\n            'time' => '09:15:00',\n            'timezone' => 'Europe/Kyiv',\n            'latitude' => 48.46,\n            'longitude' => 35.04,\n        ],\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"interpretation":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true},"model":{"type":"string","nullable":true},"language":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"interpretation":"# Синастрія\nSun-Moon trine створює…","disclaimer":"AI-generated interpretation for guidance only.","model":"openai/gpt-oss-120b","language":"uk"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}}}},"/interpret/transits":{"post":{"tags":["AI Interpretations"],"summary":"Transits Interpretation","description":"AI interpretation of current/upcoming transits to a natal chart: what each major transit means in life context.","operationId":"interpret_transits","x-quality":"green","x-source":"AI-powered interpretation via chatCompletion gateway (Gemini/Groq/OpenRouter chain). Prompts based on Robert Hand + Stephen Forrest interpretive lineage. Cached via ai-cache middleware.","security":[{"ApiKeyAuth":[]}],"parameters":[{"in":"header","name":"Accept-Language","required":false,"schema":{"type":"string","enum":["uk","en","de","ru","pl","es","pt","fr","it","nl","cs","ro","hu","el","tr","ar","hi","ja","ko","vi","id"]},"description":"Target language for response text fields. RFC 7231 q-weighted. Falls back to ?lang= query param, then body.language, then source uk. Unknown codes silently fall through to uk.","example":"de"},{"in":"query","name":"lang","required":false,"schema":{"type":"string","enum":["uk","en","de","ru","pl","es","pt","fr","it","nl","cs","ro","hu","el","tr","ar","hi","ja","ko","vi","id"]},"description":"Alternative to Accept-Language for clients without header control.","example":"hi"},{"in":"header","name":"X-Provider","required":false,"schema":{"type":"string","enum":["openai","anthropic","google","groq","mistral","openrouter","deepseek","together"]},"description":"Bring your own model key: the LLM provider that should run this completion. Send together with X-Provider-Key or the request is refused: a key with no provider bills us for tokens you meant to pay for, and a provider with no key would look like it worked. The endpoint is fixed per provider on our side and is never taken from the request. There is no fallback to our own chain: if your key fails you get the provider's status and message.","example":"anthropic"},{"in":"header","name":"X-Provider-Key","required":false,"schema":{"type":"string"},"description":"Your own credential for X-Provider. Never logged, stored or cached: it travels in a header because the request body is hashed into two cache keys, and a BYOK turn bypasses both caches in each direction. A provider error that quotes the key back is redacted before it reaches our logs or your response. Such a turn costs 5 credits instead of the endpoint price, and only when a completion actually ran on your key.","example":"sk-ant-..."},{"in":"header","name":"X-Provider-Model","required":false,"schema":{"type":"string","maxLength":120},"description":"Optional model id, overriding the default for that provider. Defaults: openai → gpt-4o-mini, anthropic → claude-sonnet-4-5, google → gemini-2.5-flash, groq → openai/gpt-oss-120b, mistral → mistral-large-latest, openrouter → meta-llama/llama-3.3-70b-instruct, deepseek → deepseek-chat, together → meta-llama/Llama-3.3-70B-Instruct-Turbo.","example":"claude-sonnet-4-5"},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InterpretTransits"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52,"transitDate":"2026-06-15","transitTime":"12:00:00","language":"uk"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/interpret/transits \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52, \"transitDate\": \"2026-06-15\", \"transitTime\": \"12:00:00\", \"language\": \"uk\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/interpret/transits', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52,\n    \"transitDate\": \"2026-06-15\",\n    \"transitTime\": \"12:00:00\",\n    \"language\": \"uk\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/interpret/transits',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52,\n      'transitDate': \"2026-06-15\",\n      'transitTime': \"12:00:00\",\n      'language': \"uk\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('interpret/transits', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n        'transitDate' => '2026-06-15',\n        'transitTime' => '12:00:00',\n        'language' => 'uk',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"interpretation":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true},"model":{"type":"string","nullable":true},"language":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"interpretation":"## Астрологічна інтерпретація\nТранзитне Сонце в кон'юнкції з Натальним Місяцем: підвищена емоційна чутливість...","disclaimer":"AI-generated interpretation for guidance only.","model":"gemini-2.5-flash","language":"uk"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}}}},"/interpret/element":{"post":{"tags":["AI Interpretations"],"summary":"Chart Element Interpretation","description":"AI interpretation of a single chart element (planet/house/aspect) in context. Useful for chart-detail pages.","operationId":"interpret_element","x-quality":"green","x-source":"AI-powered interpretation via chatCompletion gateway (Gemini/Groq/OpenRouter chain). Prompts based on Robert Hand + Stephen Forrest interpretive lineage. Cached via ai-cache middleware.","security":[{"ApiKeyAuth":[]}],"parameters":[{"in":"header","name":"Accept-Language","required":false,"schema":{"type":"string","enum":["uk","en","de","ru","pl","es","pt","fr","it","nl","cs","ro","hu","el","tr","ar","hi","ja","ko","vi","id"]},"description":"Target language for response text fields. RFC 7231 q-weighted. Falls back to ?lang= query param, then body.language, then source uk. Unknown codes silently fall through to uk.","example":"de"},{"in":"query","name":"lang","required":false,"schema":{"type":"string","enum":["uk","en","de","ru","pl","es","pt","fr","it","nl","cs","ro","hu","el","tr","ar","hi","ja","ko","vi","id"]},"description":"Alternative to Accept-Language for clients without header control.","example":"hi"},{"in":"header","name":"X-Provider","required":false,"schema":{"type":"string","enum":["openai","anthropic","google","groq","mistral","openrouter","deepseek","together"]},"description":"Bring your own model key: the LLM provider that should run this completion. Send together with X-Provider-Key or the request is refused: a key with no provider bills us for tokens you meant to pay for, and a provider with no key would look like it worked. The endpoint is fixed per provider on our side and is never taken from the request. There is no fallback to our own chain: if your key fails you get the provider's status and message.","example":"anthropic"},{"in":"header","name":"X-Provider-Key","required":false,"schema":{"type":"string"},"description":"Your own credential for X-Provider. Never logged, stored or cached: it travels in a header because the request body is hashed into two cache keys, and a BYOK turn bypasses both caches in each direction. A provider error that quotes the key back is redacted before it reaches our logs or your response. Such a turn costs 5 credits instead of the endpoint price, and only when a completion actually ran on your key.","example":"sk-ant-..."},{"in":"header","name":"X-Provider-Model","required":false,"schema":{"type":"string","maxLength":120},"description":"Optional model id, overriding the default for that provider. Defaults: openai → gpt-4o-mini, anthropic → claude-sonnet-4-5, google → gemini-2.5-flash, groq → openai/gpt-oss-120b, mistral → mistral-large-latest, openrouter → meta-llama/llama-3.3-70b-instruct, deepseek → deepseek-chat, together → meta-llama/Llama-3.3-70B-Instruct-Turbo.","example":"claude-sonnet-4-5"},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InterpretElement"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52,"language":"uk"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/interpret/element \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52, \"language\": \"uk\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/interpret/element', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52,\n    \"language\": \"uk\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/interpret/element',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52,\n      'language': \"uk\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('interpret/element', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n        'language' => 'uk',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"interpretation":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true},"model":{"type":"string","nullable":true},"language":{"type":"string","nullable":true},"element_balance":{"type":"object","properties":{"Fire":{"type":"number","nullable":true},"Earth":{"type":"number","nullable":true},"Air":{"type":"number","nullable":true},"Water":{"type":"number","nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"interpretation":"Сатурн у власному знаку…","disclaimer":"AI-generated interpretation for guidance only.","model":"openai/gpt-oss-120b","language":"uk","element_balance":{"Fire":1,"Earth":6,"Air":1,"Water":5}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}}}},"/interpret/placement":{"post":{"tags":["AI Interpretations"],"summary":"Specific Placement Interpretation","description":"AI interpretation of a specific planet+sign+house combination: concise, focused on the placement only.","operationId":"interpret_placement","x-quality":"green","x-source":"AI-powered interpretation via chatCompletion gateway (Gemini/Groq/OpenRouter chain). Prompts based on Robert Hand + Stephen Forrest interpretive lineage. Cached via ai-cache middleware.","security":[{"ApiKeyAuth":[]}],"parameters":[{"in":"header","name":"Accept-Language","required":false,"schema":{"type":"string","enum":["uk","en","de","ru","pl","es","pt","fr","it","nl","cs","ro","hu","el","tr","ar","hi","ja","ko","vi","id"]},"description":"Target language for response text fields. RFC 7231 q-weighted. Falls back to ?lang= query param, then body.language, then source uk. Unknown codes silently fall through to uk.","example":"de"},{"in":"query","name":"lang","required":false,"schema":{"type":"string","enum":["uk","en","de","ru","pl","es","pt","fr","it","nl","cs","ro","hu","el","tr","ar","hi","ja","ko","vi","id"]},"description":"Alternative to Accept-Language for clients without header control.","example":"hi"},{"in":"header","name":"X-Provider","required":false,"schema":{"type":"string","enum":["openai","anthropic","google","groq","mistral","openrouter","deepseek","together"]},"description":"Bring your own model key: the LLM provider that should run this completion. Send together with X-Provider-Key or the request is refused: a key with no provider bills us for tokens you meant to pay for, and a provider with no key would look like it worked. The endpoint is fixed per provider on our side and is never taken from the request. There is no fallback to our own chain: if your key fails you get the provider's status and message.","example":"anthropic"},{"in":"header","name":"X-Provider-Key","required":false,"schema":{"type":"string"},"description":"Your own credential for X-Provider. Never logged, stored or cached: it travels in a header because the request body is hashed into two cache keys, and a BYOK turn bypasses both caches in each direction. A provider error that quotes the key back is redacted before it reaches our logs or your response. Such a turn costs 5 credits instead of the endpoint price, and only when a completion actually ran on your key.","example":"sk-ant-..."},{"in":"header","name":"X-Provider-Model","required":false,"schema":{"type":"string","maxLength":120},"description":"Optional model id, overriding the default for that provider. Defaults: openai → gpt-4o-mini, anthropic → claude-sonnet-4-5, google → gemini-2.5-flash, groq → openai/gpt-oss-120b, mistral → mistral-large-latest, openrouter → meta-llama/llama-3.3-70b-instruct, deepseek → deepseek-chat, together → meta-llama/Llama-3.3-70B-Instruct-Turbo.","example":"claude-sonnet-4-5"},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InterpretPlacement"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52,"planet":"Venus","language":"uk"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/interpret/placement \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52, \"planet\": \"Venus\", \"language\": \"uk\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/interpret/placement', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52,\n    \"planet\": \"Venus\",\n    \"language\": \"uk\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/interpret/placement',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52,\n      'planet': \"Venus\",\n      'language': \"uk\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('interpret/placement', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n        'planet' => 'Venus',\n        'language' => 'uk',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"interpretation":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true},"model":{"type":"string","nullable":true},"language":{"type":"string","nullable":true},"requested_planet":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"interpretation":"### Інтерпретація Венери…","disclaimer":"AI-generated interpretation for guidance only.","model":"openai/gpt-oss-120b","language":"uk","requested_planet":"Venus"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}}}},"/interpret/tarot":{"post":{"tags":["AI Interpretations"],"summary":"Tarot Spread Reading","description":"AI reading of a tarot, Marseille or Lenormand spread: each position read in context, then a synthesis of the whole spread and one piece of advice. Takes card slugs or the drawn array of any draw response. Multi-language.","operationId":"interpret_tarot","x-quality":"green","x-source":"AI-powered interpretation via chatCompletion gateway (Gemini/Groq/OpenRouter chain). Prompts based on Robert Hand + Stephen Forrest interpretive lineage. Cached via ai-cache middleware.","security":[{"ApiKeyAuth":[]}],"parameters":[{"in":"header","name":"Accept-Language","required":false,"schema":{"type":"string","enum":["uk","en","de","ru","pl","es","pt","fr","it","nl","cs","ro","hu","el","tr","ar","hi","ja","ko","vi","id"]},"description":"Target language for response text fields. RFC 7231 q-weighted. Falls back to ?lang= query param, then body.language, then source uk. Unknown codes silently fall through to uk.","example":"de"},{"in":"query","name":"lang","required":false,"schema":{"type":"string","enum":["uk","en","de","ru","pl","es","pt","fr","it","nl","cs","ro","hu","el","tr","ar","hi","ja","ko","vi","id"]},"description":"Alternative to Accept-Language for clients without header control.","example":"hi"},{"in":"header","name":"X-Provider","required":false,"schema":{"type":"string","enum":["openai","anthropic","google","groq","mistral","openrouter","deepseek","together"]},"description":"Bring your own model key: the LLM provider that should run this completion. Send together with X-Provider-Key or the request is refused: a key with no provider bills us for tokens you meant to pay for, and a provider with no key would look like it worked. The endpoint is fixed per provider on our side and is never taken from the request. There is no fallback to our own chain: if your key fails you get the provider's status and message.","example":"anthropic"},{"in":"header","name":"X-Provider-Key","required":false,"schema":{"type":"string"},"description":"Your own credential for X-Provider. Never logged, stored or cached: it travels in a header because the request body is hashed into two cache keys, and a BYOK turn bypasses both caches in each direction. A provider error that quotes the key back is redacted before it reaches our logs or your response. Such a turn costs 5 credits instead of the endpoint price, and only when a completion actually ran on your key.","example":"sk-ant-..."},{"in":"header","name":"X-Provider-Model","required":false,"schema":{"type":"string","maxLength":120},"description":"Optional model id, overriding the default for that provider. Defaults: openai → gpt-4o-mini, anthropic → claude-sonnet-4-5, google → gemini-2.5-flash, groq → openai/gpt-oss-120b, mistral → mistral-large-latest, openrouter → meta-llama/llama-3.3-70b-instruct, deepseek → deepseek-chat, together → meta-llama/Llama-3.3-70B-Instruct-Turbo.","example":"claude-sonnet-4-5"},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InterpretTarot"},"example":{"deck":"rider-waite","spread":"three-card","question":"What should I focus on at work?","cards":["the-fool",{"slug":"4-of-cups","reversed":true},"the-sun"],"language":"en"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/interpret/tarot \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"deck\": \"rider-waite\", \"spread\": \"three-card\", \"question\": \"What should I focus on at work?\", \"cards\": [ \"the-fool\", { \"slug\": \"4-of-cups\", \"reversed\": true }, \"the-sun\" ], \"language\": \"en\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/interpret/tarot', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"deck\": \"rider-waite\",\n    \"spread\": \"three-card\",\n    \"question\": \"What should I focus on at work?\",\n    \"cards\": [\n      \"the-fool\",\n      {\n        \"slug\": \"4-of-cups\",\n        \"reversed\": true\n      },\n      \"the-sun\"\n    ],\n    \"language\": \"en\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/interpret/tarot',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'deck': \"rider-waite\",\n      'spread': \"three-card\",\n      'question': \"What should I focus on at work?\",\n      'cards': [\n        \"the-fool\",\n        {\n          'slug': \"4-of-cups\",\n          'reversed': True\n        },\n        \"the-sun\"\n      ],\n      'language': \"en\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('interpret/tarot', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'deck' => 'rider-waite',\n        'spread' => 'three-card',\n        'question' => 'What should I focus on at work?',\n        'cards' => ['the-fool', [\n            'slug' => '4-of-cups',\n            'reversed' => true,\n        ], 'the-sun'],\n        'language' => 'en',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"deck":{"type":"string","nullable":true},"spread":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"name":{"type":"string","nullable":true}},"nullable":true},"question":{"type":"string","nullable":true},"positions":{"type":"array","items":{"type":"object","properties":{"index":{"type":"number","nullable":true},"position":{"type":"string","nullable":true},"positionMeaning":{"type":"string","nullable":true},"card":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"name":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"boolean","nullable":true},"reading":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"synthesis":{"type":"string","nullable":true},"advice":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true},"model":{"type":"string","nullable":true},"language":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"deck":"rider-waite","spread":{"slug":"three-card","name":"Past / Present / Future"},"question":"What should I focus on at work?","positions":[{"index":0,"position":"Past","positionMeaning":"Forces from the past shaping the situation.","card":{"slug":"the-fool","name":"The Fool"},"reversed":false,"reading":"The Fool in the past speaks of a leap you already took…"}],"synthesis":"Read together, the cards…","advice":"…","disclaimer":"…","model":"…","language":"en"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}}}},"/natal-texts":{"get":{"tags":["Reference"],"summary":"Natal texts (static)","description":"Edited interpretation texts for a chart, no AI at request time. `keys` is a comma list of up to 64: `sun.aries` (planet in sign, also `chiron`, `ascendant`), `moon.h4` (planet in house), `sun_moon.trine` (major aspect between two of Sun..Pluto). `lang` is required; a text that does not exist in that language is listed in `missing`, never replaced by another language. Planet in sign covers 20 languages; houses and aspects are being written. Plain text, paragraphs separated by a blank line.","operationId":"natal-texts_get","x-quality":"green","x-source":"AstroWay own interpretation series (astroway_bb_*), edited; the same corpus as Birth Book.","security":[{"ApiKeyAuth":[]}],"parameters":[{"in":"query","name":"keys","required":true,"schema":{"type":"string","example":"sun.aries,moon.h4,sun_moon.trine"},"description":"Comma list of up to 64 distinct keys: `<body>.<sign>` (planet in sign, also `chiron`, `ascendant`, `north_node`, `south_node`, `lilith`), `<body>.h<1-12>` (planet in house, also `chiron`, `lilith`), `<body>_<body>.<aspect>` (conjunction, sextile, square, trine, opposition between two of Sun..Pluto), `pattern.<name>` (t_square, grand_trine, grand_cross, stellium, yod, kite; kind `pattern`, a general text for the figure, the planets are yours to list). Nodes, Lilith in sign and patterns are written in every language listed for `lang`."},{"in":"query","name":"lang","required":true,"schema":{"type":"string","enum":["uk","en","de","pl","es","pt","fr","it","nl","cs","ro","hu","el","tr","ar","hi","ja","ko","vi","id"],"example":"en"},"description":"Language of the texts. No fallback: a text missing in this language is listed in `missing`."},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X GET https://api.astroway.info/v1/natal-texts?keys=sun.aries,moon.h4,sun_moon.trine&lang=en \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/natal-texts?keys=sun.aries,moon.h4,sun_moon.trine&lang=en', {\n  method: 'GET',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.get(\n    'https://api.astroway.info/v1/natal-texts?keys=sun.aries,moon.h4,sun_moon.trine&lang=en',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->get('natal-texts?keys=sun.aries,moon.h4,sun_moon.trine&lang=en', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"lang":{"type":"string","nullable":true},"texts":{"type":"object","properties":{"sun.aries":{"type":"object","properties":{"title":{"type":"string","nullable":true},"body":{"type":"string","nullable":true},"kind":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"missing":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"lang":"en","texts":{"sun.aries":{"title":"Sun in Aries","body":"Sun in Aries is will in its purest form, still hot as metal fresh from the furnace. …","kind":"planet_in_sign"}},"missing":["moon.h4"]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}}}},"/reference/signs":{"get":{"tags":["Reference"],"summary":"Zodiac Signs","description":"Reference list of the 12 zodiac signs with element, modality, polarity, classical and modern rulers, exaltation, fall, detriment, and body parts.","operationId":"reference_signs_get","x-quality":"green","x-source":"Public-domain canonical sources: Ptolemy Tetrabiblos, Lilly Christian Astrology, Robson Fixed Stars, Vettius Valens Anthology, BPHS, Bonatti Liber Astronomiae.","x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X GET https://api.astroway.info/v1/reference/signs \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/reference/signs', {\n  method: 'GET',\n  headers: {\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.get(\n    'https://api.astroway.info/v1/reference/signs',\n    headers={'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->get('reference/signs', [\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"glyph":{"type":"string","nullable":true},"unicode":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"modality":{"type":"string","nullable":true},"polarity":{"type":"string","nullable":true},"ruler":{"type":"string","nullable":true},"exaltation":{"type":"string","nullable":true},"fall":{"type":"string","nullable":true},"detriment":{"type":"string","nullable":true},"bodyParts":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"startLongitude":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"count":{"type":"number","nullable":true}}}}},"example":{"ok":true,"data":{"items":[{"id":0,"name":"Aries","glyph":"♈","unicode":"U+2648","element":"fire","modality":"cardinal","polarity":"masculine","ruler":"Mars","exaltation":"Sun","fall":"Saturn","detriment":"Venus","bodyParts":["head"],"startLongitude":0}],"count":12}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"security":[],"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/reference/planets":{"get":{"tags":["Reference"],"summary":"Planets","description":"Reference list of planetary bodies (Sun..Pluto + nodes + Chiron + Lilith) with archetype, rulerships, exaltation/fall/detriment, orbit period, and category.","operationId":"reference_planets_get","x-quality":"green","x-source":"Public-domain canonical sources: Ptolemy Tetrabiblos, Lilly Christian Astrology, Robson Fixed Stars, Vettius Valens Anthology, BPHS, Bonatti Liber Astronomiae.","x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X GET https://api.astroway.info/v1/reference/planets \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/reference/planets', {\n  method: 'GET',\n  headers: {\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.get(\n    'https://api.astroway.info/v1/reference/planets',\n    headers={'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->get('reference/planets', [\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"glyph":{"type":"string","nullable":true},"unicode":{"type":"string","nullable":true},"archetype":{"type":"string","nullable":true},"rules":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"exaltation":{"type":"number","nullable":true},"fall":{"type":"number","nullable":true},"detriment":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"orbitDays":{"type":"number","nullable":true},"type":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"count":{"type":"number","nullable":true}}}}},"example":{"ok":true,"data":{"items":[{"id":0,"name":"Sun","glyph":"☉","unicode":"U+2609","archetype":"self, vitality, ego, conscious will","rules":[4],"exaltation":0,"fall":6,"detriment":[10],"orbitDays":365.25,"type":"luminary"}],"count":14}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"security":[],"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/reference/houses":{"get":{"tags":["Reference"],"summary":"Houses","description":"Reference list of the 12 houses with natural sign, natural ruler, life area, classical and modern significations, axis pairing, and angularity.","operationId":"reference_houses_get","x-quality":"green","x-source":"Public-domain canonical sources: Ptolemy Tetrabiblos, Lilly Christian Astrology, Robson Fixed Stars, Vettius Valens Anthology, BPHS, Bonatti Liber Astronomiae.","x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X GET https://api.astroway.info/v1/reference/houses \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/reference/houses', {\n  method: 'GET',\n  headers: {\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.get(\n    'https://api.astroway.info/v1/reference/houses',\n    headers={'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->get('reference/houses', [\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"naturalSign":{"type":"string","nullable":true},"naturalRuler":{"type":"string","nullable":true},"lifeArea":{"type":"string","nullable":true},"classicalSignification":{"type":"string","nullable":true},"modernSignification":{"type":"string","nullable":true},"axis":{"type":"string","nullable":true},"type":{"type":"string","nullable":true},"eastWest":{"type":"string","nullable":true},"aboveHorizon":{"type":"boolean","nullable":true},"quadrant":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"count":{"type":"number","nullable":true}}}}},"example":{"ok":true,"data":{"items":[{"number":1,"name":"House of Self","naturalSign":"Aries","naturalRuler":"Mars","lifeArea":"identity, body, appearance, vitality","classicalSignification":"life, body, beginnings","modernSignification":"self-image, persona, first impression","axis":"1/7","type":"angular","eastWest":"east","aboveHorizon":false,"quadrant":"NE"}],"count":12}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"security":[],"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/reference/aspects":{"get":{"tags":["Reference"],"summary":"Aspects","description":"Reference catalogue of major / minor / harmonic aspects with default orbs per orb school (Lilly, Ptolemy, modern), nature, and harmonic family.","operationId":"reference_aspects_get","x-quality":"green","x-source":"Public-domain canonical sources: Ptolemy Tetrabiblos, Lilly Christian Astrology, Robson Fixed Stars, Vettius Valens Anthology, BPHS, Bonatti Liber Astronomiae.","x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X GET https://api.astroway.info/v1/reference/aspects \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/reference/aspects', {\n  method: 'GET',\n  headers: {\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.get(\n    'https://api.astroway.info/v1/reference/aspects',\n    headers={'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->get('reference/aspects', [\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","nullable":true},"glyph":{"type":"string","nullable":true},"unicode":{"type":"string","nullable":true},"angle":{"type":"number","nullable":true},"family":{"type":"string","nullable":true},"nature":{"type":"string","nullable":true},"harmonic":{"type":"number","nullable":true},"defaultOrbs":{"type":"object","properties":{"lilly":{"type":"number","nullable":true},"ptolemy":{"type":"number","nullable":true},"modern":{"type":"number","nullable":true}},"nullable":true}},"nullable":true},"nullable":true},"count":{"type":"number","nullable":true},"lillyPlanetaryMoieties":{"type":"object","properties":{"Sun":{"type":"number","nullable":true},"Moon":{"type":"number","nullable":true},"Mercury":{"type":"number","nullable":true},"Venus":{"type":"number","nullable":true},"Mars":{"type":"number","nullable":true},"Jupiter":{"type":"number","nullable":true},"Saturn":{"type":"number","nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"items":[{"name":"Conjunction","glyph":"☌","unicode":"U+260C","angle":0,"family":"major","nature":"neutral","harmonic":1,"defaultOrbs":{"lilly":9,"ptolemy":8,"modern":10}}],"count":13,"lillyPlanetaryMoieties":{"Sun":15,"Moon":12,"Mercury":7,"Venus":7,"Mars":7,"Jupiter":9,"Saturn":9}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"security":[],"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/reference/elements":{"get":{"tags":["Reference"],"summary":"Elements","description":"Reference list of fire / earth / air / water with their qualities, signs, planetary affinity, season, body humour, and Jungian function.","operationId":"reference_elements_get","x-quality":"green","x-source":"Public-domain canonical sources: Ptolemy Tetrabiblos, Lilly Christian Astrology, Robson Fixed Stars, Vettius Valens Anthology, BPHS, Bonatti Liber Astronomiae.","x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X GET https://api.astroway.info/v1/reference/elements \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/reference/elements', {\n  method: 'GET',\n  headers: {\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.get(\n    'https://api.astroway.info/v1/reference/elements',\n    headers={'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->get('reference/elements', [\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","nullable":true},"qualities":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"signs":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"planets":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"season":{"type":"string","nullable":true},"bodyHumour":{"type":"string","nullable":true},"jungianFunction":{"type":"string","nullable":true},"description":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"count":{"type":"number","nullable":true}}}}},"example":{"ok":true,"data":{"items":[{"name":"fire","qualities":["hot"],"signs":["Aries"],"planets":["Sun"],"season":"spring/summer warmth","bodyHumour":"choleric (yellow bile)","jungianFunction":"intuition","description":"enthusiasm, action, will, inspiration"}],"count":4}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"security":[],"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/reference/modalities":{"get":{"tags":["Reference"],"summary":"Modalities","description":"Reference list of cardinal / fixed / mutable modalities with associated signs, behavioural keyword, best uses, and shadow side.","operationId":"reference_modalities_get","x-quality":"green","x-source":"Public-domain canonical sources: Ptolemy Tetrabiblos, Lilly Christian Astrology, Robson Fixed Stars, Vettius Valens Anthology, BPHS, Bonatti Liber Astronomiae.","x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X GET https://api.astroway.info/v1/reference/modalities \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/reference/modalities', {\n  method: 'GET',\n  headers: {\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.get(\n    'https://api.astroway.info/v1/reference/modalities',\n    headers={'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->get('reference/modalities', [\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","nullable":true},"signs":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"startsSeasons":{"type":"boolean","nullable":true},"description":{"type":"string","nullable":true},"keyword":{"type":"string","nullable":true},"bestFor":{"type":"string","nullable":true},"shadowSide":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"count":{"type":"number","nullable":true}}}}},"example":{"ok":true,"data":{"items":[{"name":"cardinal","signs":["Aries"],"startsSeasons":true,"description":"initiates, starts, sets direction","keyword":"initiation","bestFor":"starting projects, leadership, breaking ground","shadowSide":"starts but does not finish, restless"}],"count":3}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"security":[],"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/reference/polarities":{"get":{"tags":["Reference"],"summary":"Polarities","description":"Reference list of masculine / feminine (yang / yin) polarities with associated signs and energetic descriptions.","operationId":"reference_polarities_get","x-quality":"green","x-source":"Public-domain canonical sources: Ptolemy Tetrabiblos, Lilly Christian Astrology, Robson Fixed Stars, Vettius Valens Anthology, BPHS, Bonatti Liber Astronomiae.","x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X GET https://api.astroway.info/v1/reference/polarities \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/reference/polarities', {\n  method: 'GET',\n  headers: {\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.get(\n    'https://api.astroway.info/v1/reference/polarities',\n    headers={'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->get('reference/polarities', [\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","nullable":true},"alternateNames":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"signs":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"description":{"type":"string","nullable":true},"receptive":{"type":"boolean","nullable":true},"expressive":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true},"count":{"type":"number","nullable":true}}}}},"example":{"ok":true,"data":{"items":[{"name":"masculine","alternateNames":["yang"],"signs":["Aries"],"description":"expressive, outward, projective, initiating","receptive":false,"expressive":true}],"count":2}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"security":[],"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/reference/dignities":{"get":{"tags":["Reference"],"summary":"Essential Dignities","description":"Classical (Ptolemy / Lilly) essential dignities table: domicile, exaltation degree, day/night/common triplicity rulers, detriment and fall, plus Lilly's scoring weights.","operationId":"reference_dignities_get","x-quality":"green","x-source":"Public-domain canonical sources: Ptolemy Tetrabiblos, Lilly Christian Astrology, Robson Fixed Stars, Vettius Valens Anthology, BPHS, Bonatti Liber Astronomiae.","x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X GET https://api.astroway.info/v1/reference/dignities \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/reference/dignities', {\n  method: 'GET',\n  headers: {\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.get(\n    'https://api.astroway.info/v1/reference/dignities',\n    headers={'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->get('reference/dignities', [\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"sign":{"type":"string","nullable":true},"domicile":{"type":"string","nullable":true},"exaltation":{"type":"string","nullable":true},"exaltationDegree":{"type":"number","nullable":true},"triplicityDay":{"type":"string","nullable":true},"triplicityNight":{"type":"string","nullable":true},"triplicityCommon":{"type":"string","nullable":true},"detriment":{"type":"string","nullable":true},"fall":{"type":"string","nullable":true},"fallDegree":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"scores":{"type":"object","properties":{"domicile":{"type":"number","nullable":true},"exaltation":{"type":"number","nullable":true},"triplicity":{"type":"number","nullable":true},"term":{"type":"number","nullable":true},"face":{"type":"number","nullable":true},"detriment":{"type":"number","nullable":true},"fall":{"type":"number","nullable":true},"peregrine":{"type":"number","nullable":true}},"nullable":true},"count":{"type":"number","nullable":true}}}}},"example":{"ok":true,"data":{"items":[{"sign":"Aries","domicile":"Mars","exaltation":"Sun","exaltationDegree":19,"triplicityDay":"Sun","triplicityNight":"Jupiter","triplicityCommon":"Saturn","detriment":"Venus","fall":"Saturn","fallDegree":21}],"scores":{"domicile":5,"exaltation":4,"triplicity":3,"term":2,"face":1,"detriment":-5,"fall":-4,"peregrine":0},"count":12}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"security":[],"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/reference/decans":{"get":{"tags":["Reference"],"summary":"Decans","description":"Reference list of the 36 decans (10° divisions) with Egyptian Chaldean ruler, modern triplicity ruler, classical face ruler, and Liber Hermetis decanic deity name where attested.","operationId":"reference_decans_get","x-quality":"green","x-source":"Public-domain canonical sources: Ptolemy Tetrabiblos, Lilly Christian Astrology, Robson Fixed Stars, Vettius Valens Anthology, BPHS, Bonatti Liber Astronomiae.","x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X GET https://api.astroway.info/v1/reference/decans \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/reference/decans', {\n  method: 'GET',\n  headers: {\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.get(\n    'https://api.astroway.info/v1/reference/decans',\n    headers={'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->get('reference/decans', [\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"number":{"type":"number","nullable":true},"sign":{"type":"string","nullable":true},"decanInSign":{"type":"number","nullable":true},"startDegree":{"type":"number","nullable":true},"endDegree":{"type":"number","nullable":true},"egyptianRuler":{"type":"string","nullable":true},"modernRuler":{"type":"string","nullable":true},"faceRuler":{"type":"string","nullable":true},"description":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"count":{"type":"number","nullable":true}}}}},"example":{"ok":true,"data":{"items":[{"number":1,"sign":"Aries","decanInSign":1,"startDegree":0,"endDegree":10,"egyptianRuler":"Mars","modernRuler":"Mars","faceRuler":"Mars","description":"pioneer, raw fire, initiation"}],"count":36}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"security":[],"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/reference/nakshatras":{"get":{"tags":["Reference"],"summary":"Nakshatras","description":"Reference list of the 27 Vedic nakshatras with sidereal degree range (Lahiri), symbol, deity, Vimshottari ruler, gana, yoni, varna, guna, and pada starting sign.","operationId":"reference_nakshatras_get","x-quality":"green","x-source":"Public-domain canonical sources: Ptolemy Tetrabiblos, Lilly Christian Astrology, Robson Fixed Stars, Vettius Valens Anthology, BPHS, Bonatti Liber Astronomiae.","x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X GET https://api.astroway.info/v1/reference/nakshatras \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/reference/nakshatras', {\n  method: 'GET',\n  headers: {\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.get(\n    'https://api.astroway.info/v1/reference/nakshatras',\n    headers={'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->get('reference/nakshatras', [\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"startDegree":{"type":"number","nullable":true},"endDegree":{"type":"number","nullable":true},"symbol":{"type":"string","nullable":true},"deity":{"type":"string","nullable":true},"ruler":{"type":"string","nullable":true},"gana":{"type":"string","nullable":true},"yoni":{"type":"string","nullable":true},"varna":{"type":"string","nullable":true},"guna":{"type":"string","nullable":true},"caste":{"type":"string","nullable":true},"pada1Sign":{"type":"string","nullable":true},"description":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"count":{"type":"number","nullable":true}}}}},"example":{"ok":true,"data":{"items":[{"number":1,"name":"Ashwini","startDegree":0,"endDegree":13.333333333333334,"symbol":"horse head","deity":"Ashwini Kumaras","ruler":"Ketu","gana":"deva","yoni":"horse","varna":"vaishya","guna":"rajas","caste":"merchant","pada1Sign":"Aries","description":"speed, healing, new beginnings"}],"count":27}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"security":[],"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/reference/lots":{"get":{"tags":["Reference"],"summary":"Hellenistic Lots","description":"Reference catalogue of Hellenistic Lots / Arabic Parts (Fortune, Spirit, Eros, etc.) with day/night formulas, sect-sensitivity flag, and signification.","operationId":"reference_lots_get","x-quality":"green","x-source":"Public-domain canonical sources: Ptolemy Tetrabiblos, Lilly Christian Astrology, Robson Fixed Stars, Vettius Valens Anthology, BPHS, Bonatti Liber Astronomiae.","x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X GET https://api.astroway.info/v1/reference/lots \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/reference/lots', {\n  method: 'GET',\n  headers: {\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.get(\n    'https://api.astroway.info/v1/reference/lots',\n    headers={'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->get('reference/lots', [\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","nullable":true},"alternateName":{"type":"string","nullable":true},"formulaDay":{"type":"string","nullable":true},"formulaNight":{"type":"string","nullable":true},"sectSensitive":{"type":"boolean","nullable":true},"signification":{"type":"string","nullable":true},"source":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"count":{"type":"number","nullable":true}}}}},"example":{"ok":true,"data":{"items":[{"name":"Fortune","alternateName":"Tyche / Pars Fortunae","formulaDay":"ASC + Moon - Sun","formulaNight":"ASC + Sun - Moon","sectSensitive":true,"signification":"body, livelihood, material outcomes","source":"Valens Anthology I.4 (Hermetic)"}],"count":30}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"security":[],"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/reference/asteroids":{"get":{"tags":["Reference"],"summary":"Asteroids & Centaurs","description":"Reference list of the major asteroids and centaurs (Ceres, Pallas, Juno, Vesta, Chiron, Lilith, Eris, Sedna, Pholus) with Swiss Ephemeris ID, archetype, mythology, and orbit period.","operationId":"reference_asteroids_get","x-quality":"green","x-source":"Public-domain canonical sources: Ptolemy Tetrabiblos, Lilly Christian Astrology, Robson Fixed Stars, Vettius Valens Anthology, BPHS, Bonatti Liber Astronomiae.","x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X GET https://api.astroway.info/v1/reference/asteroids \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/reference/asteroids', {\n  method: 'GET',\n  headers: {\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.get(\n    'https://api.astroway.info/v1/reference/asteroids',\n    headers={'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->get('reference/asteroids', [\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","nullable":true},"swissEphemerisId":{"type":"number","nullable":true},"discoveryYear":{"type":"number","nullable":true},"archetype":{"type":"string","nullable":true},"mythology":{"type":"string","nullable":true},"signification":{"type":"string","nullable":true},"orbitYears":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"count":{"type":"number","nullable":true}}}}},"example":{"ok":true,"data":{"items":[{"name":"Ceres","swissEphemerisId":17,"discoveryYear":1801,"archetype":"great mother, nurturing, harvest","mythology":"Roman goddess of agriculture, mother of Persephone","signification":"nurture, food, body, motherhood, grief","orbitYears":4.6}],"count":10}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"security":[],"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/reference/zodiac-systems":{"get":{"tags":["Reference"],"summary":"Zodiac Systems","description":"Reference list of zodiac systems supported (Tropical, Sidereal Lahiri/Fagan-Bradley/Krishnamurti/Raman, Draconic, Heliocentric) with current ayanamsha offset and primary use cases.","operationId":"reference_zodiac-systems_get","x-quality":"green","x-source":"Public-domain canonical sources: Ptolemy Tetrabiblos, Lilly Christian Astrology, Robson Fixed Stars, Vettius Valens Anthology, BPHS, Bonatti Liber Astronomiae.","x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X GET https://api.astroway.info/v1/reference/zodiac-systems \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/reference/zodiac-systems', {\n  method: 'GET',\n  headers: {\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.get(\n    'https://api.astroway.info/v1/reference/zodiac-systems',\n    headers={'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->get('reference/zodiac-systems', [\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","nullable":true},"type":{"type":"string","nullable":true},"origin":{"type":"string","nullable":true},"primaryUseCase":{"type":"string","nullable":true},"schools":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}},"nullable":true},"nullable":true},"count":{"type":"number","nullable":true}}}}},"example":{"ok":true,"data":{"items":[{"name":"Tropical","type":"tropical","origin":"vernal equinox = 0° Aries (re-anchored each year)","primaryUseCase":"Western astrology: psychological, modern, evolutionary","schools":["Hellenistic"]}],"count":7}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"security":[],"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/reference/glyphs":{"get":{"tags":["Reference"],"summary":"Glyphs","description":"Unicode glyphs and fallback text for all astrological symbols (signs, planets, aspects, points, asteroids).","operationId":"reference_glyphs_get","x-quality":"green","x-source":"Public-domain canonical sources: Ptolemy Tetrabiblos, Lilly Christian Astrology, Robson Fixed Stars, Vettius Valens Anthology, BPHS, Bonatti Liber Astronomiae.","x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X GET https://api.astroway.info/v1/reference/glyphs \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/reference/glyphs', {\n  method: 'GET',\n  headers: {\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.get(\n    'https://api.astroway.info/v1/reference/glyphs',\n    headers={'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->get('reference/glyphs', [\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"symbol":{"type":"string","nullable":true},"category":{"type":"string","nullable":true},"unicode":{"type":"string","nullable":true},"glyph":{"type":"string","nullable":true},"fallbackText":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"count":{"type":"number","nullable":true}}}}},"example":{"ok":true,"data":{"items":[{"symbol":"Aries","category":"sign","unicode":"U+2648","glyph":"♈","fallbackText":"Ari"}],"count":40}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"security":[],"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/esoteric/crystals":{"get":{"tags":["Esoteric"],"summary":"Crystals: Full Directory","description":"Reference list of crystals with chakra, zodiac, planet, element, hardness, and purpose tags. Returns chakra and purpose taxonomies for filtering.","operationId":"esoteric_crystals_get","x-quality":"green","x-source":"Cross-referenced popular sources: Judy Hall \"The Crystal Bible\", Joanne Sacred Scribes / Doreen Virtue legacy (angel numbers), Carl Jung \"Man and His Symbols\", Tony Crisp \"Dream Dictionary\".","security":[{"ApiKeyAuth":[]}],"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X GET https://api.astroway.info/v1/esoteric/crystals \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/esoteric/crystals', {\n  method: 'GET',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.get(\n    'https://api.astroway.info/v1/esoteric/crystals',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->get('esoteric/crystals', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","nullable":true},"color":{"type":"string","nullable":true},"chakra":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"zodiacSigns":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"planet":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"element":{"type":"string","nullable":true},"hardness":{"type":"number","nullable":true},"purposes":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"description":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"count":{"type":"number","nullable":true},"chakras":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"purposes":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"items":[{"name":"Amethyst","color":"purple","chakra":["Crown"],"zodiacSigns":["Pisces"],"planet":["Jupiter"],"element":"air","hardness":7,"purposes":["intuition"],"description":"calming purple quartz; classical sobriety and clarity stone"}],"count":50,"chakras":["Root"],"purposes":["love"]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/esoteric/crystals/by-zodiac/{sign}":{"get":{"tags":["Esoteric"],"summary":"Crystals by Zodiac Sign","description":"Crystals indexed for a given zodiac sign (case-insensitive English name).","operationId":"esoteric_crystals_by-zodiac_{sign}_get","x-quality":"green","x-source":"Cross-referenced popular sources: Judy Hall \"The Crystal Bible\", Joanne Sacred Scribes / Doreen Virtue legacy (angel numbers), Carl Jung \"Man and His Symbols\", Tony Crisp \"Dream Dictionary\".","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"sign","in":"path","required":true,"description":"Zodiac sign, lowercase English name.","schema":{"type":"string"},"example":"leo"},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X GET https://api.astroway.info/v1/esoteric/crystals/by-zodiac/{sign} \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/esoteric/crystals/by-zodiac/{sign}', {\n  method: 'GET',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.get(\n    'https://api.astroway.info/v1/esoteric/crystals/by-zodiac/{sign}',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->get('esoteric/crystals/by-zodiac/{sign}', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"sign":{"type":"string","nullable":true},"items":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","nullable":true},"color":{"type":"string","nullable":true},"chakra":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"zodiacSigns":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"planet":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"element":{"type":"string","nullable":true},"hardness":{"type":"number","nullable":true},"purposes":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"description":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"count":{"type":"number","nullable":true}}}}},"example":{"ok":true,"data":{"sign":"leo","items":[{"name":"Ruby","color":"red","chakra":["Root"],"zodiacSigns":["Aries"],"planet":["Sun"],"element":"fire","hardness":9,"purposes":["passion"],"description":"king of gemstones; passion and leadership"}],"count":16}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}}}},"/esoteric/crystals/by-chakra/{chakra}":{"get":{"tags":["Esoteric"],"summary":"Crystals by Chakra","description":"Crystals indexed for a given chakra (Root / Sacral / Solar Plexus / Heart / Throat / Third Eye / Crown).","operationId":"esoteric_crystals_by-chakra_{chakra}_get","x-quality":"green","x-source":"Cross-referenced popular sources: Judy Hall \"The Crystal Bible\", Joanne Sacred Scribes / Doreen Virtue legacy (angel numbers), Carl Jung \"Man and His Symbols\", Tony Crisp \"Dream Dictionary\".","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"chakra","in":"path","required":true,"description":"Chakra name, lowercase.","schema":{"type":"string"},"example":"heart"},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X GET https://api.astroway.info/v1/esoteric/crystals/by-chakra/{chakra} \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/esoteric/crystals/by-chakra/{chakra}', {\n  method: 'GET',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.get(\n    'https://api.astroway.info/v1/esoteric/crystals/by-chakra/{chakra}',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->get('esoteric/crystals/by-chakra/{chakra}', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"chakra":{"type":"string","nullable":true},"items":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","nullable":true},"color":{"type":"string","nullable":true},"chakra":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"zodiacSigns":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"planet":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"element":{"type":"string","nullable":true},"hardness":{"type":"number","nullable":true},"purposes":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"description":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"count":{"type":"number","nullable":true}}}}},"example":{"ok":true,"data":{"chakra":"heart","items":[{"name":"Ruby","color":"red","chakra":["Root"],"zodiacSigns":["Aries"],"planet":["Sun"],"element":"fire","hardness":9,"purposes":["passion"],"description":"king of gemstones; passion and leadership"}],"count":17}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}}}},"/esoteric/crystals/by-purpose/{purpose}":{"get":{"tags":["Esoteric"],"summary":"Crystals by Purpose","description":"Crystals indexed by intent keyword (love, prosperity, healing, protection, etc.). Substring-matches against purpose tags.","operationId":"esoteric_crystals_by-purpose_{purpose}_get","x-quality":"green","x-source":"Cross-referenced popular sources: Judy Hall \"The Crystal Bible\", Joanne Sacred Scribes / Doreen Virtue legacy (angel numbers), Carl Jung \"Man and His Symbols\", Tony Crisp \"Dream Dictionary\".","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"purpose","in":"path","required":true,"description":"Purpose to match. Substring match against the indexed purposes, so `protect` finds `protection`.","schema":{"type":"string"},"example":"protection"},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X GET https://api.astroway.info/v1/esoteric/crystals/by-purpose/{purpose} \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/esoteric/crystals/by-purpose/{purpose}', {\n  method: 'GET',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.get(\n    'https://api.astroway.info/v1/esoteric/crystals/by-purpose/{purpose}',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->get('esoteric/crystals/by-purpose/{purpose}', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"purpose":{"type":"string","nullable":true},"items":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","nullable":true},"color":{"type":"string","nullable":true},"chakra":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"zodiacSigns":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"planet":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"element":{"type":"string","nullable":true},"hardness":{"type":"number","nullable":true},"purposes":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"description":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"count":{"type":"number","nullable":true}}}}},"example":{"ok":true,"data":{"purpose":"protection","items":[{"name":"Amethyst","color":"purple","chakra":["Crown"],"zodiacSigns":["Pisces"],"planet":["Jupiter"],"element":"air","hardness":7,"purposes":["intuition"],"description":"calming purple quartz; classical sobriety and clarity stone"}],"count":11}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}}}},"/esoteric/crystals/recommend":{"post":{"tags":["Esoteric"],"summary":"Crystal Recommendations","description":"Recommend crystals scored against natal sign placements (Sun/Moon/Asc) and intent keywords. Returns top-N matches with score.","operationId":"esoteric_crystals_recommend","x-quality":"green","x-source":"Cross-referenced popular sources: Judy Hall \"The Crystal Bible\", Joanne Sacred Scribes / Doreen Virtue legacy (angel numbers), Carl Jung \"Man and His Symbols\", Tony Crisp \"Dream Dictionary\".","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EsotericRecommendBody"},"example":{"sunSign":"Aries","moonSign":"Cancer","intent":"courage","limit":5}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/esoteric/crystals/recommend \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"sunSign\": \"Aries\", \"moonSign\": \"Cancer\", \"intent\": \"courage\", \"limit\": 5 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/esoteric/crystals/recommend', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"sunSign\": \"Aries\",\n    \"moonSign\": \"Cancer\",\n    \"intent\": \"courage\",\n    \"limit\": 5\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/esoteric/crystals/recommend',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'sunSign': \"Aries\",\n      'moonSign': \"Cancer\",\n      'intent': \"courage\",\n      'limit': 5\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('esoteric/crystals/recommend', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'sunSign' => 'Aries',\n        'moonSign' => 'Cancer',\n        'intent' => 'courage',\n        'limit' => 5,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"recommendations":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","nullable":true},"color":{"type":"string","nullable":true},"chakra":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"zodiacSigns":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"planet":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"element":{"type":"string","nullable":true},"hardness":{"type":"number","nullable":true},"purposes":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"description":{"type":"string","nullable":true},"matchScore":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"count":{"type":"number","nullable":true},"criteria":{"type":"object","properties":{"signs":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"intent":{"type":"string","nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"recommendations":[{"name":"Ruby","color":"red","chakra":["Root"],"zodiacSigns":["Aries"],"planet":["Sun"],"element":"fire","hardness":9,"purposes":["passion"],"description":"king of gemstones; passion and leadership","matchScore":6}],"count":5,"criteria":{"signs":["aries"],"intent":"courage"}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/esoteric/angel-numbers":{"get":{"tags":["Esoteric"],"summary":"Angel Numbers: Catalogue","description":"Full angel number catalogue (singles, masters, repeating, mirror, sequential patterns) with short and full meanings, themes.","operationId":"esoteric_angel-numbers_get","x-quality":"green","x-source":"Cross-referenced popular sources: Judy Hall \"The Crystal Bible\", Joanne Sacred Scribes / Doreen Virtue legacy (angel numbers), Carl Jung \"Man and His Symbols\", Tony Crisp \"Dream Dictionary\".","security":[{"ApiKeyAuth":[]}],"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X GET https://api.astroway.info/v1/esoteric/angel-numbers \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/esoteric/angel-numbers', {\n  method: 'GET',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.get(\n    'https://api.astroway.info/v1/esoteric/angel-numbers',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->get('esoteric/angel-numbers', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"number":{"type":"string","nullable":true},"pattern":{"type":"string","nullable":true},"shortMeaning":{"type":"string","nullable":true},"fullMeaning":{"type":"string","nullable":true},"themes":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}},"nullable":true},"nullable":true},"count":{"type":"number","nullable":true}}}}},"example":{"ok":true,"data":{"items":[{"number":"0","pattern":"single","shortMeaning":"infinite potential, beginning of journey","fullMeaning":"represents the void, infinite potential, and unity with source. signal to listen for divine guidance and prepare for new cycles.","themes":["unity"]}],"count":38}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/esoteric/angel-numbers/{number}":{"get":{"tags":["Esoteric"],"summary":"Angel Number Lookup","description":"Look up the meaning of a specific angel number sequence. Falls back to numerological reduction if not in catalogue.","operationId":"esoteric_angel-numbers_{number}_get","x-quality":"green","x-source":"Cross-referenced popular sources: Judy Hall \"The Crystal Bible\", Joanne Sacred Scribes / Doreen Virtue legacy (angel numbers), Carl Jung \"Man and His Symbols\", Tony Crisp \"Dream Dictionary\".","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"number","in":"path","required":true,"description":"Angel number, digits only. Unindexed numbers fall back to a pattern classification plus the reduced single digit.","schema":{"type":"string","pattern":"^\\d+$"},"example":"111"},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X GET https://api.astroway.info/v1/esoteric/angel-numbers/{number} \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/esoteric/angel-numbers/{number}', {\n  method: 'GET',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.get(\n    'https://api.astroway.info/v1/esoteric/angel-numbers/{number}',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->get('esoteric/angel-numbers/{number}', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"matched":{"type":"string","nullable":true},"number":{"type":"string","nullable":true},"pattern":{"type":"string","nullable":true},"shortMeaning":{"type":"string","nullable":true},"themes":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"matched":"exact","number":"1111","pattern":"mirror","shortMeaning":"awakening code","themes":["awakening","gateway"]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}}}},"/esoteric/angel-numbers/decode":{"post":{"tags":["Esoteric"],"summary":"Decode Angel Number","description":"Decode a numeric sequence in optional life context. Returns pattern classification, exact match, and reduced single-digit meaning.","operationId":"esoteric_angel-numbers_decode","x-quality":"green","x-source":"Cross-referenced popular sources: Judy Hall \"The Crystal Bible\", Joanne Sacred Scribes / Doreen Virtue legacy (angel numbers), Carl Jung \"Man and His Symbols\", Tony Crisp \"Dream Dictionary\".","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EsotericDecodeBody"},"example":{"sequence":"1234","context":"saw on receipt during career change"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/esoteric/angel-numbers/decode \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"sequence\": \"1234\", \"context\": \"saw on receipt during career change\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/esoteric/angel-numbers/decode', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"sequence\": \"1234\",\n    \"context\": \"saw on receipt during career change\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/esoteric/angel-numbers/decode',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'sequence': \"1234\",\n      'context': \"saw on receipt during career change\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('esoteric/angel-numbers/decode', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'sequence' => '1234',\n        'context' => 'saw on receipt during career change',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"sequence":{"type":"string","nullable":true},"pattern":{"type":"string","nullable":true},"reducedTo":{"type":"number","nullable":true},"exactMatch":{"type":"object","properties":{"shortMeaning":{"type":"string","nullable":true}},"nullable":true},"context":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"sequence":"1234","pattern":"sequential","reducedTo":1,"exactMatch":{"shortMeaning":"step by step progress"},"context":"saw on receipt during career change"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/esoteric/angel-numbers/by-life-path/{n}":{"get":{"tags":["Esoteric"],"summary":"Angel Numbers for Life Path","description":"Angel numbers aligned to a given life-path number (1-9, 11, 22, 33). Useful to identify recurring numerical signatures aligned with one's soul path.","operationId":"esoteric_angel-numbers_by-life-path_{n}_get","x-quality":"green","x-source":"Cross-referenced popular sources: Judy Hall \"The Crystal Bible\", Joanne Sacred Scribes / Doreen Virtue legacy (angel numbers), Carl Jung \"Man and His Symbols\", Tony Crisp \"Dream Dictionary\".","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"n","in":"path","required":true,"description":"Life path number: 1-9, or the master numbers 11, 22, 33.","schema":{"type":"integer","minimum":1,"maximum":33},"example":7},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X GET https://api.astroway.info/v1/esoteric/angel-numbers/by-life-path/{n} \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/esoteric/angel-numbers/by-life-path/{n}', {\n  method: 'GET',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.get(\n    'https://api.astroway.info/v1/esoteric/angel-numbers/by-life-path/{n}',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->get('esoteric/angel-numbers/by-life-path/{n}', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"lifePath":{"type":"number","nullable":true},"items":{"type":"array","items":{"type":"object","properties":{"number":{"type":"string","nullable":true},"shortMeaning":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"count":{"type":"number","nullable":true}}}}},"example":{"ok":true,"data":{"lifePath":7,"items":[{"number":"7","shortMeaning":"spiritual awakening"},{"number":"777","shortMeaning":"spiritual mastery"}],"count":2}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}}}},"/esoteric/angel-numbers/today":{"get":{"tags":["Esoteric"],"summary":"Daily Angel Number","description":"Compute today's personal angel number from date (digit-sum reduced to single digit). Optional `?date=YYYY-MM-DD` query.","operationId":"esoteric_angel-numbers_today_get","x-quality":"green","x-source":"Cross-referenced popular sources: Judy Hall \"The Crystal Bible\", Joanne Sacred Scribes / Doreen Virtue legacy (angel numbers), Carl Jung \"Man and His Symbols\", Tony Crisp \"Dream Dictionary\".","security":[{"ApiKeyAuth":[]}],"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X GET https://api.astroway.info/v1/esoteric/angel-numbers/today \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/esoteric/angel-numbers/today', {\n  method: 'GET',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.get(\n    'https://api.astroway.info/v1/esoteric/angel-numbers/today',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->get('esoteric/angel-numbers/today', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"date":{"type":"string","nullable":true},"dailySum":{"type":"number","nullable":true},"reducedTo":{"type":"number","nullable":true},"meaning":{"type":"object","properties":{"shortMeaning":{"type":"string","nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"date":"2026-05-04","dailySum":19,"reducedTo":1,"meaning":{"shortMeaning":"new beginnings, leadership"}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/esoteric/dreams":{"get":{"tags":["Esoteric"],"summary":"Dream Symbol Dictionary","description":"Full dream symbol dictionary with category, element, archetype, common and shadow meanings, and recurring-dream readings.","operationId":"esoteric_dreams_get","x-quality":"green","x-source":"Cross-referenced popular sources: Judy Hall \"The Crystal Bible\", Joanne Sacred Scribes / Doreen Virtue legacy (angel numbers), Carl Jung \"Man and His Symbols\", Tony Crisp \"Dream Dictionary\".","security":[{"ApiKeyAuth":[]}],"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X GET https://api.astroway.info/v1/esoteric/dreams \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/esoteric/dreams', {\n  method: 'GET',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.get(\n    'https://api.astroway.info/v1/esoteric/dreams',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->get('esoteric/dreams', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"keyword":{"type":"string","nullable":true},"category":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"archetype":{"type":"string","nullable":true},"commonMeaning":{"type":"string","nullable":true},"shadowMeaning":{"type":"string","nullable":true},"recurringIfRepeated":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"count":{"type":"number","nullable":true}}}}},"example":{"ok":true,"data":{"items":[{"keyword":"snake","category":"animal","element":"earth","archetype":"transformation, kundalini, hidden wisdom","commonMeaning":"transformation, healing, hidden truths surfacing","shadowMeaning":"betrayal, perceived threat, repressed sexuality","recurringIfRepeated":"an unintegrated transformation theme demanding attention"}],"count":72}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/esoteric/dreams/symbol/{keyword}":{"get":{"tags":["Esoteric"],"summary":"Dream Symbol Lookup","description":"Look up a dream symbol by keyword. Exact match if available, otherwise partial substring matches.","operationId":"esoteric_dreams_symbol_{keyword}_get","x-quality":"green","x-source":"Cross-referenced popular sources: Judy Hall \"The Crystal Bible\", Joanne Sacred Scribes / Doreen Virtue legacy (angel numbers), Carl Jung \"Man and His Symbols\", Tony Crisp \"Dream Dictionary\".","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"keyword","in":"path","required":true,"description":"Dream symbol to look up.","schema":{"type":"string"},"example":"water"},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X GET https://api.astroway.info/v1/esoteric/dreams/symbol/{keyword} \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/esoteric/dreams/symbol/{keyword}', {\n  method: 'GET',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.get(\n    'https://api.astroway.info/v1/esoteric/dreams/symbol/{keyword}',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->get('esoteric/dreams/symbol/{keyword}', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"matched":{"type":"string","nullable":true},"keyword":{"type":"string","nullable":true},"category":{"type":"string","nullable":true},"archetype":{"type":"string","nullable":true},"commonMeaning":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"matched":"exact","keyword":"snake","category":"animal","archetype":"transformation, kundalini, hidden wisdom","commonMeaning":"transformation, healing, hidden truths surfacing"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}}}},"/esoteric/dreams/decode":{"post":{"tags":["Esoteric"],"summary":"Decode Dream Text","description":"Scan dream narrative text for known symbols. Returns matched symbols with their meanings (recurring or single-event).","operationId":"esoteric_dreams_decode","x-quality":"green","x-source":"Cross-referenced popular sources: Judy Hall \"The Crystal Bible\", Joanne Sacred Scribes / Doreen Virtue legacy (angel numbers), Carl Jung \"Man and His Symbols\", Tony Crisp \"Dream Dictionary\".","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EsotericDreamDecodeBody"},"example":{"text":"I was flying over a dark forest with a wolf running below","recurring":false}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/esoteric/dreams/decode \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"text\": \"I was flying over a dark forest with a wolf running below\", \"recurring\": false }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/esoteric/dreams/decode', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"text\": \"I was flying over a dark forest with a wolf running below\",\n    \"recurring\": false\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/esoteric/dreams/decode',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'text': \"I was flying over a dark forest with a wolf running below\",\n      'recurring': False\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('esoteric/dreams/decode', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'text' => 'I was flying over a dark forest with a wolf running below',\n        'recurring' => false,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"text":{"type":"string","nullable":true},"symbolsFound":{"type":"number","nullable":true},"symbols":{"type":"array","items":{"type":"object","properties":{"keyword":{"type":"string","nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"suggestion":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"text":"...","symbolsFound":3,"symbols":[{"keyword":"flying","meaning":"freedom, possibility, transcendence"},{"keyword":"forest","meaning":"unconscious exploration, mystery"},{"keyword":"wolf","meaning":"authentic instinct, loyalty"}],"suggestion":"Integrate 3 symbols within emotional context of the dream."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/esoteric/dreams/by-element/{element}":{"get":{"tags":["Esoteric"],"summary":"Dream Symbols by Element","description":"Dream symbols indexed by element (fire / earth / air / water / spirit).","operationId":"esoteric_dreams_by-element_{element}_get","x-quality":"green","x-source":"Cross-referenced popular sources: Judy Hall \"The Crystal Bible\", Joanne Sacred Scribes / Doreen Virtue legacy (angel numbers), Carl Jung \"Man and His Symbols\", Tony Crisp \"Dream Dictionary\".","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"element","in":"path","required":true,"description":"Elemental grouping.","schema":{"type":"string","enum":["fire","earth","air","water","spirit"]},"example":"water"},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X GET https://api.astroway.info/v1/esoteric/dreams/by-element/{element} \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/esoteric/dreams/by-element/{element}', {\n  method: 'GET',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.get(\n    'https://api.astroway.info/v1/esoteric/dreams/by-element/{element}',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->get('esoteric/dreams/by-element/{element}', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"element":{"type":"string","nullable":true},"items":{"type":"array","items":{"type":"object","properties":{"keyword":{"type":"string","nullable":true},"category":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"archetype":{"type":"string","nullable":true},"commonMeaning":{"type":"string","nullable":true},"shadowMeaning":{"type":"string","nullable":true},"recurringIfRepeated":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"count":{"type":"number","nullable":true}}}}},"example":{"ok":true,"data":{"element":"water","items":[{"keyword":"cat","category":"animal","element":"water","archetype":"mystery, feminine intuition, independence","commonMeaning":"intuition, independence, feminine power","shadowMeaning":"aloofness, manipulation","recurringIfRepeated":"reclaim independence and intuition"}],"count":17}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}}}},"/esoteric/dreams/recurring-themes":{"get":{"tags":["Esoteric"],"summary":"Recurring Dream Themes","description":"Catalogue of common recurring dream themes (falling, naked in public, losing teeth, being chased) with universal psychological meanings.","operationId":"esoteric_dreams_recurring-themes_get","x-quality":"green","x-source":"Cross-referenced popular sources: Judy Hall \"The Crystal Bible\", Joanne Sacred Scribes / Doreen Virtue legacy (angel numbers), Carl Jung \"Man and His Symbols\", Tony Crisp \"Dream Dictionary\".","security":[{"ApiKeyAuth":[]}],"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X GET https://api.astroway.info/v1/esoteric/dreams/recurring-themes \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/esoteric/dreams/recurring-themes', {\n  method: 'GET',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.get(\n    'https://api.astroway.info/v1/esoteric/dreams/recurring-themes',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->get('esoteric/dreams/recurring-themes', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"theme":{"type":"string","nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"count":{"type":"number","nullable":true}}}}},"example":{"ok":true,"data":{"items":[{"theme":"falling","meaning":"control issue / surrender required"}],"count":10}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/numerology/pythagorean/life-path":{"post":{"tags":["Numerology: Pythagorean"],"summary":"Life Path Number (pythagorean)","description":"Calculate the Life Path number from birth date (year + month + day, reduced). Numerology: Pythagorean system.","operationId":"numerology_pythagorean_life-path","x-quality":"green","x-source":"Standard Greek-Pythagorean A=1..I=9 (modern Latin alphabet adaptation; ubiquitous across Hans Decoz, Dan Millman, ChaldeanNumerology.com).","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NumerologyNameDate"},"example":{"name":"John Smith","date":"1990-05-15"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/numerology/pythagorean/life-path \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"name\": \"John Smith\", \"date\": \"1990-05-15\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/numerology/pythagorean/life-path', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"name\": \"John Smith\",\n    \"date\": \"1990-05-15\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/numerology/pythagorean/life-path',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'name': \"John Smith\",\n      'date': \"1990-05-15\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('numerology/pythagorean/life-path', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'name' => 'John Smith',\n        'date' => '1990-05-15',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"date":{"type":"string","nullable":true},"lifePath":{"type":"object","properties":{"raw":{"type":"number","nullable":true},"reduced":{"type":"number","nullable":true},"isMaster":{"type":"boolean","nullable":true},"steps":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"meaning":{"type":"object","properties":{"number":{"type":"number","nullable":true},"archetype":{"type":"string","nullable":true},"strengths":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"shortRead":{"type":"string","nullable":true}},"nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"pythagorean","name":"John Smith","date":"1990-05-15","lifePath":{"raw":30,"reduced":3,"isMaster":false,"steps":[30,3],"meaning":{"number":3,"archetype":"The Communicator","strengths":["expression"],"shortRead":"creative communicator..."}}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/numerology/pythagorean/expression":{"post":{"tags":["Numerology: Pythagorean"],"summary":"Expression / Destiny (pythagorean)","description":"Calculate the Expression (Destiny) number from full birth name letters (all letters, reduced). Numerology: Pythagorean system.","operationId":"numerology_pythagorean_expression","x-quality":"green","x-source":"Standard Greek-Pythagorean A=1..I=9 (modern Latin alphabet adaptation; ubiquitous across Hans Decoz, Dan Millman, ChaldeanNumerology.com).","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NumerologyNameDate"},"example":{"name":"John Smith","date":"1990-05-15"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/numerology/pythagorean/expression \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"name\": \"John Smith\", \"date\": \"1990-05-15\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/numerology/pythagorean/expression', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"name\": \"John Smith\",\n    \"date\": \"1990-05-15\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/numerology/pythagorean/expression',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'name': \"John Smith\",\n      'date': \"1990-05-15\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('numerology/pythagorean/expression', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'name' => 'John Smith',\n        'date' => '1990-05-15',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"date":{"type":"string","nullable":true},"expression":{"type":"object","properties":{"raw":{"type":"number","nullable":true},"reduced":{"type":"number","nullable":true},"isMaster":{"type":"boolean","nullable":true},"steps":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"meaning":{"type":"object","properties":{"number":{"type":"number","nullable":true},"archetype":{"type":"string","nullable":true},"strengths":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"shortRead":{"type":"string","nullable":true}},"nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"pythagorean","name":"John Smith","date":"1990-05-15","expression":{"raw":30,"reduced":3,"isMaster":false,"steps":[30,3],"meaning":{"number":3,"archetype":"The Communicator","strengths":["expression"],"shortRead":"creative communicator..."}}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/numerology/pythagorean/soul-urge":{"post":{"tags":["Numerology: Pythagorean"],"summary":"Soul Urge / Heart's Desire (pythagorean)","description":"Calculate the Soul Urge number from the vowels of the full birth name. Numerology: Pythagorean system.","operationId":"numerology_pythagorean_soul-urge","x-quality":"green","x-source":"Standard Greek-Pythagorean A=1..I=9 (modern Latin alphabet adaptation; ubiquitous across Hans Decoz, Dan Millman, ChaldeanNumerology.com).","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NumerologyNameDate"},"example":{"name":"John Smith","date":"1990-05-15"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/numerology/pythagorean/soul-urge \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"name\": \"John Smith\", \"date\": \"1990-05-15\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/numerology/pythagorean/soul-urge', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"name\": \"John Smith\",\n    \"date\": \"1990-05-15\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/numerology/pythagorean/soul-urge',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'name': \"John Smith\",\n      'date': \"1990-05-15\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('numerology/pythagorean/soul-urge', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'name' => 'John Smith',\n        'date' => '1990-05-15',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"date":{"type":"string","nullable":true},"soulUrge":{"type":"object","properties":{"raw":{"type":"number","nullable":true},"reduced":{"type":"number","nullable":true},"isMaster":{"type":"boolean","nullable":true},"steps":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"meaning":{"type":"object","properties":{"number":{"type":"number","nullable":true},"archetype":{"type":"string","nullable":true},"strengths":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"shortRead":{"type":"string","nullable":true}},"nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"pythagorean","name":"John Smith","date":"1990-05-15","soulUrge":{"raw":30,"reduced":3,"isMaster":false,"steps":[30,3],"meaning":{"number":3,"archetype":"The Communicator","strengths":["expression"],"shortRead":"creative communicator..."}}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/numerology/pythagorean/personality":{"post":{"tags":["Numerology: Pythagorean"],"summary":"Personality (pythagorean)","description":"Calculate the Personality number from the consonants of the full birth name. Numerology: Pythagorean system.","operationId":"numerology_pythagorean_personality","x-quality":"green","x-source":"Standard Greek-Pythagorean A=1..I=9 (modern Latin alphabet adaptation; ubiquitous across Hans Decoz, Dan Millman, ChaldeanNumerology.com).","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NumerologyNameDate"},"example":{"name":"John Smith","date":"1990-05-15"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/numerology/pythagorean/personality \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"name\": \"John Smith\", \"date\": \"1990-05-15\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/numerology/pythagorean/personality', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"name\": \"John Smith\",\n    \"date\": \"1990-05-15\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/numerology/pythagorean/personality',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'name': \"John Smith\",\n      'date': \"1990-05-15\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('numerology/pythagorean/personality', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'name' => 'John Smith',\n        'date' => '1990-05-15',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"date":{"type":"string","nullable":true},"personality":{"type":"object","properties":{"raw":{"type":"number","nullable":true},"reduced":{"type":"number","nullable":true},"isMaster":{"type":"boolean","nullable":true},"steps":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"meaning":{"type":"object","properties":{"number":{"type":"number","nullable":true},"archetype":{"type":"string","nullable":true},"strengths":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"shortRead":{"type":"string","nullable":true}},"nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"pythagorean","name":"John Smith","date":"1990-05-15","personality":{"raw":30,"reduced":3,"isMaster":false,"steps":[30,3],"meaning":{"number":3,"archetype":"The Communicator","strengths":["expression"],"shortRead":"creative communicator..."}}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/numerology/pythagorean/birthday":{"post":{"tags":["Numerology: Pythagorean"],"summary":"Birthday (pythagorean)","description":"Calculate the Birthday number from the day-of-birth digit. Numerology: Pythagorean system.","operationId":"numerology_pythagorean_birthday","x-quality":"green","x-source":"Standard Greek-Pythagorean A=1..I=9 (modern Latin alphabet adaptation; ubiquitous across Hans Decoz, Dan Millman, ChaldeanNumerology.com).","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NumerologyNameDate"},"example":{"name":"John Smith","date":"1990-05-15"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/numerology/pythagorean/birthday \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"name\": \"John Smith\", \"date\": \"1990-05-15\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/numerology/pythagorean/birthday', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"name\": \"John Smith\",\n    \"date\": \"1990-05-15\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/numerology/pythagorean/birthday',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'name': \"John Smith\",\n      'date': \"1990-05-15\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('numerology/pythagorean/birthday', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'name' => 'John Smith',\n        'date' => '1990-05-15',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"date":{"type":"string","nullable":true},"birthday":{"type":"object","properties":{"raw":{"type":"number","nullable":true},"reduced":{"type":"number","nullable":true},"isMaster":{"type":"boolean","nullable":true},"steps":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"meaning":{"type":"object","properties":{"number":{"type":"number","nullable":true},"archetype":{"type":"string","nullable":true},"strengths":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"shortRead":{"type":"string","nullable":true}},"nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"pythagorean","name":"John Smith","date":"1990-05-15","birthday":{"raw":30,"reduced":3,"isMaster":false,"steps":[30,3],"meaning":{"number":3,"archetype":"The Communicator","strengths":["expression"],"shortRead":"creative communicator..."}}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/numerology/pythagorean/maturity":{"post":{"tags":["Numerology: Pythagorean"],"summary":"Maturity (pythagorean)","description":"Calculate the Maturity number: sum of Life Path and Expression, activates around age 35. Numerology: Pythagorean system.","operationId":"numerology_pythagorean_maturity","x-quality":"green","x-source":"Standard Greek-Pythagorean A=1..I=9 (modern Latin alphabet adaptation; ubiquitous across Hans Decoz, Dan Millman, ChaldeanNumerology.com).","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NumerologyNameDate"},"example":{"name":"John Smith","date":"1990-05-15"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/numerology/pythagorean/maturity \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"name\": \"John Smith\", \"date\": \"1990-05-15\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/numerology/pythagorean/maturity', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"name\": \"John Smith\",\n    \"date\": \"1990-05-15\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/numerology/pythagorean/maturity',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'name': \"John Smith\",\n      'date': \"1990-05-15\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('numerology/pythagorean/maturity', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'name' => 'John Smith',\n        'date' => '1990-05-15',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"date":{"type":"string","nullable":true},"maturity":{"type":"object","properties":{"raw":{"type":"number","nullable":true},"reduced":{"type":"number","nullable":true},"isMaster":{"type":"boolean","nullable":true},"steps":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"meaning":{"type":"object","properties":{"number":{"type":"number","nullable":true},"archetype":{"type":"string","nullable":true},"strengths":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"shortRead":{"type":"string","nullable":true}},"nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"pythagorean","name":"John Smith","date":"1990-05-15","maturity":{"raw":30,"reduced":3,"isMaster":false,"steps":[30,3],"meaning":{"number":3,"archetype":"The Communicator","strengths":["expression"],"shortRead":"creative communicator..."}}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/numerology/pythagorean/balance":{"post":{"tags":["Numerology: Pythagorean"],"summary":"Balance (pythagorean)","description":"Calculate the Balance number from initials of each part of the full name. Numerology: Pythagorean system.","operationId":"numerology_pythagorean_balance","x-quality":"green","x-source":"Standard Greek-Pythagorean A=1..I=9 (modern Latin alphabet adaptation; ubiquitous across Hans Decoz, Dan Millman, ChaldeanNumerology.com).","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NumerologyNameDate"},"example":{"name":"John Smith","date":"1990-05-15"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/numerology/pythagorean/balance \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"name\": \"John Smith\", \"date\": \"1990-05-15\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/numerology/pythagorean/balance', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"name\": \"John Smith\",\n    \"date\": \"1990-05-15\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/numerology/pythagorean/balance',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'name': \"John Smith\",\n      'date': \"1990-05-15\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('numerology/pythagorean/balance', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'name' => 'John Smith',\n        'date' => '1990-05-15',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"date":{"type":"string","nullable":true},"balance":{"type":"object","properties":{"raw":{"type":"number","nullable":true},"reduced":{"type":"number","nullable":true},"isMaster":{"type":"boolean","nullable":true},"steps":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"meaning":{"type":"object","properties":{"number":{"type":"number","nullable":true},"archetype":{"type":"string","nullable":true},"strengths":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"shortRead":{"type":"string","nullable":true}},"nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"pythagorean","name":"John Smith","date":"1990-05-15","balance":{"raw":30,"reduced":3,"isMaster":false,"steps":[30,3],"meaning":{"number":3,"archetype":"The Communicator","strengths":["expression"],"shortRead":"creative communicator..."}}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/numerology/pythagorean/challenge":{"post":{"tags":["Numerology: Pythagorean"],"summary":"Challenge Cycles (pythagorean)","description":"Calculate four Challenge cycles: life-area difficulties to master, derived from birth date components. Numerology: Pythagorean system.","operationId":"numerology_pythagorean_challenge","x-quality":"green","x-source":"Standard Greek-Pythagorean A=1..I=9 (modern Latin alphabet adaptation; ubiquitous across Hans Decoz, Dan Millman, ChaldeanNumerology.com).","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NumerologyNameDate"},"example":{"name":"John Smith","date":"1990-05-15"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/numerology/pythagorean/challenge \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"name\": \"John Smith\", \"date\": \"1990-05-15\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/numerology/pythagorean/challenge', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"name\": \"John Smith\",\n    \"date\": \"1990-05-15\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/numerology/pythagorean/challenge',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'name': \"John Smith\",\n      'date': \"1990-05-15\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('numerology/pythagorean/challenge', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'name' => 'John Smith',\n        'date' => '1990-05-15',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"challenges":{"type":"object","properties":{"first":{"type":"object","properties":{"reduced":{"type":"number","nullable":true},"meaning":{"type":"object","properties":{"archetype":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"second":{"type":"object","properties":{"reduced":{"type":"number","nullable":true}},"nullable":true},"third":{"type":"object","properties":{"reduced":{"type":"number","nullable":true}},"nullable":true},"fourth":{"type":"object","properties":{"reduced":{"type":"number","nullable":true}},"nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"pythagorean","challenges":{"first":{"reduced":4,"meaning":{"archetype":"The Builder"}},"second":{"reduced":1},"third":{"reduced":3},"fourth":{"reduced":5}}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/numerology/pythagorean/pinnacles":{"post":{"tags":["Numerology: Pythagorean"],"summary":"Pinnacle Cycles (pythagorean)","description":"Calculate four Pinnacle cycles with their age boundaries: life chapters of opportunity. Numerology: Pythagorean system.","operationId":"numerology_pythagorean_pinnacles","x-quality":"green","x-source":"Standard Greek-Pythagorean A=1..I=9 (modern Latin alphabet adaptation; ubiquitous across Hans Decoz, Dan Millman, ChaldeanNumerology.com).","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NumerologyNameDate"},"example":{"name":"John Smith","date":"1990-05-15"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/numerology/pythagorean/pinnacles \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"name\": \"John Smith\", \"date\": \"1990-05-15\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/numerology/pythagorean/pinnacles', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"name\": \"John Smith\",\n    \"date\": \"1990-05-15\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/numerology/pythagorean/pinnacles',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'name': \"John Smith\",\n      'date': \"1990-05-15\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('numerology/pythagorean/pinnacles', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'name' => 'John Smith',\n        'date' => '1990-05-15',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"pinnacles":{"type":"object","properties":{"first":{"type":"object","properties":{"reduced":{"type":"number","nullable":true},"endsAtAge":{"type":"number","nullable":true}},"nullable":true},"second":{"type":"object","properties":{"reduced":{"type":"number","nullable":true},"endsAtAge":{"type":"number","nullable":true}},"nullable":true},"third":{"type":"object","properties":{"reduced":{"type":"number","nullable":true},"endsAtAge":{"type":"number","nullable":true}},"nullable":true},"fourth":{"type":"object","properties":{"reduced":{"type":"number","nullable":true},"endsAtAge":{"type":"number","nullable":true}},"nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"pythagorean","pinnacles":{"first":{"reduced":7,"endsAtAge":30},"second":{"reduced":4,"endsAtAge":39},"third":{"reduced":3,"endsAtAge":48},"fourth":{"reduced":8,"endsAtAge":57}}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/numerology/pythagorean/personal-year":{"post":{"tags":["Numerology: Pythagorean"],"summary":"Personal Year (pythagorean)","description":"Calculate the Personal Year number for a given calendar year: the 9-year cycle of personal evolution. Numerology: Pythagorean system.","operationId":"numerology_pythagorean_personal-year","x-quality":"green","x-source":"Standard Greek-Pythagorean A=1..I=9 (modern Latin alphabet adaptation; ubiquitous across Hans Decoz, Dan Millman, ChaldeanNumerology.com).","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NumerologyPersonalYear"},"example":{"name":"John Smith","date":"1990-05-15","year":2026}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/numerology/pythagorean/personal-year \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"name\": \"John Smith\", \"date\": \"1990-05-15\", \"year\": 2026 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/numerology/pythagorean/personal-year', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"name\": \"John Smith\",\n    \"date\": \"1990-05-15\",\n    \"year\": 2026\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/numerology/pythagorean/personal-year',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'name': \"John Smith\",\n      'date': \"1990-05-15\",\n      'year': 2026\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('numerology/pythagorean/personal-year', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'name' => 'John Smith',\n        'date' => '1990-05-15',\n        'year' => 2026,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"date":{"type":"string","nullable":true},"personalYear":{"type":"object","properties":{"raw":{"type":"number","nullable":true},"reduced":{"type":"number","nullable":true},"isMaster":{"type":"boolean","nullable":true},"steps":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"meaning":{"type":"object","properties":{"number":{"type":"number","nullable":true},"archetype":{"type":"string","nullable":true},"strengths":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"shortRead":{"type":"string","nullable":true}},"nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"pythagorean","name":"John Smith","date":"1990-05-15","personalYear":{"raw":30,"reduced":3,"isMaster":false,"steps":[30,3],"meaning":{"number":3,"archetype":"The Communicator","strengths":["expression"],"shortRead":"creative communicator..."}}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/numerology/pythagorean/chart":{"post":{"tags":["Numerology: Pythagorean"],"summary":"Core Numbers Chart (pythagorean)","description":"The six core numbers in one call: Life Path, Expression, Soul Urge, Personality, Birthday and Personal Year (`year` defaults to the current year), each with its meaning. 20 credits instead of 60 for six single calls. Every number carries `meaning` (English) and `meaningLocalized` in the requested language (`translated: false` with the English text while a language's strings are on their way). Numerology: Pythagorean system.","operationId":"numerology_pythagorean_chart","x-quality":"green","x-source":"Standard Greek-Pythagorean A=1..I=9 (modern Latin alphabet adaptation; ubiquitous across Hans Decoz, Dan Millman, ChaldeanNumerology.com).","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NumerologyPersonalYear"},"example":{"name":"John Smith","date":"1990-05-15","year":2026}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/numerology/pythagorean/chart \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"name\": \"John Smith\", \"date\": \"1990-05-15\", \"year\": 2026 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/numerology/pythagorean/chart', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"name\": \"John Smith\",\n    \"date\": \"1990-05-15\",\n    \"year\": 2026\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/numerology/pythagorean/chart',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'name': \"John Smith\",\n      'date': \"1990-05-15\",\n      'year': 2026\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('numerology/pythagorean/chart', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'name' => 'John Smith',\n        'date' => '1990-05-15',\n        'year' => 2026,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"date":{"type":"string","nullable":true},"year":{"type":"number","nullable":true},"lifePath":{"type":"object","properties":{"raw":{"type":"number","nullable":true},"reduced":{"type":"number","nullable":true},"isMaster":{"type":"boolean","nullable":true},"steps":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"meaning":{"type":"object","properties":{"number":{"type":"number","nullable":true},"archetype":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"expression":{"type":"object","properties":{"raw":{"type":"number","nullable":true},"reduced":{"type":"number","nullable":true},"isMaster":{"type":"boolean","nullable":true},"steps":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"meaning":{"type":"object","properties":{"number":{"type":"number","nullable":true},"archetype":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"soulUrge":{"type":"object","properties":{"raw":{"type":"number","nullable":true},"reduced":{"type":"number","nullable":true},"isMaster":{"type":"boolean","nullable":true},"steps":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"meaning":{"type":"object","properties":{"number":{"type":"number","nullable":true},"archetype":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"personality":{"type":"object","properties":{"raw":{"type":"number","nullable":true},"reduced":{"type":"number","nullable":true},"isMaster":{"type":"boolean","nullable":true},"steps":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"meaning":{"type":"object","properties":{"number":{"type":"number","nullable":true},"archetype":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"birthday":{"type":"object","properties":{"raw":{"type":"number","nullable":true},"reduced":{"type":"number","nullable":true},"isMaster":{"type":"boolean","nullable":true},"steps":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"meaning":{"type":"object","properties":{"number":{"type":"number","nullable":true},"archetype":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"personalYear":{"type":"object","properties":{"raw":{"type":"number","nullable":true},"reduced":{"type":"number","nullable":true},"isMaster":{"type":"boolean","nullable":true},"steps":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"meaning":{"type":"object","properties":{"number":{"type":"number","nullable":true},"archetype":{"type":"string","nullable":true}},"nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"pythagorean","name":"John Smith","date":"1990-05-15","year":2026,"lifePath":{"raw":12,"reduced":3,"isMaster":false,"steps":[12,3],"meaning":{"number":3,"archetype":"The Communicator"}},"expression":{"raw":44,"reduced":8,"isMaster":false,"steps":[44,8],"meaning":{"number":8,"archetype":"The Executive"}},"soulUrge":{"raw":15,"reduced":6,"isMaster":false,"steps":[15,6],"meaning":{"number":6,"archetype":"The Nurturer"}},"personality":{"raw":29,"reduced":11,"isMaster":true,"steps":[29,11],"meaning":{"number":11,"archetype":"The Master Intuitive"}},"birthday":{"raw":15,"reduced":6,"isMaster":false,"steps":[15,6],"meaning":{"number":6,"archetype":"The Nurturer"}},"personalYear":{"raw":12,"reduced":3,"isMaster":false,"steps":[12,3],"meaning":{"number":3,"archetype":"The Communicator"}}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/numerology/chaldean/life-path":{"post":{"tags":["Numerology: Chaldean"],"summary":"Life Path Number (chaldean)","description":"Calculate the Life Path number from birth date (year + month + day, reduced). Numerology: Chaldean system.","operationId":"numerology_chaldean_life-path","x-quality":"green","x-source":"Cheiro \"Cheiro's Book of Numbers\" 1908 (PD); 1-8 only, 9 reserved as sacred.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NumerologyNameDate"},"example":{"name":"John Smith","date":"1990-05-15"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/numerology/chaldean/life-path \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"name\": \"John Smith\", \"date\": \"1990-05-15\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/numerology/chaldean/life-path', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"name\": \"John Smith\",\n    \"date\": \"1990-05-15\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/numerology/chaldean/life-path',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'name': \"John Smith\",\n      'date': \"1990-05-15\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('numerology/chaldean/life-path', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'name' => 'John Smith',\n        'date' => '1990-05-15',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"date":{"type":"string","nullable":true},"lifePath":{"type":"object","properties":{"raw":{"type":"number","nullable":true},"reduced":{"type":"number","nullable":true},"isMaster":{"type":"boolean","nullable":true},"steps":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"meaning":{"type":"object","properties":{"number":{"type":"number","nullable":true},"archetype":{"type":"string","nullable":true},"strengths":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"shortRead":{"type":"string","nullable":true}},"nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"pythagorean","name":"John Smith","date":"1990-05-15","lifePath":{"raw":30,"reduced":3,"isMaster":false,"steps":[30,3],"meaning":{"number":3,"archetype":"The Communicator","strengths":["expression"],"shortRead":"creative communicator..."}}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/numerology/chaldean/expression":{"post":{"tags":["Numerology: Chaldean"],"summary":"Expression / Destiny (chaldean)","description":"Calculate the Expression (Destiny) number from full birth name letters (all letters, reduced). Numerology: Chaldean system.","operationId":"numerology_chaldean_expression","x-quality":"green","x-source":"Cheiro \"Cheiro's Book of Numbers\" 1908 (PD); 1-8 only, 9 reserved as sacred.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NumerologyNameDate"},"example":{"name":"John Smith","date":"1990-05-15"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/numerology/chaldean/expression \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"name\": \"John Smith\", \"date\": \"1990-05-15\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/numerology/chaldean/expression', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"name\": \"John Smith\",\n    \"date\": \"1990-05-15\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/numerology/chaldean/expression',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'name': \"John Smith\",\n      'date': \"1990-05-15\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('numerology/chaldean/expression', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'name' => 'John Smith',\n        'date' => '1990-05-15',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"date":{"type":"string","nullable":true},"expression":{"type":"object","properties":{"raw":{"type":"number","nullable":true},"reduced":{"type":"number","nullable":true},"isMaster":{"type":"boolean","nullable":true},"steps":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"meaning":{"type":"object","properties":{"number":{"type":"number","nullable":true},"archetype":{"type":"string","nullable":true},"strengths":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"shortRead":{"type":"string","nullable":true}},"nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"pythagorean","name":"John Smith","date":"1990-05-15","expression":{"raw":30,"reduced":3,"isMaster":false,"steps":[30,3],"meaning":{"number":3,"archetype":"The Communicator","strengths":["expression"],"shortRead":"creative communicator..."}}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/numerology/chaldean/soul-urge":{"post":{"tags":["Numerology: Chaldean"],"summary":"Soul Urge / Heart's Desire (chaldean)","description":"Calculate the Soul Urge number from the vowels of the full birth name. Numerology: Chaldean system.","operationId":"numerology_chaldean_soul-urge","x-quality":"green","x-source":"Cheiro \"Cheiro's Book of Numbers\" 1908 (PD); 1-8 only, 9 reserved as sacred.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NumerologyNameDate"},"example":{"name":"John Smith","date":"1990-05-15"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/numerology/chaldean/soul-urge \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"name\": \"John Smith\", \"date\": \"1990-05-15\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/numerology/chaldean/soul-urge', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"name\": \"John Smith\",\n    \"date\": \"1990-05-15\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/numerology/chaldean/soul-urge',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'name': \"John Smith\",\n      'date': \"1990-05-15\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('numerology/chaldean/soul-urge', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'name' => 'John Smith',\n        'date' => '1990-05-15',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"date":{"type":"string","nullable":true},"soulUrge":{"type":"object","properties":{"raw":{"type":"number","nullable":true},"reduced":{"type":"number","nullable":true},"isMaster":{"type":"boolean","nullable":true},"steps":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"meaning":{"type":"object","properties":{"number":{"type":"number","nullable":true},"archetype":{"type":"string","nullable":true},"strengths":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"shortRead":{"type":"string","nullable":true}},"nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"pythagorean","name":"John Smith","date":"1990-05-15","soulUrge":{"raw":30,"reduced":3,"isMaster":false,"steps":[30,3],"meaning":{"number":3,"archetype":"The Communicator","strengths":["expression"],"shortRead":"creative communicator..."}}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/numerology/chaldean/personality":{"post":{"tags":["Numerology: Chaldean"],"summary":"Personality (chaldean)","description":"Calculate the Personality number from the consonants of the full birth name. Numerology: Chaldean system.","operationId":"numerology_chaldean_personality","x-quality":"green","x-source":"Cheiro \"Cheiro's Book of Numbers\" 1908 (PD); 1-8 only, 9 reserved as sacred.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NumerologyNameDate"},"example":{"name":"John Smith","date":"1990-05-15"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/numerology/chaldean/personality \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"name\": \"John Smith\", \"date\": \"1990-05-15\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/numerology/chaldean/personality', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"name\": \"John Smith\",\n    \"date\": \"1990-05-15\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/numerology/chaldean/personality',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'name': \"John Smith\",\n      'date': \"1990-05-15\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('numerology/chaldean/personality', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'name' => 'John Smith',\n        'date' => '1990-05-15',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"date":{"type":"string","nullable":true},"personality":{"type":"object","properties":{"raw":{"type":"number","nullable":true},"reduced":{"type":"number","nullable":true},"isMaster":{"type":"boolean","nullable":true},"steps":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"meaning":{"type":"object","properties":{"number":{"type":"number","nullable":true},"archetype":{"type":"string","nullable":true},"strengths":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"shortRead":{"type":"string","nullable":true}},"nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"pythagorean","name":"John Smith","date":"1990-05-15","personality":{"raw":30,"reduced":3,"isMaster":false,"steps":[30,3],"meaning":{"number":3,"archetype":"The Communicator","strengths":["expression"],"shortRead":"creative communicator..."}}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/numerology/chaldean/birthday":{"post":{"tags":["Numerology: Chaldean"],"summary":"Birthday (chaldean)","description":"Calculate the Birthday number from the day-of-birth digit. Numerology: Chaldean system.","operationId":"numerology_chaldean_birthday","x-quality":"green","x-source":"Cheiro \"Cheiro's Book of Numbers\" 1908 (PD); 1-8 only, 9 reserved as sacred.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NumerologyNameDate"},"example":{"name":"John Smith","date":"1990-05-15"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/numerology/chaldean/birthday \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"name\": \"John Smith\", \"date\": \"1990-05-15\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/numerology/chaldean/birthday', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"name\": \"John Smith\",\n    \"date\": \"1990-05-15\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/numerology/chaldean/birthday',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'name': \"John Smith\",\n      'date': \"1990-05-15\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('numerology/chaldean/birthday', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'name' => 'John Smith',\n        'date' => '1990-05-15',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"date":{"type":"string","nullable":true},"birthday":{"type":"object","properties":{"raw":{"type":"number","nullable":true},"reduced":{"type":"number","nullable":true},"isMaster":{"type":"boolean","nullable":true},"steps":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"meaning":{"type":"object","properties":{"number":{"type":"number","nullable":true},"archetype":{"type":"string","nullable":true},"strengths":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"shortRead":{"type":"string","nullable":true}},"nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"pythagorean","name":"John Smith","date":"1990-05-15","birthday":{"raw":30,"reduced":3,"isMaster":false,"steps":[30,3],"meaning":{"number":3,"archetype":"The Communicator","strengths":["expression"],"shortRead":"creative communicator..."}}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/numerology/chaldean/maturity":{"post":{"tags":["Numerology: Chaldean"],"summary":"Maturity (chaldean)","description":"Calculate the Maturity number: sum of Life Path and Expression, activates around age 35. Numerology: Chaldean system.","operationId":"numerology_chaldean_maturity","x-quality":"green","x-source":"Cheiro \"Cheiro's Book of Numbers\" 1908 (PD); 1-8 only, 9 reserved as sacred.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NumerologyNameDate"},"example":{"name":"John Smith","date":"1990-05-15"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/numerology/chaldean/maturity \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"name\": \"John Smith\", \"date\": \"1990-05-15\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/numerology/chaldean/maturity', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"name\": \"John Smith\",\n    \"date\": \"1990-05-15\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/numerology/chaldean/maturity',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'name': \"John Smith\",\n      'date': \"1990-05-15\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('numerology/chaldean/maturity', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'name' => 'John Smith',\n        'date' => '1990-05-15',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"date":{"type":"string","nullable":true},"maturity":{"type":"object","properties":{"raw":{"type":"number","nullable":true},"reduced":{"type":"number","nullable":true},"isMaster":{"type":"boolean","nullable":true},"steps":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"meaning":{"type":"object","properties":{"number":{"type":"number","nullable":true},"archetype":{"type":"string","nullable":true},"strengths":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"shortRead":{"type":"string","nullable":true}},"nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"pythagorean","name":"John Smith","date":"1990-05-15","maturity":{"raw":30,"reduced":3,"isMaster":false,"steps":[30,3],"meaning":{"number":3,"archetype":"The Communicator","strengths":["expression"],"shortRead":"creative communicator..."}}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/numerology/chaldean/balance":{"post":{"tags":["Numerology: Chaldean"],"summary":"Balance (chaldean)","description":"Calculate the Balance number from initials of each part of the full name. Numerology: Chaldean system.","operationId":"numerology_chaldean_balance","x-quality":"green","x-source":"Cheiro \"Cheiro's Book of Numbers\" 1908 (PD); 1-8 only, 9 reserved as sacred.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NumerologyNameDate"},"example":{"name":"John Smith","date":"1990-05-15"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/numerology/chaldean/balance \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"name\": \"John Smith\", \"date\": \"1990-05-15\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/numerology/chaldean/balance', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"name\": \"John Smith\",\n    \"date\": \"1990-05-15\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/numerology/chaldean/balance',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'name': \"John Smith\",\n      'date': \"1990-05-15\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('numerology/chaldean/balance', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'name' => 'John Smith',\n        'date' => '1990-05-15',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"date":{"type":"string","nullable":true},"balance":{"type":"object","properties":{"raw":{"type":"number","nullable":true},"reduced":{"type":"number","nullable":true},"isMaster":{"type":"boolean","nullable":true},"steps":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"meaning":{"type":"object","properties":{"number":{"type":"number","nullable":true},"archetype":{"type":"string","nullable":true},"strengths":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"shortRead":{"type":"string","nullable":true}},"nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"pythagorean","name":"John Smith","date":"1990-05-15","balance":{"raw":30,"reduced":3,"isMaster":false,"steps":[30,3],"meaning":{"number":3,"archetype":"The Communicator","strengths":["expression"],"shortRead":"creative communicator..."}}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/numerology/chaldean/challenge":{"post":{"tags":["Numerology: Chaldean"],"summary":"Challenge Cycles (chaldean)","description":"Calculate four Challenge cycles: life-area difficulties to master, derived from birth date components. Numerology: Chaldean system.","operationId":"numerology_chaldean_challenge","x-quality":"green","x-source":"Cheiro \"Cheiro's Book of Numbers\" 1908 (PD); 1-8 only, 9 reserved as sacred.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NumerologyNameDate"},"example":{"name":"John Smith","date":"1990-05-15"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/numerology/chaldean/challenge \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"name\": \"John Smith\", \"date\": \"1990-05-15\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/numerology/chaldean/challenge', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"name\": \"John Smith\",\n    \"date\": \"1990-05-15\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/numerology/chaldean/challenge',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'name': \"John Smith\",\n      'date': \"1990-05-15\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('numerology/chaldean/challenge', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'name' => 'John Smith',\n        'date' => '1990-05-15',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"challenges":{"type":"object","properties":{"first":{"type":"object","properties":{"reduced":{"type":"number","nullable":true},"meaning":{"type":"object","properties":{"archetype":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"second":{"type":"object","properties":{"reduced":{"type":"number","nullable":true}},"nullable":true},"third":{"type":"object","properties":{"reduced":{"type":"number","nullable":true}},"nullable":true},"fourth":{"type":"object","properties":{"reduced":{"type":"number","nullable":true}},"nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"chaldean","challenges":{"first":{"reduced":4,"meaning":{"archetype":"The Builder"}},"second":{"reduced":1},"third":{"reduced":3},"fourth":{"reduced":5}}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/numerology/chaldean/pinnacles":{"post":{"tags":["Numerology: Chaldean"],"summary":"Pinnacle Cycles (chaldean)","description":"Calculate four Pinnacle cycles with their age boundaries: life chapters of opportunity. Numerology: Chaldean system.","operationId":"numerology_chaldean_pinnacles","x-quality":"green","x-source":"Cheiro \"Cheiro's Book of Numbers\" 1908 (PD); 1-8 only, 9 reserved as sacred.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NumerologyNameDate"},"example":{"name":"John Smith","date":"1990-05-15"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/numerology/chaldean/pinnacles \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"name\": \"John Smith\", \"date\": \"1990-05-15\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/numerology/chaldean/pinnacles', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"name\": \"John Smith\",\n    \"date\": \"1990-05-15\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/numerology/chaldean/pinnacles',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'name': \"John Smith\",\n      'date': \"1990-05-15\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('numerology/chaldean/pinnacles', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'name' => 'John Smith',\n        'date' => '1990-05-15',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"pinnacles":{"type":"object","properties":{"first":{"type":"object","properties":{"reduced":{"type":"number","nullable":true},"endsAtAge":{"type":"number","nullable":true}},"nullable":true},"second":{"type":"object","properties":{"reduced":{"type":"number","nullable":true},"endsAtAge":{"type":"number","nullable":true}},"nullable":true},"third":{"type":"object","properties":{"reduced":{"type":"number","nullable":true},"endsAtAge":{"type":"number","nullable":true}},"nullable":true},"fourth":{"type":"object","properties":{"reduced":{"type":"number","nullable":true},"endsAtAge":{"type":"number","nullable":true}},"nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"chaldean","pinnacles":{"first":{"reduced":7,"endsAtAge":30},"second":{"reduced":4,"endsAtAge":39},"third":{"reduced":3,"endsAtAge":48},"fourth":{"reduced":8,"endsAtAge":57}}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/numerology/chaldean/personal-year":{"post":{"tags":["Numerology: Chaldean"],"summary":"Personal Year (chaldean)","description":"Calculate the Personal Year number for a given calendar year: the 9-year cycle of personal evolution. Numerology: Chaldean system.","operationId":"numerology_chaldean_personal-year","x-quality":"green","x-source":"Cheiro \"Cheiro's Book of Numbers\" 1908 (PD); 1-8 only, 9 reserved as sacred.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NumerologyPersonalYear"},"example":{"name":"John Smith","date":"1990-05-15","year":2026}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/numerology/chaldean/personal-year \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"name\": \"John Smith\", \"date\": \"1990-05-15\", \"year\": 2026 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/numerology/chaldean/personal-year', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"name\": \"John Smith\",\n    \"date\": \"1990-05-15\",\n    \"year\": 2026\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/numerology/chaldean/personal-year',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'name': \"John Smith\",\n      'date': \"1990-05-15\",\n      'year': 2026\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('numerology/chaldean/personal-year', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'name' => 'John Smith',\n        'date' => '1990-05-15',\n        'year' => 2026,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"date":{"type":"string","nullable":true},"personalYear":{"type":"object","properties":{"raw":{"type":"number","nullable":true},"reduced":{"type":"number","nullable":true},"isMaster":{"type":"boolean","nullable":true},"steps":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"meaning":{"type":"object","properties":{"number":{"type":"number","nullable":true},"archetype":{"type":"string","nullable":true},"strengths":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"shortRead":{"type":"string","nullable":true}},"nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"pythagorean","name":"John Smith","date":"1990-05-15","personalYear":{"raw":30,"reduced":3,"isMaster":false,"steps":[30,3],"meaning":{"number":3,"archetype":"The Communicator","strengths":["expression"],"shortRead":"creative communicator..."}}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/numerology/chaldean/chart":{"post":{"tags":["Numerology: Chaldean"],"summary":"Core Numbers Chart (chaldean)","description":"The six core numbers in one call: Life Path, Expression, Soul Urge, Personality, Birthday and Personal Year (`year` defaults to the current year), each with its meaning. 20 credits instead of 60 for six single calls. Every number carries `meaning` (English) and `meaningLocalized` in the requested language (`translated: false` with the English text while a language's strings are on their way). Numerology: Chaldean system.","operationId":"numerology_chaldean_chart","x-quality":"green","x-source":"Cheiro \"Cheiro's Book of Numbers\" 1908 (PD); 1-8 only, 9 reserved as sacred.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NumerologyPersonalYear"},"example":{"name":"John Smith","date":"1990-05-15","year":2026}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/numerology/chaldean/chart \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"name\": \"John Smith\", \"date\": \"1990-05-15\", \"year\": 2026 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/numerology/chaldean/chart', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"name\": \"John Smith\",\n    \"date\": \"1990-05-15\",\n    \"year\": 2026\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/numerology/chaldean/chart',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'name': \"John Smith\",\n      'date': \"1990-05-15\",\n      'year': 2026\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('numerology/chaldean/chart', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'name' => 'John Smith',\n        'date' => '1990-05-15',\n        'year' => 2026,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"date":{"type":"string","nullable":true},"year":{"type":"number","nullable":true},"lifePath":{"type":"object","properties":{"raw":{"type":"number","nullable":true},"reduced":{"type":"number","nullable":true},"isMaster":{"type":"boolean","nullable":true},"steps":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"meaning":{"type":"object","properties":{"number":{"type":"number","nullable":true},"archetype":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"expression":{"type":"object","properties":{"raw":{"type":"number","nullable":true},"reduced":{"type":"number","nullable":true},"isMaster":{"type":"boolean","nullable":true},"steps":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"meaning":{"type":"object","properties":{"number":{"type":"number","nullable":true},"archetype":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"soulUrge":{"type":"object","properties":{"raw":{"type":"number","nullable":true},"reduced":{"type":"number","nullable":true},"isMaster":{"type":"boolean","nullable":true},"steps":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"meaning":{"type":"object","properties":{"number":{"type":"number","nullable":true},"archetype":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"personality":{"type":"object","properties":{"raw":{"type":"number","nullable":true},"reduced":{"type":"number","nullable":true},"isMaster":{"type":"boolean","nullable":true},"steps":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"meaning":{"type":"object","properties":{"number":{"type":"number","nullable":true},"archetype":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"birthday":{"type":"object","properties":{"raw":{"type":"number","nullable":true},"reduced":{"type":"number","nullable":true},"isMaster":{"type":"boolean","nullable":true},"steps":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"meaning":{"type":"object","properties":{"number":{"type":"number","nullable":true},"archetype":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"personalYear":{"type":"object","properties":{"raw":{"type":"number","nullable":true},"reduced":{"type":"number","nullable":true},"isMaster":{"type":"boolean","nullable":true},"steps":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"meaning":{"type":"object","properties":{"number":{"type":"number","nullable":true},"archetype":{"type":"string","nullable":true}},"nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"chaldean","name":"John Smith","date":"1990-05-15","year":2026,"lifePath":{"raw":12,"reduced":3,"isMaster":false,"steps":[12,3],"meaning":{"number":3,"archetype":"The Communicator"}},"expression":{"raw":44,"reduced":8,"isMaster":false,"steps":[44,8],"meaning":{"number":8,"archetype":"The Executive"}},"soulUrge":{"raw":15,"reduced":6,"isMaster":false,"steps":[15,6],"meaning":{"number":6,"archetype":"The Nurturer"}},"personality":{"raw":29,"reduced":11,"isMaster":true,"steps":[29,11],"meaning":{"number":11,"archetype":"The Master Intuitive"}},"birthday":{"raw":15,"reduced":6,"isMaster":false,"steps":[15,6],"meaning":{"number":6,"archetype":"The Nurturer"}},"personalYear":{"raw":12,"reduced":3,"isMaster":false,"steps":[12,3],"meaning":{"number":3,"archetype":"The Communicator"}}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/numerology/kabbalistic/life-path":{"post":{"tags":["Numerology: Kabbalistic (phonetic)"],"summary":"Life Path Number (kabbalistic)","description":"Calculate the Life Path number from birth date (year + month + day, reduced). Numerology: Kabbalistic (phonetic) system.","operationId":"numerology_kabbalistic_life-path","x-quality":"green","x-source":"Hebrew gematria values per Sefer Yetzirah; Latin transliteration with phonetic digraphs CH/SH/TH/TS/TZ consuming two Latin letters per Hebrew letter. Use kabbalistic-strict for compatibility with single-letter Mathers calculators.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NumerologyNameDate"},"example":{"name":"John Smith","date":"1990-05-15"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/numerology/kabbalistic/life-path \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"name\": \"John Smith\", \"date\": \"1990-05-15\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/numerology/kabbalistic/life-path', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"name\": \"John Smith\",\n    \"date\": \"1990-05-15\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/numerology/kabbalistic/life-path',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'name': \"John Smith\",\n      'date': \"1990-05-15\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('numerology/kabbalistic/life-path', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'name' => 'John Smith',\n        'date' => '1990-05-15',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"date":{"type":"string","nullable":true},"lifePath":{"type":"object","properties":{"raw":{"type":"number","nullable":true},"reduced":{"type":"number","nullable":true},"isMaster":{"type":"boolean","nullable":true},"steps":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"meaning":{"type":"object","properties":{"number":{"type":"number","nullable":true},"archetype":{"type":"string","nullable":true},"strengths":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"shortRead":{"type":"string","nullable":true}},"nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"pythagorean","name":"John Smith","date":"1990-05-15","lifePath":{"raw":30,"reduced":3,"isMaster":false,"steps":[30,3],"meaning":{"number":3,"archetype":"The Communicator","strengths":["expression"],"shortRead":"creative communicator..."}}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/numerology/kabbalistic/expression":{"post":{"tags":["Numerology: Kabbalistic (phonetic)"],"summary":"Expression / Destiny (kabbalistic)","description":"Calculate the Expression (Destiny) number from full birth name letters (all letters, reduced). Numerology: Kabbalistic (phonetic) system.","operationId":"numerology_kabbalistic_expression","x-quality":"green","x-source":"Hebrew gematria values per Sefer Yetzirah; Latin transliteration with phonetic digraphs CH/SH/TH/TS/TZ consuming two Latin letters per Hebrew letter. Use kabbalistic-strict for compatibility with single-letter Mathers calculators.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NumerologyNameDate"},"example":{"name":"John Smith","date":"1990-05-15"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/numerology/kabbalistic/expression \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"name\": \"John Smith\", \"date\": \"1990-05-15\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/numerology/kabbalistic/expression', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"name\": \"John Smith\",\n    \"date\": \"1990-05-15\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/numerology/kabbalistic/expression',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'name': \"John Smith\",\n      'date': \"1990-05-15\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('numerology/kabbalistic/expression', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'name' => 'John Smith',\n        'date' => '1990-05-15',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"date":{"type":"string","nullable":true},"expression":{"type":"object","properties":{"raw":{"type":"number","nullable":true},"reduced":{"type":"number","nullable":true},"isMaster":{"type":"boolean","nullable":true},"steps":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"meaning":{"type":"object","properties":{"number":{"type":"number","nullable":true},"archetype":{"type":"string","nullable":true},"strengths":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"shortRead":{"type":"string","nullable":true}},"nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"pythagorean","name":"John Smith","date":"1990-05-15","expression":{"raw":30,"reduced":3,"isMaster":false,"steps":[30,3],"meaning":{"number":3,"archetype":"The Communicator","strengths":["expression"],"shortRead":"creative communicator..."}}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/numerology/kabbalistic/soul-urge":{"post":{"tags":["Numerology: Kabbalistic (phonetic)"],"summary":"Soul Urge / Heart's Desire (kabbalistic)","description":"Calculate the Soul Urge number from the vowels of the full birth name. Numerology: Kabbalistic (phonetic) system.","operationId":"numerology_kabbalistic_soul-urge","x-quality":"green","x-source":"Hebrew gematria values per Sefer Yetzirah; Latin transliteration with phonetic digraphs CH/SH/TH/TS/TZ consuming two Latin letters per Hebrew letter. Use kabbalistic-strict for compatibility with single-letter Mathers calculators.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NumerologyNameDate"},"example":{"name":"John Smith","date":"1990-05-15"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/numerology/kabbalistic/soul-urge \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"name\": \"John Smith\", \"date\": \"1990-05-15\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/numerology/kabbalistic/soul-urge', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"name\": \"John Smith\",\n    \"date\": \"1990-05-15\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/numerology/kabbalistic/soul-urge',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'name': \"John Smith\",\n      'date': \"1990-05-15\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('numerology/kabbalistic/soul-urge', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'name' => 'John Smith',\n        'date' => '1990-05-15',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"date":{"type":"string","nullable":true},"soulUrge":{"type":"object","properties":{"raw":{"type":"number","nullable":true},"reduced":{"type":"number","nullable":true},"isMaster":{"type":"boolean","nullable":true},"steps":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"meaning":{"type":"object","properties":{"number":{"type":"number","nullable":true},"archetype":{"type":"string","nullable":true},"strengths":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"shortRead":{"type":"string","nullable":true}},"nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"pythagorean","name":"John Smith","date":"1990-05-15","soulUrge":{"raw":30,"reduced":3,"isMaster":false,"steps":[30,3],"meaning":{"number":3,"archetype":"The Communicator","strengths":["expression"],"shortRead":"creative communicator..."}}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/numerology/kabbalistic/personality":{"post":{"tags":["Numerology: Kabbalistic (phonetic)"],"summary":"Personality (kabbalistic)","description":"Calculate the Personality number from the consonants of the full birth name. Numerology: Kabbalistic (phonetic) system.","operationId":"numerology_kabbalistic_personality","x-quality":"green","x-source":"Hebrew gematria values per Sefer Yetzirah; Latin transliteration with phonetic digraphs CH/SH/TH/TS/TZ consuming two Latin letters per Hebrew letter. Use kabbalistic-strict for compatibility with single-letter Mathers calculators.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NumerologyNameDate"},"example":{"name":"John Smith","date":"1990-05-15"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/numerology/kabbalistic/personality \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"name\": \"John Smith\", \"date\": \"1990-05-15\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/numerology/kabbalistic/personality', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"name\": \"John Smith\",\n    \"date\": \"1990-05-15\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/numerology/kabbalistic/personality',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'name': \"John Smith\",\n      'date': \"1990-05-15\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('numerology/kabbalistic/personality', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'name' => 'John Smith',\n        'date' => '1990-05-15',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"date":{"type":"string","nullable":true},"personality":{"type":"object","properties":{"raw":{"type":"number","nullable":true},"reduced":{"type":"number","nullable":true},"isMaster":{"type":"boolean","nullable":true},"steps":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"meaning":{"type":"object","properties":{"number":{"type":"number","nullable":true},"archetype":{"type":"string","nullable":true},"strengths":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"shortRead":{"type":"string","nullable":true}},"nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"pythagorean","name":"John Smith","date":"1990-05-15","personality":{"raw":30,"reduced":3,"isMaster":false,"steps":[30,3],"meaning":{"number":3,"archetype":"The Communicator","strengths":["expression"],"shortRead":"creative communicator..."}}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/numerology/kabbalistic/birthday":{"post":{"tags":["Numerology: Kabbalistic (phonetic)"],"summary":"Birthday (kabbalistic)","description":"Calculate the Birthday number from the day-of-birth digit. Numerology: Kabbalistic (phonetic) system.","operationId":"numerology_kabbalistic_birthday","x-quality":"green","x-source":"Hebrew gematria values per Sefer Yetzirah; Latin transliteration with phonetic digraphs CH/SH/TH/TS/TZ consuming two Latin letters per Hebrew letter. Use kabbalistic-strict for compatibility with single-letter Mathers calculators.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NumerologyNameDate"},"example":{"name":"John Smith","date":"1990-05-15"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/numerology/kabbalistic/birthday \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"name\": \"John Smith\", \"date\": \"1990-05-15\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/numerology/kabbalistic/birthday', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"name\": \"John Smith\",\n    \"date\": \"1990-05-15\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/numerology/kabbalistic/birthday',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'name': \"John Smith\",\n      'date': \"1990-05-15\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('numerology/kabbalistic/birthday', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'name' => 'John Smith',\n        'date' => '1990-05-15',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"date":{"type":"string","nullable":true},"birthday":{"type":"object","properties":{"raw":{"type":"number","nullable":true},"reduced":{"type":"number","nullable":true},"isMaster":{"type":"boolean","nullable":true},"steps":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"meaning":{"type":"object","properties":{"number":{"type":"number","nullable":true},"archetype":{"type":"string","nullable":true},"strengths":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"shortRead":{"type":"string","nullable":true}},"nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"pythagorean","name":"John Smith","date":"1990-05-15","birthday":{"raw":30,"reduced":3,"isMaster":false,"steps":[30,3],"meaning":{"number":3,"archetype":"The Communicator","strengths":["expression"],"shortRead":"creative communicator..."}}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/numerology/kabbalistic/maturity":{"post":{"tags":["Numerology: Kabbalistic (phonetic)"],"summary":"Maturity (kabbalistic)","description":"Calculate the Maturity number: sum of Life Path and Expression, activates around age 35. Numerology: Kabbalistic (phonetic) system.","operationId":"numerology_kabbalistic_maturity","x-quality":"green","x-source":"Hebrew gematria values per Sefer Yetzirah; Latin transliteration with phonetic digraphs CH/SH/TH/TS/TZ consuming two Latin letters per Hebrew letter. Use kabbalistic-strict for compatibility with single-letter Mathers calculators.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NumerologyNameDate"},"example":{"name":"John Smith","date":"1990-05-15"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/numerology/kabbalistic/maturity \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"name\": \"John Smith\", \"date\": \"1990-05-15\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/numerology/kabbalistic/maturity', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"name\": \"John Smith\",\n    \"date\": \"1990-05-15\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/numerology/kabbalistic/maturity',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'name': \"John Smith\",\n      'date': \"1990-05-15\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('numerology/kabbalistic/maturity', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'name' => 'John Smith',\n        'date' => '1990-05-15',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"date":{"type":"string","nullable":true},"maturity":{"type":"object","properties":{"raw":{"type":"number","nullable":true},"reduced":{"type":"number","nullable":true},"isMaster":{"type":"boolean","nullable":true},"steps":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"meaning":{"type":"object","properties":{"number":{"type":"number","nullable":true},"archetype":{"type":"string","nullable":true},"strengths":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"shortRead":{"type":"string","nullable":true}},"nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"pythagorean","name":"John Smith","date":"1990-05-15","maturity":{"raw":30,"reduced":3,"isMaster":false,"steps":[30,3],"meaning":{"number":3,"archetype":"The Communicator","strengths":["expression"],"shortRead":"creative communicator..."}}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/numerology/kabbalistic/balance":{"post":{"tags":["Numerology: Kabbalistic (phonetic)"],"summary":"Balance (kabbalistic)","description":"Calculate the Balance number from initials of each part of the full name. Numerology: Kabbalistic (phonetic) system.","operationId":"numerology_kabbalistic_balance","x-quality":"green","x-source":"Hebrew gematria values per Sefer Yetzirah; Latin transliteration with phonetic digraphs CH/SH/TH/TS/TZ consuming two Latin letters per Hebrew letter. Use kabbalistic-strict for compatibility with single-letter Mathers calculators.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NumerologyNameDate"},"example":{"name":"John Smith","date":"1990-05-15"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/numerology/kabbalistic/balance \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"name\": \"John Smith\", \"date\": \"1990-05-15\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/numerology/kabbalistic/balance', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"name\": \"John Smith\",\n    \"date\": \"1990-05-15\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/numerology/kabbalistic/balance',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'name': \"John Smith\",\n      'date': \"1990-05-15\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('numerology/kabbalistic/balance', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'name' => 'John Smith',\n        'date' => '1990-05-15',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"date":{"type":"string","nullable":true},"balance":{"type":"object","properties":{"raw":{"type":"number","nullable":true},"reduced":{"type":"number","nullable":true},"isMaster":{"type":"boolean","nullable":true},"steps":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"meaning":{"type":"object","properties":{"number":{"type":"number","nullable":true},"archetype":{"type":"string","nullable":true},"strengths":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"shortRead":{"type":"string","nullable":true}},"nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"pythagorean","name":"John Smith","date":"1990-05-15","balance":{"raw":30,"reduced":3,"isMaster":false,"steps":[30,3],"meaning":{"number":3,"archetype":"The Communicator","strengths":["expression"],"shortRead":"creative communicator..."}}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/numerology/kabbalistic/challenge":{"post":{"tags":["Numerology: Kabbalistic (phonetic)"],"summary":"Challenge Cycles (kabbalistic)","description":"Calculate four Challenge cycles: life-area difficulties to master, derived from birth date components. Numerology: Kabbalistic (phonetic) system.","operationId":"numerology_kabbalistic_challenge","x-quality":"green","x-source":"Hebrew gematria values per Sefer Yetzirah; Latin transliteration with phonetic digraphs CH/SH/TH/TS/TZ consuming two Latin letters per Hebrew letter. Use kabbalistic-strict for compatibility with single-letter Mathers calculators.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NumerologyNameDate"},"example":{"name":"John Smith","date":"1990-05-15"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/numerology/kabbalistic/challenge \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"name\": \"John Smith\", \"date\": \"1990-05-15\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/numerology/kabbalistic/challenge', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"name\": \"John Smith\",\n    \"date\": \"1990-05-15\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/numerology/kabbalistic/challenge',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'name': \"John Smith\",\n      'date': \"1990-05-15\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('numerology/kabbalistic/challenge', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'name' => 'John Smith',\n        'date' => '1990-05-15',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"challenges":{"type":"object","properties":{"first":{"type":"object","properties":{"reduced":{"type":"number","nullable":true},"meaning":{"type":"object","properties":{"archetype":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"second":{"type":"object","properties":{"reduced":{"type":"number","nullable":true}},"nullable":true},"third":{"type":"object","properties":{"reduced":{"type":"number","nullable":true}},"nullable":true},"fourth":{"type":"object","properties":{"reduced":{"type":"number","nullable":true}},"nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"kabbalistic","challenges":{"first":{"reduced":4,"meaning":{"archetype":"The Builder"}},"second":{"reduced":1},"third":{"reduced":3},"fourth":{"reduced":5}}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/numerology/kabbalistic/pinnacles":{"post":{"tags":["Numerology: Kabbalistic (phonetic)"],"summary":"Pinnacle Cycles (kabbalistic)","description":"Calculate four Pinnacle cycles with their age boundaries: life chapters of opportunity. Numerology: Kabbalistic (phonetic) system.","operationId":"numerology_kabbalistic_pinnacles","x-quality":"green","x-source":"Hebrew gematria values per Sefer Yetzirah; Latin transliteration with phonetic digraphs CH/SH/TH/TS/TZ consuming two Latin letters per Hebrew letter. Use kabbalistic-strict for compatibility with single-letter Mathers calculators.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NumerologyNameDate"},"example":{"name":"John Smith","date":"1990-05-15"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/numerology/kabbalistic/pinnacles \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"name\": \"John Smith\", \"date\": \"1990-05-15\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/numerology/kabbalistic/pinnacles', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"name\": \"John Smith\",\n    \"date\": \"1990-05-15\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/numerology/kabbalistic/pinnacles',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'name': \"John Smith\",\n      'date': \"1990-05-15\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('numerology/kabbalistic/pinnacles', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'name' => 'John Smith',\n        'date' => '1990-05-15',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"pinnacles":{"type":"object","properties":{"first":{"type":"object","properties":{"reduced":{"type":"number","nullable":true},"endsAtAge":{"type":"number","nullable":true}},"nullable":true},"second":{"type":"object","properties":{"reduced":{"type":"number","nullable":true},"endsAtAge":{"type":"number","nullable":true}},"nullable":true},"third":{"type":"object","properties":{"reduced":{"type":"number","nullable":true},"endsAtAge":{"type":"number","nullable":true}},"nullable":true},"fourth":{"type":"object","properties":{"reduced":{"type":"number","nullable":true},"endsAtAge":{"type":"number","nullable":true}},"nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"kabbalistic","pinnacles":{"first":{"reduced":7,"endsAtAge":30},"second":{"reduced":4,"endsAtAge":39},"third":{"reduced":3,"endsAtAge":48},"fourth":{"reduced":8,"endsAtAge":57}}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/numerology/kabbalistic/personal-year":{"post":{"tags":["Numerology: Kabbalistic (phonetic)"],"summary":"Personal Year (kabbalistic)","description":"Calculate the Personal Year number for a given calendar year: the 9-year cycle of personal evolution. Numerology: Kabbalistic (phonetic) system.","operationId":"numerology_kabbalistic_personal-year","x-quality":"green","x-source":"Hebrew gematria values per Sefer Yetzirah; Latin transliteration with phonetic digraphs CH/SH/TH/TS/TZ consuming two Latin letters per Hebrew letter. Use kabbalistic-strict for compatibility with single-letter Mathers calculators.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NumerologyPersonalYear"},"example":{"name":"John Smith","date":"1990-05-15","year":2026}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/numerology/kabbalistic/personal-year \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"name\": \"John Smith\", \"date\": \"1990-05-15\", \"year\": 2026 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/numerology/kabbalistic/personal-year', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"name\": \"John Smith\",\n    \"date\": \"1990-05-15\",\n    \"year\": 2026\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/numerology/kabbalistic/personal-year',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'name': \"John Smith\",\n      'date': \"1990-05-15\",\n      'year': 2026\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('numerology/kabbalistic/personal-year', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'name' => 'John Smith',\n        'date' => '1990-05-15',\n        'year' => 2026,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"date":{"type":"string","nullable":true},"personalYear":{"type":"object","properties":{"raw":{"type":"number","nullable":true},"reduced":{"type":"number","nullable":true},"isMaster":{"type":"boolean","nullable":true},"steps":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"meaning":{"type":"object","properties":{"number":{"type":"number","nullable":true},"archetype":{"type":"string","nullable":true},"strengths":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"shortRead":{"type":"string","nullable":true}},"nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"pythagorean","name":"John Smith","date":"1990-05-15","personalYear":{"raw":30,"reduced":3,"isMaster":false,"steps":[30,3],"meaning":{"number":3,"archetype":"The Communicator","strengths":["expression"],"shortRead":"creative communicator..."}}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/numerology/kabbalistic/chart":{"post":{"tags":["Numerology: Kabbalistic (phonetic)"],"summary":"Core Numbers Chart (kabbalistic)","description":"The six core numbers in one call: Life Path, Expression, Soul Urge, Personality, Birthday and Personal Year (`year` defaults to the current year), each with its meaning. 20 credits instead of 60 for six single calls. Every number carries `meaning` (English) and `meaningLocalized` in the requested language (`translated: false` with the English text while a language's strings are on their way). Numerology: Kabbalistic (phonetic) system.","operationId":"numerology_kabbalistic_chart","x-quality":"green","x-source":"Hebrew gematria values per Sefer Yetzirah; Latin transliteration with phonetic digraphs CH/SH/TH/TS/TZ consuming two Latin letters per Hebrew letter. Use kabbalistic-strict for compatibility with single-letter Mathers calculators.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NumerologyPersonalYear"},"example":{"name":"John Smith","date":"1990-05-15","year":2026}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/numerology/kabbalistic/chart \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"name\": \"John Smith\", \"date\": \"1990-05-15\", \"year\": 2026 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/numerology/kabbalistic/chart', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"name\": \"John Smith\",\n    \"date\": \"1990-05-15\",\n    \"year\": 2026\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/numerology/kabbalistic/chart',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'name': \"John Smith\",\n      'date': \"1990-05-15\",\n      'year': 2026\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('numerology/kabbalistic/chart', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'name' => 'John Smith',\n        'date' => '1990-05-15',\n        'year' => 2026,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"date":{"type":"string","nullable":true},"year":{"type":"number","nullable":true},"lifePath":{"type":"object","properties":{"raw":{"type":"number","nullable":true},"reduced":{"type":"number","nullable":true},"isMaster":{"type":"boolean","nullable":true},"steps":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"meaning":{"type":"object","properties":{"number":{"type":"number","nullable":true},"archetype":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"expression":{"type":"object","properties":{"raw":{"type":"number","nullable":true},"reduced":{"type":"number","nullable":true},"isMaster":{"type":"boolean","nullable":true},"steps":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"meaning":{"type":"object","properties":{"number":{"type":"number","nullable":true},"archetype":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"soulUrge":{"type":"object","properties":{"raw":{"type":"number","nullable":true},"reduced":{"type":"number","nullable":true},"isMaster":{"type":"boolean","nullable":true},"steps":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"meaning":{"type":"object","properties":{"number":{"type":"number","nullable":true},"archetype":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"personality":{"type":"object","properties":{"raw":{"type":"number","nullable":true},"reduced":{"type":"number","nullable":true},"isMaster":{"type":"boolean","nullable":true},"steps":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"meaning":{"type":"object","properties":{"number":{"type":"number","nullable":true},"archetype":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"birthday":{"type":"object","properties":{"raw":{"type":"number","nullable":true},"reduced":{"type":"number","nullable":true},"isMaster":{"type":"boolean","nullable":true},"steps":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"meaning":{"type":"object","properties":{"number":{"type":"number","nullable":true},"archetype":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"personalYear":{"type":"object","properties":{"raw":{"type":"number","nullable":true},"reduced":{"type":"number","nullable":true},"isMaster":{"type":"boolean","nullable":true},"steps":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"meaning":{"type":"object","properties":{"number":{"type":"number","nullable":true},"archetype":{"type":"string","nullable":true}},"nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"kabbalistic","name":"John Smith","date":"1990-05-15","year":2026,"lifePath":{"raw":12,"reduced":3,"isMaster":false,"steps":[12,3],"meaning":{"number":3,"archetype":"The Communicator"}},"expression":{"raw":44,"reduced":8,"isMaster":false,"steps":[44,8],"meaning":{"number":8,"archetype":"The Executive"}},"soulUrge":{"raw":15,"reduced":6,"isMaster":false,"steps":[15,6],"meaning":{"number":6,"archetype":"The Nurturer"}},"personality":{"raw":29,"reduced":11,"isMaster":true,"steps":[29,11],"meaning":{"number":11,"archetype":"The Master Intuitive"}},"birthday":{"raw":15,"reduced":6,"isMaster":false,"steps":[15,6],"meaning":{"number":6,"archetype":"The Nurturer"}},"personalYear":{"raw":12,"reduced":3,"isMaster":false,"steps":[12,3],"meaning":{"number":3,"archetype":"The Communicator"}}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/numerology/kabbalistic-strict/life-path":{"post":{"tags":["Numerology: Kabbalistic (Mathers strict)"],"summary":"Life Path Number (kabbalistic-strict)","description":"Calculate the Life Path number from birth date (year + month + day, reduced). Numerology: Kabbalistic (Mathers strict) system.","operationId":"numerology_kabbalistic-strict_life-path","x-quality":"green","x-source":"Mathers single-letter Latin transliteration of Hebrew gematria. Compatible with standard single-letter calculators.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NumerologyNameDate"},"example":{"name":"John Smith","date":"1990-05-15"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/numerology/kabbalistic-strict/life-path \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"name\": \"John Smith\", \"date\": \"1990-05-15\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/numerology/kabbalistic-strict/life-path', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"name\": \"John Smith\",\n    \"date\": \"1990-05-15\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/numerology/kabbalistic-strict/life-path',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'name': \"John Smith\",\n      'date': \"1990-05-15\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('numerology/kabbalistic-strict/life-path', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'name' => 'John Smith',\n        'date' => '1990-05-15',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"date":{"type":"string","nullable":true},"lifePath":{"type":"object","properties":{"raw":{"type":"number","nullable":true},"reduced":{"type":"number","nullable":true},"isMaster":{"type":"boolean","nullable":true},"steps":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"meaning":{"type":"object","properties":{"number":{"type":"number","nullable":true},"archetype":{"type":"string","nullable":true},"strengths":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"shortRead":{"type":"string","nullable":true}},"nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"pythagorean","name":"John Smith","date":"1990-05-15","lifePath":{"raw":30,"reduced":3,"isMaster":false,"steps":[30,3],"meaning":{"number":3,"archetype":"The Communicator","strengths":["expression"],"shortRead":"creative communicator..."}}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/numerology/kabbalistic-strict/expression":{"post":{"tags":["Numerology: Kabbalistic (Mathers strict)"],"summary":"Expression / Destiny (kabbalistic-strict)","description":"Calculate the Expression (Destiny) number from full birth name letters (all letters, reduced). Numerology: Kabbalistic (Mathers strict) system.","operationId":"numerology_kabbalistic-strict_expression","x-quality":"green","x-source":"Mathers single-letter Latin transliteration of Hebrew gematria. Compatible with standard single-letter calculators.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NumerologyNameDate"},"example":{"name":"John Smith","date":"1990-05-15"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/numerology/kabbalistic-strict/expression \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"name\": \"John Smith\", \"date\": \"1990-05-15\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/numerology/kabbalistic-strict/expression', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"name\": \"John Smith\",\n    \"date\": \"1990-05-15\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/numerology/kabbalistic-strict/expression',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'name': \"John Smith\",\n      'date': \"1990-05-15\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('numerology/kabbalistic-strict/expression', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'name' => 'John Smith',\n        'date' => '1990-05-15',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"date":{"type":"string","nullable":true},"expression":{"type":"object","properties":{"raw":{"type":"number","nullable":true},"reduced":{"type":"number","nullable":true},"isMaster":{"type":"boolean","nullable":true},"steps":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"meaning":{"type":"object","properties":{"number":{"type":"number","nullable":true},"archetype":{"type":"string","nullable":true},"strengths":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"shortRead":{"type":"string","nullable":true}},"nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"pythagorean","name":"John Smith","date":"1990-05-15","expression":{"raw":30,"reduced":3,"isMaster":false,"steps":[30,3],"meaning":{"number":3,"archetype":"The Communicator","strengths":["expression"],"shortRead":"creative communicator..."}}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/numerology/kabbalistic-strict/soul-urge":{"post":{"tags":["Numerology: Kabbalistic (Mathers strict)"],"summary":"Soul Urge / Heart's Desire (kabbalistic-strict)","description":"Calculate the Soul Urge number from the vowels of the full birth name. Numerology: Kabbalistic (Mathers strict) system.","operationId":"numerology_kabbalistic-strict_soul-urge","x-quality":"green","x-source":"Mathers single-letter Latin transliteration of Hebrew gematria. Compatible with standard single-letter calculators.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NumerologyNameDate"},"example":{"name":"John Smith","date":"1990-05-15"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/numerology/kabbalistic-strict/soul-urge \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"name\": \"John Smith\", \"date\": \"1990-05-15\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/numerology/kabbalistic-strict/soul-urge', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"name\": \"John Smith\",\n    \"date\": \"1990-05-15\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/numerology/kabbalistic-strict/soul-urge',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'name': \"John Smith\",\n      'date': \"1990-05-15\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('numerology/kabbalistic-strict/soul-urge', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'name' => 'John Smith',\n        'date' => '1990-05-15',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"date":{"type":"string","nullable":true},"soulUrge":{"type":"object","properties":{"raw":{"type":"number","nullable":true},"reduced":{"type":"number","nullable":true},"isMaster":{"type":"boolean","nullable":true},"steps":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"meaning":{"type":"object","properties":{"number":{"type":"number","nullable":true},"archetype":{"type":"string","nullable":true},"strengths":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"shortRead":{"type":"string","nullable":true}},"nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"pythagorean","name":"John Smith","date":"1990-05-15","soulUrge":{"raw":30,"reduced":3,"isMaster":false,"steps":[30,3],"meaning":{"number":3,"archetype":"The Communicator","strengths":["expression"],"shortRead":"creative communicator..."}}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/numerology/kabbalistic-strict/personality":{"post":{"tags":["Numerology: Kabbalistic (Mathers strict)"],"summary":"Personality (kabbalistic-strict)","description":"Calculate the Personality number from the consonants of the full birth name. Numerology: Kabbalistic (Mathers strict) system.","operationId":"numerology_kabbalistic-strict_personality","x-quality":"green","x-source":"Mathers single-letter Latin transliteration of Hebrew gematria. Compatible with standard single-letter calculators.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NumerologyNameDate"},"example":{"name":"John Smith","date":"1990-05-15"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/numerology/kabbalistic-strict/personality \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"name\": \"John Smith\", \"date\": \"1990-05-15\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/numerology/kabbalistic-strict/personality', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"name\": \"John Smith\",\n    \"date\": \"1990-05-15\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/numerology/kabbalistic-strict/personality',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'name': \"John Smith\",\n      'date': \"1990-05-15\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('numerology/kabbalistic-strict/personality', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'name' => 'John Smith',\n        'date' => '1990-05-15',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"date":{"type":"string","nullable":true},"personality":{"type":"object","properties":{"raw":{"type":"number","nullable":true},"reduced":{"type":"number","nullable":true},"isMaster":{"type":"boolean","nullable":true},"steps":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"meaning":{"type":"object","properties":{"number":{"type":"number","nullable":true},"archetype":{"type":"string","nullable":true},"strengths":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"shortRead":{"type":"string","nullable":true}},"nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"pythagorean","name":"John Smith","date":"1990-05-15","personality":{"raw":30,"reduced":3,"isMaster":false,"steps":[30,3],"meaning":{"number":3,"archetype":"The Communicator","strengths":["expression"],"shortRead":"creative communicator..."}}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/numerology/kabbalistic-strict/birthday":{"post":{"tags":["Numerology: Kabbalistic (Mathers strict)"],"summary":"Birthday (kabbalistic-strict)","description":"Calculate the Birthday number from the day-of-birth digit. Numerology: Kabbalistic (Mathers strict) system.","operationId":"numerology_kabbalistic-strict_birthday","x-quality":"green","x-source":"Mathers single-letter Latin transliteration of Hebrew gematria. Compatible with standard single-letter calculators.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NumerologyNameDate"},"example":{"name":"John Smith","date":"1990-05-15"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/numerology/kabbalistic-strict/birthday \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"name\": \"John Smith\", \"date\": \"1990-05-15\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/numerology/kabbalistic-strict/birthday', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"name\": \"John Smith\",\n    \"date\": \"1990-05-15\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/numerology/kabbalistic-strict/birthday',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'name': \"John Smith\",\n      'date': \"1990-05-15\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('numerology/kabbalistic-strict/birthday', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'name' => 'John Smith',\n        'date' => '1990-05-15',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"date":{"type":"string","nullable":true},"birthday":{"type":"object","properties":{"raw":{"type":"number","nullable":true},"reduced":{"type":"number","nullable":true},"isMaster":{"type":"boolean","nullable":true},"steps":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"meaning":{"type":"object","properties":{"number":{"type":"number","nullable":true},"archetype":{"type":"string","nullable":true},"strengths":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"shortRead":{"type":"string","nullable":true}},"nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"pythagorean","name":"John Smith","date":"1990-05-15","birthday":{"raw":30,"reduced":3,"isMaster":false,"steps":[30,3],"meaning":{"number":3,"archetype":"The Communicator","strengths":["expression"],"shortRead":"creative communicator..."}}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/numerology/kabbalistic-strict/maturity":{"post":{"tags":["Numerology: Kabbalistic (Mathers strict)"],"summary":"Maturity (kabbalistic-strict)","description":"Calculate the Maturity number: sum of Life Path and Expression, activates around age 35. Numerology: Kabbalistic (Mathers strict) system.","operationId":"numerology_kabbalistic-strict_maturity","x-quality":"green","x-source":"Mathers single-letter Latin transliteration of Hebrew gematria. Compatible with standard single-letter calculators.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NumerologyNameDate"},"example":{"name":"John Smith","date":"1990-05-15"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/numerology/kabbalistic-strict/maturity \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"name\": \"John Smith\", \"date\": \"1990-05-15\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/numerology/kabbalistic-strict/maturity', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"name\": \"John Smith\",\n    \"date\": \"1990-05-15\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/numerology/kabbalistic-strict/maturity',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'name': \"John Smith\",\n      'date': \"1990-05-15\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('numerology/kabbalistic-strict/maturity', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'name' => 'John Smith',\n        'date' => '1990-05-15',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"date":{"type":"string","nullable":true},"maturity":{"type":"object","properties":{"raw":{"type":"number","nullable":true},"reduced":{"type":"number","nullable":true},"isMaster":{"type":"boolean","nullable":true},"steps":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"meaning":{"type":"object","properties":{"number":{"type":"number","nullable":true},"archetype":{"type":"string","nullable":true},"strengths":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"shortRead":{"type":"string","nullable":true}},"nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"pythagorean","name":"John Smith","date":"1990-05-15","maturity":{"raw":30,"reduced":3,"isMaster":false,"steps":[30,3],"meaning":{"number":3,"archetype":"The Communicator","strengths":["expression"],"shortRead":"creative communicator..."}}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/numerology/kabbalistic-strict/balance":{"post":{"tags":["Numerology: Kabbalistic (Mathers strict)"],"summary":"Balance (kabbalistic-strict)","description":"Calculate the Balance number from initials of each part of the full name. Numerology: Kabbalistic (Mathers strict) system.","operationId":"numerology_kabbalistic-strict_balance","x-quality":"green","x-source":"Mathers single-letter Latin transliteration of Hebrew gematria. Compatible with standard single-letter calculators.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NumerologyNameDate"},"example":{"name":"John Smith","date":"1990-05-15"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/numerology/kabbalistic-strict/balance \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"name\": \"John Smith\", \"date\": \"1990-05-15\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/numerology/kabbalistic-strict/balance', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"name\": \"John Smith\",\n    \"date\": \"1990-05-15\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/numerology/kabbalistic-strict/balance',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'name': \"John Smith\",\n      'date': \"1990-05-15\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('numerology/kabbalistic-strict/balance', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'name' => 'John Smith',\n        'date' => '1990-05-15',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"date":{"type":"string","nullable":true},"balance":{"type":"object","properties":{"raw":{"type":"number","nullable":true},"reduced":{"type":"number","nullable":true},"isMaster":{"type":"boolean","nullable":true},"steps":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"meaning":{"type":"object","properties":{"number":{"type":"number","nullable":true},"archetype":{"type":"string","nullable":true},"strengths":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"shortRead":{"type":"string","nullable":true}},"nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"pythagorean","name":"John Smith","date":"1990-05-15","balance":{"raw":30,"reduced":3,"isMaster":false,"steps":[30,3],"meaning":{"number":3,"archetype":"The Communicator","strengths":["expression"],"shortRead":"creative communicator..."}}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/numerology/kabbalistic-strict/challenge":{"post":{"tags":["Numerology: Kabbalistic (Mathers strict)"],"summary":"Challenge Cycles (kabbalistic-strict)","description":"Calculate four Challenge cycles: life-area difficulties to master, derived from birth date components. Numerology: Kabbalistic (Mathers strict) system.","operationId":"numerology_kabbalistic-strict_challenge","x-quality":"green","x-source":"Mathers single-letter Latin transliteration of Hebrew gematria. Compatible with standard single-letter calculators.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NumerologyNameDate"},"example":{"name":"John Smith","date":"1990-05-15"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/numerology/kabbalistic-strict/challenge \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"name\": \"John Smith\", \"date\": \"1990-05-15\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/numerology/kabbalistic-strict/challenge', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"name\": \"John Smith\",\n    \"date\": \"1990-05-15\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/numerology/kabbalistic-strict/challenge',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'name': \"John Smith\",\n      'date': \"1990-05-15\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('numerology/kabbalistic-strict/challenge', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'name' => 'John Smith',\n        'date' => '1990-05-15',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"challenges":{"type":"object","properties":{"first":{"type":"object","properties":{"reduced":{"type":"number","nullable":true},"meaning":{"type":"object","properties":{"archetype":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"second":{"type":"object","properties":{"reduced":{"type":"number","nullable":true}},"nullable":true},"third":{"type":"object","properties":{"reduced":{"type":"number","nullable":true}},"nullable":true},"fourth":{"type":"object","properties":{"reduced":{"type":"number","nullable":true}},"nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"kabbalistic-strict","challenges":{"first":{"reduced":4,"meaning":{"archetype":"The Builder"}},"second":{"reduced":1},"third":{"reduced":3},"fourth":{"reduced":5}}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/numerology/kabbalistic-strict/pinnacles":{"post":{"tags":["Numerology: Kabbalistic (Mathers strict)"],"summary":"Pinnacle Cycles (kabbalistic-strict)","description":"Calculate four Pinnacle cycles with their age boundaries: life chapters of opportunity. Numerology: Kabbalistic (Mathers strict) system.","operationId":"numerology_kabbalistic-strict_pinnacles","x-quality":"green","x-source":"Mathers single-letter Latin transliteration of Hebrew gematria. Compatible with standard single-letter calculators.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NumerologyNameDate"},"example":{"name":"John Smith","date":"1990-05-15"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/numerology/kabbalistic-strict/pinnacles \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"name\": \"John Smith\", \"date\": \"1990-05-15\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/numerology/kabbalistic-strict/pinnacles', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"name\": \"John Smith\",\n    \"date\": \"1990-05-15\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/numerology/kabbalistic-strict/pinnacles',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'name': \"John Smith\",\n      'date': \"1990-05-15\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('numerology/kabbalistic-strict/pinnacles', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'name' => 'John Smith',\n        'date' => '1990-05-15',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"pinnacles":{"type":"object","properties":{"first":{"type":"object","properties":{"reduced":{"type":"number","nullable":true},"endsAtAge":{"type":"number","nullable":true}},"nullable":true},"second":{"type":"object","properties":{"reduced":{"type":"number","nullable":true},"endsAtAge":{"type":"number","nullable":true}},"nullable":true},"third":{"type":"object","properties":{"reduced":{"type":"number","nullable":true},"endsAtAge":{"type":"number","nullable":true}},"nullable":true},"fourth":{"type":"object","properties":{"reduced":{"type":"number","nullable":true},"endsAtAge":{"type":"number","nullable":true}},"nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"kabbalistic-strict","pinnacles":{"first":{"reduced":7,"endsAtAge":30},"second":{"reduced":4,"endsAtAge":39},"third":{"reduced":3,"endsAtAge":48},"fourth":{"reduced":8,"endsAtAge":57}}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/numerology/kabbalistic-strict/personal-year":{"post":{"tags":["Numerology: Kabbalistic (Mathers strict)"],"summary":"Personal Year (kabbalistic-strict)","description":"Calculate the Personal Year number for a given calendar year: the 9-year cycle of personal evolution. Numerology: Kabbalistic (Mathers strict) system.","operationId":"numerology_kabbalistic-strict_personal-year","x-quality":"green","x-source":"Mathers single-letter Latin transliteration of Hebrew gematria. Compatible with standard single-letter calculators.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NumerologyPersonalYear"},"example":{"name":"John Smith","date":"1990-05-15","year":2026}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/numerology/kabbalistic-strict/personal-year \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"name\": \"John Smith\", \"date\": \"1990-05-15\", \"year\": 2026 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/numerology/kabbalistic-strict/personal-year', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"name\": \"John Smith\",\n    \"date\": \"1990-05-15\",\n    \"year\": 2026\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/numerology/kabbalistic-strict/personal-year',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'name': \"John Smith\",\n      'date': \"1990-05-15\",\n      'year': 2026\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('numerology/kabbalistic-strict/personal-year', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'name' => 'John Smith',\n        'date' => '1990-05-15',\n        'year' => 2026,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"date":{"type":"string","nullable":true},"personalYear":{"type":"object","properties":{"raw":{"type":"number","nullable":true},"reduced":{"type":"number","nullable":true},"isMaster":{"type":"boolean","nullable":true},"steps":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"meaning":{"type":"object","properties":{"number":{"type":"number","nullable":true},"archetype":{"type":"string","nullable":true},"strengths":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"shortRead":{"type":"string","nullable":true}},"nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"pythagorean","name":"John Smith","date":"1990-05-15","personalYear":{"raw":30,"reduced":3,"isMaster":false,"steps":[30,3],"meaning":{"number":3,"archetype":"The Communicator","strengths":["expression"],"shortRead":"creative communicator..."}}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/numerology/kabbalistic-strict/chart":{"post":{"tags":["Numerology: Kabbalistic (Mathers strict)"],"summary":"Core Numbers Chart (kabbalistic-strict)","description":"The six core numbers in one call: Life Path, Expression, Soul Urge, Personality, Birthday and Personal Year (`year` defaults to the current year), each with its meaning. 20 credits instead of 60 for six single calls. Every number carries `meaning` (English) and `meaningLocalized` in the requested language (`translated: false` with the English text while a language's strings are on their way). Numerology: Kabbalistic (Mathers strict) system.","operationId":"numerology_kabbalistic-strict_chart","x-quality":"green","x-source":"Mathers single-letter Latin transliteration of Hebrew gematria. Compatible with standard single-letter calculators.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NumerologyPersonalYear"},"example":{"name":"John Smith","date":"1990-05-15","year":2026}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/numerology/kabbalistic-strict/chart \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"name\": \"John Smith\", \"date\": \"1990-05-15\", \"year\": 2026 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/numerology/kabbalistic-strict/chart', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"name\": \"John Smith\",\n    \"date\": \"1990-05-15\",\n    \"year\": 2026\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/numerology/kabbalistic-strict/chart',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'name': \"John Smith\",\n      'date': \"1990-05-15\",\n      'year': 2026\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('numerology/kabbalistic-strict/chart', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'name' => 'John Smith',\n        'date' => '1990-05-15',\n        'year' => 2026,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"date":{"type":"string","nullable":true},"year":{"type":"number","nullable":true},"lifePath":{"type":"object","properties":{"raw":{"type":"number","nullable":true},"reduced":{"type":"number","nullable":true},"isMaster":{"type":"boolean","nullable":true},"steps":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"meaning":{"type":"object","properties":{"number":{"type":"number","nullable":true},"archetype":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"expression":{"type":"object","properties":{"raw":{"type":"number","nullable":true},"reduced":{"type":"number","nullable":true},"isMaster":{"type":"boolean","nullable":true},"steps":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"meaning":{"type":"object","properties":{"number":{"type":"number","nullable":true},"archetype":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"soulUrge":{"type":"object","properties":{"raw":{"type":"number","nullable":true},"reduced":{"type":"number","nullable":true},"isMaster":{"type":"boolean","nullable":true},"steps":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"meaning":{"type":"object","properties":{"number":{"type":"number","nullable":true},"archetype":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"personality":{"type":"object","properties":{"raw":{"type":"number","nullable":true},"reduced":{"type":"number","nullable":true},"isMaster":{"type":"boolean","nullable":true},"steps":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"meaning":{"type":"object","properties":{"number":{"type":"number","nullable":true},"archetype":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"birthday":{"type":"object","properties":{"raw":{"type":"number","nullable":true},"reduced":{"type":"number","nullable":true},"isMaster":{"type":"boolean","nullable":true},"steps":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"meaning":{"type":"object","properties":{"number":{"type":"number","nullable":true},"archetype":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"personalYear":{"type":"object","properties":{"raw":{"type":"number","nullable":true},"reduced":{"type":"number","nullable":true},"isMaster":{"type":"boolean","nullable":true},"steps":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"meaning":{"type":"object","properties":{"number":{"type":"number","nullable":true},"archetype":{"type":"string","nullable":true}},"nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"kabbalistic-strict","name":"John Smith","date":"1990-05-15","year":2026,"lifePath":{"raw":12,"reduced":3,"isMaster":false,"steps":[12,3],"meaning":{"number":3,"archetype":"The Communicator"}},"expression":{"raw":44,"reduced":8,"isMaster":false,"steps":[44,8],"meaning":{"number":8,"archetype":"The Executive"}},"soulUrge":{"raw":15,"reduced":6,"isMaster":false,"steps":[15,6],"meaning":{"number":6,"archetype":"The Nurturer"}},"personality":{"raw":29,"reduced":11,"isMaster":true,"steps":[29,11],"meaning":{"number":11,"archetype":"The Master Intuitive"}},"birthday":{"raw":15,"reduced":6,"isMaster":false,"steps":[15,6],"meaning":{"number":6,"archetype":"The Nurturer"}},"personalYear":{"raw":12,"reduced":3,"isMaster":false,"steps":[12,3],"meaning":{"number":3,"archetype":"The Communicator"}}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/numerology/vedic/life-path":{"post":{"tags":["Numerology: Vedic"],"summary":"Life Path Number (vedic)","description":"Calculate the Life Path number from birth date (year + month + day, reduced). Numerology: Vedic system.","operationId":"numerology_vedic_life-path","x-quality":"green","x-source":"Same Chaldean values per S.K. Sharma \"Numerology Made Easy\" + B.V. Raman, with Vedic interpretive context.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NumerologyNameDate"},"example":{"name":"John Smith","date":"1990-05-15"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/numerology/vedic/life-path \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"name\": \"John Smith\", \"date\": \"1990-05-15\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/numerology/vedic/life-path', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"name\": \"John Smith\",\n    \"date\": \"1990-05-15\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/numerology/vedic/life-path',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'name': \"John Smith\",\n      'date': \"1990-05-15\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('numerology/vedic/life-path', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'name' => 'John Smith',\n        'date' => '1990-05-15',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"date":{"type":"string","nullable":true},"lifePath":{"type":"object","properties":{"raw":{"type":"number","nullable":true},"reduced":{"type":"number","nullable":true},"isMaster":{"type":"boolean","nullable":true},"steps":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"meaning":{"type":"object","properties":{"number":{"type":"number","nullable":true},"archetype":{"type":"string","nullable":true},"strengths":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"shortRead":{"type":"string","nullable":true}},"nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"pythagorean","name":"John Smith","date":"1990-05-15","lifePath":{"raw":30,"reduced":3,"isMaster":false,"steps":[30,3],"meaning":{"number":3,"archetype":"The Communicator","strengths":["expression"],"shortRead":"creative communicator..."}}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/numerology/vedic/expression":{"post":{"tags":["Numerology: Vedic"],"summary":"Expression / Destiny (vedic)","description":"Calculate the Expression (Destiny) number from full birth name letters (all letters, reduced). Numerology: Vedic system.","operationId":"numerology_vedic_expression","x-quality":"green","x-source":"Same Chaldean values per S.K. Sharma \"Numerology Made Easy\" + B.V. Raman, with Vedic interpretive context.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NumerologyNameDate"},"example":{"name":"John Smith","date":"1990-05-15"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/numerology/vedic/expression \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"name\": \"John Smith\", \"date\": \"1990-05-15\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/numerology/vedic/expression', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"name\": \"John Smith\",\n    \"date\": \"1990-05-15\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/numerology/vedic/expression',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'name': \"John Smith\",\n      'date': \"1990-05-15\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('numerology/vedic/expression', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'name' => 'John Smith',\n        'date' => '1990-05-15',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"date":{"type":"string","nullable":true},"expression":{"type":"object","properties":{"raw":{"type":"number","nullable":true},"reduced":{"type":"number","nullable":true},"isMaster":{"type":"boolean","nullable":true},"steps":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"meaning":{"type":"object","properties":{"number":{"type":"number","nullable":true},"archetype":{"type":"string","nullable":true},"strengths":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"shortRead":{"type":"string","nullable":true}},"nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"pythagorean","name":"John Smith","date":"1990-05-15","expression":{"raw":30,"reduced":3,"isMaster":false,"steps":[30,3],"meaning":{"number":3,"archetype":"The Communicator","strengths":["expression"],"shortRead":"creative communicator..."}}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/numerology/vedic/soul-urge":{"post":{"tags":["Numerology: Vedic"],"summary":"Soul Urge / Heart's Desire (vedic)","description":"Calculate the Soul Urge number from the vowels of the full birth name. Numerology: Vedic system.","operationId":"numerology_vedic_soul-urge","x-quality":"green","x-source":"Same Chaldean values per S.K. Sharma \"Numerology Made Easy\" + B.V. Raman, with Vedic interpretive context.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NumerologyNameDate"},"example":{"name":"John Smith","date":"1990-05-15"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/numerology/vedic/soul-urge \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"name\": \"John Smith\", \"date\": \"1990-05-15\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/numerology/vedic/soul-urge', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"name\": \"John Smith\",\n    \"date\": \"1990-05-15\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/numerology/vedic/soul-urge',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'name': \"John Smith\",\n      'date': \"1990-05-15\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('numerology/vedic/soul-urge', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'name' => 'John Smith',\n        'date' => '1990-05-15',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"date":{"type":"string","nullable":true},"soulUrge":{"type":"object","properties":{"raw":{"type":"number","nullable":true},"reduced":{"type":"number","nullable":true},"isMaster":{"type":"boolean","nullable":true},"steps":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"meaning":{"type":"object","properties":{"number":{"type":"number","nullable":true},"archetype":{"type":"string","nullable":true},"strengths":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"shortRead":{"type":"string","nullable":true}},"nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"pythagorean","name":"John Smith","date":"1990-05-15","soulUrge":{"raw":30,"reduced":3,"isMaster":false,"steps":[30,3],"meaning":{"number":3,"archetype":"The Communicator","strengths":["expression"],"shortRead":"creative communicator..."}}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/numerology/vedic/personality":{"post":{"tags":["Numerology: Vedic"],"summary":"Personality (vedic)","description":"Calculate the Personality number from the consonants of the full birth name. Numerology: Vedic system.","operationId":"numerology_vedic_personality","x-quality":"green","x-source":"Same Chaldean values per S.K. Sharma \"Numerology Made Easy\" + B.V. Raman, with Vedic interpretive context.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NumerologyNameDate"},"example":{"name":"John Smith","date":"1990-05-15"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/numerology/vedic/personality \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"name\": \"John Smith\", \"date\": \"1990-05-15\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/numerology/vedic/personality', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"name\": \"John Smith\",\n    \"date\": \"1990-05-15\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/numerology/vedic/personality',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'name': \"John Smith\",\n      'date': \"1990-05-15\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('numerology/vedic/personality', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'name' => 'John Smith',\n        'date' => '1990-05-15',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"date":{"type":"string","nullable":true},"personality":{"type":"object","properties":{"raw":{"type":"number","nullable":true},"reduced":{"type":"number","nullable":true},"isMaster":{"type":"boolean","nullable":true},"steps":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"meaning":{"type":"object","properties":{"number":{"type":"number","nullable":true},"archetype":{"type":"string","nullable":true},"strengths":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"shortRead":{"type":"string","nullable":true}},"nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"pythagorean","name":"John Smith","date":"1990-05-15","personality":{"raw":30,"reduced":3,"isMaster":false,"steps":[30,3],"meaning":{"number":3,"archetype":"The Communicator","strengths":["expression"],"shortRead":"creative communicator..."}}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/numerology/vedic/birthday":{"post":{"tags":["Numerology: Vedic"],"summary":"Birthday (vedic)","description":"Calculate the Birthday number from the day-of-birth digit. Numerology: Vedic system.","operationId":"numerology_vedic_birthday","x-quality":"green","x-source":"Same Chaldean values per S.K. Sharma \"Numerology Made Easy\" + B.V. Raman, with Vedic interpretive context.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NumerologyNameDate"},"example":{"name":"John Smith","date":"1990-05-15"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/numerology/vedic/birthday \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"name\": \"John Smith\", \"date\": \"1990-05-15\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/numerology/vedic/birthday', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"name\": \"John Smith\",\n    \"date\": \"1990-05-15\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/numerology/vedic/birthday',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'name': \"John Smith\",\n      'date': \"1990-05-15\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('numerology/vedic/birthday', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'name' => 'John Smith',\n        'date' => '1990-05-15',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"date":{"type":"string","nullable":true},"birthday":{"type":"object","properties":{"raw":{"type":"number","nullable":true},"reduced":{"type":"number","nullable":true},"isMaster":{"type":"boolean","nullable":true},"steps":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"meaning":{"type":"object","properties":{"number":{"type":"number","nullable":true},"archetype":{"type":"string","nullable":true},"strengths":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"shortRead":{"type":"string","nullable":true}},"nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"pythagorean","name":"John Smith","date":"1990-05-15","birthday":{"raw":30,"reduced":3,"isMaster":false,"steps":[30,3],"meaning":{"number":3,"archetype":"The Communicator","strengths":["expression"],"shortRead":"creative communicator..."}}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/numerology/vedic/maturity":{"post":{"tags":["Numerology: Vedic"],"summary":"Maturity (vedic)","description":"Calculate the Maturity number: sum of Life Path and Expression, activates around age 35. Numerology: Vedic system.","operationId":"numerology_vedic_maturity","x-quality":"green","x-source":"Same Chaldean values per S.K. Sharma \"Numerology Made Easy\" + B.V. Raman, with Vedic interpretive context.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NumerologyNameDate"},"example":{"name":"John Smith","date":"1990-05-15"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/numerology/vedic/maturity \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"name\": \"John Smith\", \"date\": \"1990-05-15\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/numerology/vedic/maturity', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"name\": \"John Smith\",\n    \"date\": \"1990-05-15\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/numerology/vedic/maturity',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'name': \"John Smith\",\n      'date': \"1990-05-15\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('numerology/vedic/maturity', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'name' => 'John Smith',\n        'date' => '1990-05-15',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"date":{"type":"string","nullable":true},"maturity":{"type":"object","properties":{"raw":{"type":"number","nullable":true},"reduced":{"type":"number","nullable":true},"isMaster":{"type":"boolean","nullable":true},"steps":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"meaning":{"type":"object","properties":{"number":{"type":"number","nullable":true},"archetype":{"type":"string","nullable":true},"strengths":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"shortRead":{"type":"string","nullable":true}},"nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"pythagorean","name":"John Smith","date":"1990-05-15","maturity":{"raw":30,"reduced":3,"isMaster":false,"steps":[30,3],"meaning":{"number":3,"archetype":"The Communicator","strengths":["expression"],"shortRead":"creative communicator..."}}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/numerology/vedic/balance":{"post":{"tags":["Numerology: Vedic"],"summary":"Balance (vedic)","description":"Calculate the Balance number from initials of each part of the full name. Numerology: Vedic system.","operationId":"numerology_vedic_balance","x-quality":"green","x-source":"Same Chaldean values per S.K. Sharma \"Numerology Made Easy\" + B.V. Raman, with Vedic interpretive context.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NumerologyNameDate"},"example":{"name":"John Smith","date":"1990-05-15"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/numerology/vedic/balance \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"name\": \"John Smith\", \"date\": \"1990-05-15\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/numerology/vedic/balance', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"name\": \"John Smith\",\n    \"date\": \"1990-05-15\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/numerology/vedic/balance',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'name': \"John Smith\",\n      'date': \"1990-05-15\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('numerology/vedic/balance', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'name' => 'John Smith',\n        'date' => '1990-05-15',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"date":{"type":"string","nullable":true},"balance":{"type":"object","properties":{"raw":{"type":"number","nullable":true},"reduced":{"type":"number","nullable":true},"isMaster":{"type":"boolean","nullable":true},"steps":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"meaning":{"type":"object","properties":{"number":{"type":"number","nullable":true},"archetype":{"type":"string","nullable":true},"strengths":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"shortRead":{"type":"string","nullable":true}},"nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"pythagorean","name":"John Smith","date":"1990-05-15","balance":{"raw":30,"reduced":3,"isMaster":false,"steps":[30,3],"meaning":{"number":3,"archetype":"The Communicator","strengths":["expression"],"shortRead":"creative communicator..."}}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/numerology/vedic/challenge":{"post":{"tags":["Numerology: Vedic"],"summary":"Challenge Cycles (vedic)","description":"Calculate four Challenge cycles: life-area difficulties to master, derived from birth date components. Numerology: Vedic system.","operationId":"numerology_vedic_challenge","x-quality":"green","x-source":"Same Chaldean values per S.K. Sharma \"Numerology Made Easy\" + B.V. Raman, with Vedic interpretive context.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NumerologyNameDate"},"example":{"name":"John Smith","date":"1990-05-15"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/numerology/vedic/challenge \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"name\": \"John Smith\", \"date\": \"1990-05-15\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/numerology/vedic/challenge', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"name\": \"John Smith\",\n    \"date\": \"1990-05-15\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/numerology/vedic/challenge',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'name': \"John Smith\",\n      'date': \"1990-05-15\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('numerology/vedic/challenge', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'name' => 'John Smith',\n        'date' => '1990-05-15',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"challenges":{"type":"object","properties":{"first":{"type":"object","properties":{"reduced":{"type":"number","nullable":true},"meaning":{"type":"object","properties":{"archetype":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"second":{"type":"object","properties":{"reduced":{"type":"number","nullable":true}},"nullable":true},"third":{"type":"object","properties":{"reduced":{"type":"number","nullable":true}},"nullable":true},"fourth":{"type":"object","properties":{"reduced":{"type":"number","nullable":true}},"nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"vedic","challenges":{"first":{"reduced":4,"meaning":{"archetype":"The Builder"}},"second":{"reduced":1},"third":{"reduced":3},"fourth":{"reduced":5}}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/numerology/vedic/pinnacles":{"post":{"tags":["Numerology: Vedic"],"summary":"Pinnacle Cycles (vedic)","description":"Calculate four Pinnacle cycles with their age boundaries: life chapters of opportunity. Numerology: Vedic system.","operationId":"numerology_vedic_pinnacles","x-quality":"green","x-source":"Same Chaldean values per S.K. Sharma \"Numerology Made Easy\" + B.V. Raman, with Vedic interpretive context.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NumerologyNameDate"},"example":{"name":"John Smith","date":"1990-05-15"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/numerology/vedic/pinnacles \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"name\": \"John Smith\", \"date\": \"1990-05-15\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/numerology/vedic/pinnacles', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"name\": \"John Smith\",\n    \"date\": \"1990-05-15\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/numerology/vedic/pinnacles',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'name': \"John Smith\",\n      'date': \"1990-05-15\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('numerology/vedic/pinnacles', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'name' => 'John Smith',\n        'date' => '1990-05-15',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"pinnacles":{"type":"object","properties":{"first":{"type":"object","properties":{"reduced":{"type":"number","nullable":true},"endsAtAge":{"type":"number","nullable":true}},"nullable":true},"second":{"type":"object","properties":{"reduced":{"type":"number","nullable":true},"endsAtAge":{"type":"number","nullable":true}},"nullable":true},"third":{"type":"object","properties":{"reduced":{"type":"number","nullable":true},"endsAtAge":{"type":"number","nullable":true}},"nullable":true},"fourth":{"type":"object","properties":{"reduced":{"type":"number","nullable":true},"endsAtAge":{"type":"number","nullable":true}},"nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"vedic","pinnacles":{"first":{"reduced":7,"endsAtAge":30},"second":{"reduced":4,"endsAtAge":39},"third":{"reduced":3,"endsAtAge":48},"fourth":{"reduced":8,"endsAtAge":57}}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/numerology/vedic/personal-year":{"post":{"tags":["Numerology: Vedic"],"summary":"Personal Year (vedic)","description":"Calculate the Personal Year number for a given calendar year: the 9-year cycle of personal evolution. Numerology: Vedic system.","operationId":"numerology_vedic_personal-year","x-quality":"green","x-source":"Same Chaldean values per S.K. Sharma \"Numerology Made Easy\" + B.V. Raman, with Vedic interpretive context.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NumerologyPersonalYear"},"example":{"name":"John Smith","date":"1990-05-15","year":2026}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/numerology/vedic/personal-year \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"name\": \"John Smith\", \"date\": \"1990-05-15\", \"year\": 2026 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/numerology/vedic/personal-year', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"name\": \"John Smith\",\n    \"date\": \"1990-05-15\",\n    \"year\": 2026\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/numerology/vedic/personal-year',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'name': \"John Smith\",\n      'date': \"1990-05-15\",\n      'year': 2026\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('numerology/vedic/personal-year', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'name' => 'John Smith',\n        'date' => '1990-05-15',\n        'year' => 2026,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"date":{"type":"string","nullable":true},"personalYear":{"type":"object","properties":{"raw":{"type":"number","nullable":true},"reduced":{"type":"number","nullable":true},"isMaster":{"type":"boolean","nullable":true},"steps":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"meaning":{"type":"object","properties":{"number":{"type":"number","nullable":true},"archetype":{"type":"string","nullable":true},"strengths":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"shortRead":{"type":"string","nullable":true}},"nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"pythagorean","name":"John Smith","date":"1990-05-15","personalYear":{"raw":30,"reduced":3,"isMaster":false,"steps":[30,3],"meaning":{"number":3,"archetype":"The Communicator","strengths":["expression"],"shortRead":"creative communicator..."}}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/numerology/vedic/chart":{"post":{"tags":["Numerology: Vedic"],"summary":"Core Numbers Chart (vedic)","description":"The six core numbers in one call: Life Path, Expression, Soul Urge, Personality, Birthday and Personal Year (`year` defaults to the current year), each with its meaning. 20 credits instead of 60 for six single calls. Every number carries `meaning` (English) and `meaningLocalized` in the requested language (`translated: false` with the English text while a language's strings are on their way). Numerology: Vedic system.","operationId":"numerology_vedic_chart","x-quality":"green","x-source":"Same Chaldean values per S.K. Sharma \"Numerology Made Easy\" + B.V. Raman, with Vedic interpretive context.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NumerologyPersonalYear"},"example":{"name":"John Smith","date":"1990-05-15","year":2026}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/numerology/vedic/chart \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"name\": \"John Smith\", \"date\": \"1990-05-15\", \"year\": 2026 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/numerology/vedic/chart', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"name\": \"John Smith\",\n    \"date\": \"1990-05-15\",\n    \"year\": 2026\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/numerology/vedic/chart',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'name': \"John Smith\",\n      'date': \"1990-05-15\",\n      'year': 2026\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('numerology/vedic/chart', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'name' => 'John Smith',\n        'date' => '1990-05-15',\n        'year' => 2026,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"system":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"date":{"type":"string","nullable":true},"year":{"type":"number","nullable":true},"lifePath":{"type":"object","properties":{"raw":{"type":"number","nullable":true},"reduced":{"type":"number","nullable":true},"isMaster":{"type":"boolean","nullable":true},"steps":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"meaning":{"type":"object","properties":{"number":{"type":"number","nullable":true},"archetype":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"expression":{"type":"object","properties":{"raw":{"type":"number","nullable":true},"reduced":{"type":"number","nullable":true},"isMaster":{"type":"boolean","nullable":true},"steps":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"meaning":{"type":"object","properties":{"number":{"type":"number","nullable":true},"archetype":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"soulUrge":{"type":"object","properties":{"raw":{"type":"number","nullable":true},"reduced":{"type":"number","nullable":true},"isMaster":{"type":"boolean","nullable":true},"steps":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"meaning":{"type":"object","properties":{"number":{"type":"number","nullable":true},"archetype":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"personality":{"type":"object","properties":{"raw":{"type":"number","nullable":true},"reduced":{"type":"number","nullable":true},"isMaster":{"type":"boolean","nullable":true},"steps":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"meaning":{"type":"object","properties":{"number":{"type":"number","nullable":true},"archetype":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"birthday":{"type":"object","properties":{"raw":{"type":"number","nullable":true},"reduced":{"type":"number","nullable":true},"isMaster":{"type":"boolean","nullable":true},"steps":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"meaning":{"type":"object","properties":{"number":{"type":"number","nullable":true},"archetype":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"personalYear":{"type":"object","properties":{"raw":{"type":"number","nullable":true},"reduced":{"type":"number","nullable":true},"isMaster":{"type":"boolean","nullable":true},"steps":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"meaning":{"type":"object","properties":{"number":{"type":"number","nullable":true},"archetype":{"type":"string","nullable":true}},"nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"system":"vedic","name":"John Smith","date":"1990-05-15","year":2026,"lifePath":{"raw":12,"reduced":3,"isMaster":false,"steps":[12,3],"meaning":{"number":3,"archetype":"The Communicator"}},"expression":{"raw":44,"reduced":8,"isMaster":false,"steps":[44,8],"meaning":{"number":8,"archetype":"The Executive"}},"soulUrge":{"raw":15,"reduced":6,"isMaster":false,"steps":[15,6],"meaning":{"number":6,"archetype":"The Nurturer"}},"personality":{"raw":29,"reduced":11,"isMaster":true,"steps":[29,11],"meaning":{"number":11,"archetype":"The Master Intuitive"}},"birthday":{"raw":15,"reduced":6,"isMaster":false,"steps":[15,6],"meaning":{"number":6,"archetype":"The Nurturer"}},"personalYear":{"raw":12,"reduced":3,"isMaster":false,"steps":[12,3],"meaning":{"number":3,"archetype":"The Communicator"}}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/tarot/decks":{"get":{"tags":["Tarot: Rider-Waite-Smith"],"summary":"Tarot: Decks and Card Art","description":"Every deck with its spreads and the public-domain card art sets you can pick with `art` on any tarot route: id, artist, year, source, a preview image, the card back, and any card a set has no picture for.","operationId":"tarot_decks_get","x-quality":"green","x-source":"Arthur Edward Waite \"The Pictorial Key to the Tarot\" 1909 (PD); Pamela Colman Smith images PD since 2021. Cross-referenced Mary Greer \"Tarot for Your Self\".","security":[{"ApiKeyAuth":[]}],"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X GET https://api.astroway.info/v1/tarot/decks \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/tarot/decks', {\n  method: 'GET',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.get(\n    'https://api.astroway.info/v1/tarot/decks',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->get('tarot/decks', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"deck":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"cards":{"type":"number","nullable":true},"spreads":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"cardCount":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"art":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"artist":{"type":"string","nullable":true},"year":{"type":"string","nullable":true},"licence":{"type":"string","nullable":true},"source":{"type":"string","nullable":true},"note":{"type":"string","nullable":true},"preview":{"type":"object","properties":{"url":{"type":"string","nullable":true},"url2x":{"type":"string","nullable":true},"urlSmall":{"type":"string","nullable":true},"width":{"type":"number","nullable":true},"height":{"type":"number","nullable":true},"art":{"type":"string","nullable":true}},"nullable":true},"back":{"type":"object","properties":{"url":{"type":"string","nullable":true},"url2x":{"type":"string","nullable":true},"urlSmall":{"type":"string","nullable":true},"width":{"type":"number","nullable":true},"height":{"type":"number","nullable":true},"art":{"type":"string","nullable":true}},"nullable":true},"missing":{"type":"array","items":{},"nullable":true}},"nullable":true},"nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"items":[{"deck":"rider-waite","name":"Rider-Waite-Smith","cards":78,"spreads":[{"slug":"three-card","name":"Past / Present / Future","cardCount":3}],"art":[{"id":"rws-1909","name":"Rider-Waite-Smith 1909","artist":"Pamela Colman Smith","year":"1909","licence":"Public domain","source":"https://commons.wikimedia.org/wiki/Category:Rider-Waite_tarot_deck_(Roses_%26_Lilies)","note":"The first printing, with the original colouring.","preview":{"url":"https://cdn.astroway.info/tarot/rws-1909/the-fool.webp","url2x":"https://cdn.astroway.info/tarot/rws-1909/the-fool@2x.webp","urlSmall":"https://cdn.astroway.info/tarot/rws-1909/the-fool-300.webp","width":600,"height":1039,"art":"rws-1909"},"back":{"url":"https://cdn.astroway.info/tarot/rws-1909/back.webp","url2x":"https://cdn.astroway.info/tarot/rws-1909/back@2x.webp","urlSmall":"https://cdn.astroway.info/tarot/rws-1909/back-300.webp","width":600,"height":1039,"art":"rws-1909"},"missing":[]}]}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/tarot/rider-waite/cards":{"get":{"tags":["Tarot: Rider-Waite-Smith"],"summary":"RWS: All Cards","description":"Full 78-card RWS deck listing with upright/reversed meanings, keywords, astrology, and yes/no affinity.","operationId":"tarot_rider-waite_cards_get","x-quality":"green","x-source":"Arthur Edward Waite \"The Pictorial Key to the Tarot\" 1909 (PD); Pamela Colman Smith images PD since 2021. Cross-referenced Mary Greer \"Tarot for Your Self\".","security":[{"ApiKeyAuth":[]}],"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X GET https://api.astroway.info/v1/tarot/rider-waite/cards \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/tarot/rider-waite/cards', {\n  method: 'GET',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.get(\n    'https://api.astroway.info/v1/tarot/rider-waite/cards',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->get('tarot/rider-waite/cards', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"upright":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"astrology":{"type":"string","nullable":true},"numerology":{"type":"number","nullable":true},"yes":{"type":"string","nullable":true},"slug":{"type":"string","nullable":true},"category":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"count":{"type":"number","nullable":true}}}}},"example":{"ok":true,"data":{"items":[{"number":0,"name":"The Fool","upright":{"keywords":["new beginnings"],"meaning":"A leap of faith into the unknown. Trust the journey, embrace beginner's mind."},"reversed":{"keywords":["naivety"],"meaning":"Reckless leaps without grounding. Pause and consider before jumping."},"astrology":"Uranus","numerology":0,"yes":"maybe","slug":"the-fool","category":"major"}],"count":78}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/tarot/rider-waite/cards/{slug}":{"get":{"tags":["Tarot: Rider-Waite-Smith"],"summary":"RWS: Single Card","description":"Single RWS card lookup by slug (e.g. \"the-fool\", \"ace-of-cups\"). Returns full meaning structure.","operationId":"tarot_rider-waite_cards_{slug}_get","x-quality":"green","x-source":"Arthur Edward Waite \"The Pictorial Key to the Tarot\" 1909 (PD); Pamela Colman Smith images PD since 2021. Cross-referenced Mary Greer \"Tarot for Your Self\".","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"slug","in":"path","required":true,"description":"Card slug, lowercase and hyphenated.","schema":{"type":"string"},"example":"the-fool"},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X GET https://api.astroway.info/v1/tarot/rider-waite/cards/{slug} \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/tarot/rider-waite/cards/{slug}', {\n  method: 'GET',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.get(\n    'https://api.astroway.info/v1/tarot/rider-waite/cards/{slug}',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->get('tarot/rider-waite/cards/{slug}', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"category":{"type":"string","nullable":true},"upright":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"slug":"the-fool","name":"The Fool","category":"major","upright":{"keywords":["new beginnings"],"meaning":"..."}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}}}},"/tarot/rider-waite/majors":{"get":{"tags":["Tarot: Rider-Waite-Smith"],"summary":"RWS: 22 Majors","description":"The 22 Major Arcana cards only.","operationId":"tarot_rider-waite_majors_get","x-quality":"green","x-source":"Arthur Edward Waite \"The Pictorial Key to the Tarot\" 1909 (PD); Pamela Colman Smith images PD since 2021. Cross-referenced Mary Greer \"Tarot for Your Self\".","security":[{"ApiKeyAuth":[]}],"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X GET https://api.astroway.info/v1/tarot/rider-waite/majors \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/tarot/rider-waite/majors', {\n  method: 'GET',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.get(\n    'https://api.astroway.info/v1/tarot/rider-waite/majors',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->get('tarot/rider-waite/majors', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"upright":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"astrology":{"type":"string","nullable":true},"numerology":{"type":"number","nullable":true},"yes":{"type":"string","nullable":true},"slug":{"type":"string","nullable":true},"category":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"count":{"type":"number","nullable":true}}}}},"example":{"ok":true,"data":{"items":[{"number":0,"name":"The Fool","upright":{"keywords":["new beginnings"],"meaning":"A leap of faith into the unknown. Trust the journey, embrace beginner's mind."},"reversed":{"keywords":["naivety"],"meaning":"Reckless leaps without grounding. Pause and consider before jumping."},"astrology":"Uranus","numerology":0,"yes":"maybe","slug":"the-fool","category":"major"}],"count":22}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/tarot/rider-waite/minors":{"get":{"tags":["Tarot: Rider-Waite-Smith"],"summary":"RWS: 40 Minors","description":"The 40 numbered Minor Arcana cards (Ace through 10 of each suit).","operationId":"tarot_rider-waite_minors_get","x-quality":"green","x-source":"Arthur Edward Waite \"The Pictorial Key to the Tarot\" 1909 (PD); Pamela Colman Smith images PD since 2021. Cross-referenced Mary Greer \"Tarot for Your Self\".","security":[{"ApiKeyAuth":[]}],"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X GET https://api.astroway.info/v1/tarot/rider-waite/minors \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/tarot/rider-waite/minors', {\n  method: 'GET',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.get(\n    'https://api.astroway.info/v1/tarot/rider-waite/minors',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->get('tarot/rider-waite/minors', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"category":{"type":"string","nullable":true},"suit":{"type":"string","nullable":true},"rank":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"upright":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"astrology":{"type":"string","nullable":true},"numerology":{"type":"number","nullable":true},"yes":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"count":{"type":"number","nullable":true}}}}},"example":{"ok":true,"data":{"items":[{"slug":"ace-of-wands","number":1,"name":"Ace of Wands","category":"minor","suit":"wands","rank":"ace","element":"fire","upright":{"keywords":["inspiration"],"meaning":"A creative or entrepreneurial seed; act on inspiration."},"reversed":{"keywords":["lack of energy"],"meaning":"Inspired idea stalled or unfinished."},"astrology":"fire signs","numerology":1,"yes":"yes"}],"count":40}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/tarot/rider-waite/courts":{"get":{"tags":["Tarot: Rider-Waite-Smith"],"summary":"RWS: 16 Court Cards","description":"The 16 Court cards (Page, Knight, Queen, King × 4 suits).","operationId":"tarot_rider-waite_courts_get","x-quality":"green","x-source":"Arthur Edward Waite \"The Pictorial Key to the Tarot\" 1909 (PD); Pamela Colman Smith images PD since 2021. Cross-referenced Mary Greer \"Tarot for Your Self\".","security":[{"ApiKeyAuth":[]}],"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X GET https://api.astroway.info/v1/tarot/rider-waite/courts \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/tarot/rider-waite/courts', {\n  method: 'GET',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.get(\n    'https://api.astroway.info/v1/tarot/rider-waite/courts',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->get('tarot/rider-waite/courts', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"category":{"type":"string","nullable":true},"suit":{"type":"string","nullable":true},"rank":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"upright":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"astrology":{"type":"string","nullable":true},"numerology":{"type":"number","nullable":true},"yes":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"count":{"type":"number","nullable":true}}}}},"example":{"ok":true,"data":{"items":[{"slug":"page-of-wands","number":11,"name":"Page of Wands","category":"court","suit":"wands","rank":"page","element":"fire","upright":{"keywords":["exploration"],"meaning":"Youthful messenger; news of opportunity."},"reversed":{"keywords":["lack of direction"],"meaning":"Scattered or distracted."},"astrology":"earth of fire","numerology":2,"yes":"maybe"}],"count":16}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/tarot/rider-waite/suits/{suit}":{"get":{"tags":["Tarot: Rider-Waite-Smith"],"summary":"RWS: Suit","description":"All 14 cards of a suit (wands, cups, swords, or pentacles).","operationId":"tarot_rider-waite_suits_{suit}_get","x-quality":"green","x-source":"Arthur Edward Waite \"The Pictorial Key to the Tarot\" 1909 (PD); Pamela Colman Smith images PD since 2021. Cross-referenced Mary Greer \"Tarot for Your Self\".","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"suit","in":"path","required":true,"description":"Minor arcana suit.","schema":{"type":"string","enum":["wands","cups","swords","pentacles"]},"example":"cups"},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X GET https://api.astroway.info/v1/tarot/rider-waite/suits/{suit} \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/tarot/rider-waite/suits/{suit}', {\n  method: 'GET',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.get(\n    'https://api.astroway.info/v1/tarot/rider-waite/suits/{suit}',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->get('tarot/rider-waite/suits/{suit}', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"suit":{"type":"string","nullable":true},"items":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"category":{"type":"string","nullable":true},"suit":{"type":"string","nullable":true},"rank":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"upright":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"astrology":{"type":"string","nullable":true},"numerology":{"type":"number","nullable":true},"yes":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"count":{"type":"number","nullable":true}}}}},"example":{"ok":true,"data":{"suit":"cups","items":[{"slug":"ace-of-cups","number":1,"name":"Ace of Cups","category":"minor","suit":"cups","rank":"ace","element":"water","upright":{"keywords":["new feelings"],"meaning":"New emotional or spiritual beginning; love arriving."},"reversed":{"keywords":["emotional loss"],"meaning":"Emotion suppressed or lost."},"astrology":"water signs","numerology":1,"yes":"yes"}],"count":14}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}}}},"/tarot/rider-waite/numbers/{n}":{"get":{"tags":["Tarot: Rider-Waite-Smith"],"summary":"RWS: Cards of Number","description":"All Minor Arcana cards of a given number 1-14 (Ace=1..King=14).","operationId":"tarot_rider-waite_numbers_{n}_get","x-quality":"green","x-source":"Arthur Edward Waite \"The Pictorial Key to the Tarot\" 1909 (PD); Pamela Colman Smith images PD since 2021. Cross-referenced Mary Greer \"Tarot for Your Self\".","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"n","in":"path","required":true,"description":"Card number within a suit. 1 is the Ace, 11-14 are the courts. Majors are excluded.","schema":{"type":"integer","minimum":1,"maximum":14},"example":3},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X GET https://api.astroway.info/v1/tarot/rider-waite/numbers/{n} \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/tarot/rider-waite/numbers/{n}', {\n  method: 'GET',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.get(\n    'https://api.astroway.info/v1/tarot/rider-waite/numbers/{n}',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->get('tarot/rider-waite/numbers/{n}', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"number":{"type":"number","nullable":true},"items":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"category":{"type":"string","nullable":true},"suit":{"type":"string","nullable":true},"rank":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"upright":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"astrology":{"type":"string","nullable":true},"numerology":{"type":"number","nullable":true},"yes":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"count":{"type":"number","nullable":true}}}}},"example":{"ok":true,"data":{"number":5,"items":[{"slug":"5-of-wands","number":5,"name":"Five of Wands","category":"minor","suit":"wands","rank":"5","element":"fire","upright":{"keywords":["conflict"],"meaning":"Clash of egos or tensions; productive friction."},"reversed":{"keywords":["avoiding conflict"],"meaning":"Tension de-escalating or being suppressed."},"astrology":"Saturn in Leo","numerology":5,"yes":"no"}],"count":4}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}}}},"/tarot/rider-waite/elements/{element}":{"get":{"tags":["Tarot: Rider-Waite-Smith"],"summary":"RWS: Cards by Element","description":"All Minor cards mapped to fire / water / air / earth element.","operationId":"tarot_rider-waite_elements_{element}_get","x-quality":"green","x-source":"Arthur Edward Waite \"The Pictorial Key to the Tarot\" 1909 (PD); Pamela Colman Smith images PD since 2021. Cross-referenced Mary Greer \"Tarot for Your Self\".","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"element","in":"path","required":true,"description":"Elemental attribution.","schema":{"type":"string","enum":["fire","water","air","earth"]},"example":"fire"},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X GET https://api.astroway.info/v1/tarot/rider-waite/elements/{element} \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/tarot/rider-waite/elements/{element}', {\n  method: 'GET',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.get(\n    'https://api.astroway.info/v1/tarot/rider-waite/elements/{element}',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->get('tarot/rider-waite/elements/{element}', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"element":{"type":"string","nullable":true},"items":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"category":{"type":"string","nullable":true},"suit":{"type":"string","nullable":true},"rank":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"upright":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"astrology":{"type":"string","nullable":true},"numerology":{"type":"number","nullable":true},"yes":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"count":{"type":"number","nullable":true}}}}},"example":{"ok":true,"data":{"element":"fire","items":[{"slug":"ace-of-wands","number":1,"name":"Ace of Wands","category":"minor","suit":"wands","rank":"ace","element":"fire","upright":{"keywords":["inspiration"],"meaning":"A creative or entrepreneurial seed; act on inspiration."},"reversed":{"keywords":["lack of energy"],"meaning":"Inspired idea stalled or unfinished."},"astrology":"fire signs","numerology":1,"yes":"yes"}],"count":14}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}}}},"/tarot/rider-waite/keywords/{keyword}":{"get":{"tags":["Tarot: Rider-Waite-Smith"],"summary":"RWS: Cards by Keyword","description":"Substring search across upright and reversed keywords across all 78 cards.","operationId":"tarot_rider-waite_keywords_{keyword}_get","x-quality":"green","x-source":"Arthur Edward Waite \"The Pictorial Key to the Tarot\" 1909 (PD); Pamela Colman Smith images PD since 2021. Cross-referenced Mary Greer \"Tarot for Your Self\".","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"keyword","in":"path","required":true,"description":"Keyword to match. Substring match across both upright and reversed keywords.","schema":{"type":"string"},"example":"change"},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X GET https://api.astroway.info/v1/tarot/rider-waite/keywords/{keyword} \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/tarot/rider-waite/keywords/{keyword}', {\n  method: 'GET',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.get(\n    'https://api.astroway.info/v1/tarot/rider-waite/keywords/{keyword}',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->get('tarot/rider-waite/keywords/{keyword}', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"keyword":{"type":"string","nullable":true},"items":{"type":"array","items":{"type":"object","properties":{"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"upright":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"astrology":{"type":"string","nullable":true},"numerology":{"type":"number","nullable":true},"yes":{"type":"string","nullable":true},"slug":{"type":"string","nullable":true},"category":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"count":{"type":"number","nullable":true}}}}},"example":{"ok":true,"data":{"keyword":"love","items":[{"number":6,"name":"The Lovers","upright":{"keywords":["love"],"meaning":"Major partnership or value-aligned choice."},"reversed":{"keywords":["disharmony"],"meaning":"Relationship friction or values misalignment."},"astrology":"Gemini","numerology":6,"yes":"yes","slug":"the-lovers","category":"major"}],"count":2}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}}}},"/tarot/rider-waite/spreads":{"get":{"tags":["Tarot: Rider-Waite-Smith"],"summary":"RWS: All Spreads","description":"List of all 12 RWS spread definitions.","operationId":"tarot_rider-waite_spreads_get","x-quality":"green","x-source":"Arthur Edward Waite \"The Pictorial Key to the Tarot\" 1909 (PD); Pamela Colman Smith images PD since 2021. Cross-referenced Mary Greer \"Tarot for Your Self\".","security":[{"ApiKeyAuth":[]}],"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X GET https://api.astroway.info/v1/tarot/rider-waite/spreads \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/tarot/rider-waite/spreads', {\n  method: 'GET',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.get(\n    'https://api.astroway.info/v1/tarot/rider-waite/spreads',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->get('tarot/rider-waite/spreads', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"cardCount":{"type":"number","nullable":true},"description":{"type":"string","nullable":true},"positions":{"type":"array","items":{"type":"object","properties":{"index":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"nullable":true}},"nullable":true},"nullable":true},"count":{"type":"number","nullable":true}}}}},"example":{"ok":true,"data":{"items":[{"slug":"single-card","name":"Single Card","cardCount":1,"description":"Direct guidance on the question at hand.","positions":[{"index":0,"name":"The Card","meaning":"The essential answer or theme."}]}],"count":12}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/tarot/rider-waite/spreads/{slug}":{"get":{"tags":["Tarot: Rider-Waite-Smith"],"summary":"RWS: Single Spread","description":"Definition of a single spread by slug.","operationId":"tarot_rider-waite_spreads_{slug}_get","x-quality":"green","x-source":"Arthur Edward Waite \"The Pictorial Key to the Tarot\" 1909 (PD); Pamela Colman Smith images PD since 2021. Cross-referenced Mary Greer \"Tarot for Your Self\".","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"slug","in":"path","required":true,"description":"Spread slug, lowercase and hyphenated.","schema":{"type":"string"},"example":"celtic-cross"},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X GET https://api.astroway.info/v1/tarot/rider-waite/spreads/{slug} \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/tarot/rider-waite/spreads/{slug}', {\n  method: 'GET',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.get(\n    'https://api.astroway.info/v1/tarot/rider-waite/spreads/{slug}',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->get('tarot/rider-waite/spreads/{slug}', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"cardCount":{"type":"number","nullable":true},"description":{"type":"string","nullable":true},"positions":{"type":"array","items":{"type":"object","properties":{"index":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"slug":"three-card","name":"Past / Present / Future","cardCount":3,"description":"Classic three-card spread for time-line clarity.","positions":[{"index":0,"name":"Past","meaning":"Forces from the past shaping the situation."}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}}}},"/tarot/rider-waite/draw/single":{"post":{"tags":["Tarot: Rider-Waite-Smith"],"summary":"RWS: Single Card Draw","description":"Draw 1 card from the RWS deck. Optional seed for deterministic shuffle.","operationId":"tarot_rider-waite_draw_single","x-quality":"green","x-source":"Arthur Edward Waite \"The Pictorial Key to the Tarot\" 1909 (PD); Pamela Colman Smith images PD since 2021. Cross-referenced Mary Greer \"Tarot for Your Self\".","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TarotDraw"},"example":{"seed":12345,"question":"What should I focus on?","allowReversed":true}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/tarot/rider-waite/draw/single \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"seed\": 12345, \"question\": \"What should I focus on?\", \"allowReversed\": true }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/tarot/rider-waite/draw/single', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"seed\": 12345,\n    \"question\": \"What should I focus on?\",\n    \"allowReversed\": true\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/tarot/rider-waite/draw/single',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'seed': 12345,\n      'question': \"What should I focus on?\",\n      'allowReversed': True\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('tarot/rider-waite/draw/single', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'seed' => 12345,\n        'question' => 'What should I focus on?',\n        'allowReversed' => true,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"spread":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"cardCount":{"type":"number","nullable":true}},"nullable":true},"seed":{"type":"number","nullable":true},"drawn":{"type":"array","items":{"type":"object","properties":{"position":{"type":"object","properties":{"index":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"card":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"category":{"type":"string","nullable":true},"suit":{"type":"string","nullable":true},"rank":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"upright":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"astrology":{"type":"string","nullable":true},"numerology":{"type":"number","nullable":true},"yes":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true},"localized":{"type":"object","properties":{"cards":{"type":"object","properties":{"8-of-pentacles":{"type":"object","properties":{"name":{"type":"string","nullable":true},"suit":{"type":"string","nullable":true},"nameLocalized":{"type":"boolean","nullable":true},"upright":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"textLocalized":{"type":"boolean","nullable":true}},"nullable":true}},"nullable":true},"positions":{"type":"array","items":{"type":"object","properties":{"index":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"spread":{"type":"object","properties":{"name":{"type":"string","nullable":true}},"nullable":true},"textLocalized":{"type":"boolean","nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"spread":{"slug":"single-card","name":"Single Card","cardCount":1},"seed":12345,"drawn":[{"position":{"index":0,"name":"The Card","meaning":"The essential answer or theme."},"card":{"slug":"8-of-pentacles","number":8,"name":"Eight of Pentacles","category":"minor","suit":"pentacles","rank":"8","element":"earth","upright":{"keywords":["mastery"],"meaning":"Disciplined practice toward mastery."},"reversed":{"keywords":["lack of focus"],"meaning":"Cutting corners on the work."},"astrology":"Sun in Virgo","numerology":8,"yes":"yes"},"reversed":false}],"localized":{"cards":{"8-of-pentacles":{"name":"Вісімка Пентаклів","suit":"Пентаклі","nameLocalized":true,"upright":{"keywords":["майстерність","ремесло","учнівство"],"meaning":"Дисциплінована практика на шляху до майстерності."},"reversed":{"keywords":["брак зосередженості","обхідні шляхи"],"meaning":"Робота абияк, аби швидше."},"textLocalized":true}},"positions":[{"index":0,"name":"Карта","meaning":"Суть відповіді або головна тема."}],"spread":{"name":"Одна карта"},"textLocalized":true}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/tarot/rider-waite/draw/three-card":{"post":{"tags":["Tarot: Rider-Waite-Smith"],"summary":"RWS: Three-Card Draw","description":"Past / Present / Future three-card spread.","operationId":"tarot_rider-waite_draw_three-card","x-quality":"green","x-source":"Arthur Edward Waite \"The Pictorial Key to the Tarot\" 1909 (PD); Pamela Colman Smith images PD since 2021. Cross-referenced Mary Greer \"Tarot for Your Self\".","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TarotDraw"},"example":{"seed":12345,"question":"What should I focus on?","allowReversed":true}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/tarot/rider-waite/draw/three-card \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"seed\": 12345, \"question\": \"What should I focus on?\", \"allowReversed\": true }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/tarot/rider-waite/draw/three-card', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"seed\": 12345,\n    \"question\": \"What should I focus on?\",\n    \"allowReversed\": true\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/tarot/rider-waite/draw/three-card',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'seed': 12345,\n      'question': \"What should I focus on?\",\n      'allowReversed': True\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('tarot/rider-waite/draw/three-card', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'seed' => 12345,\n        'question' => 'What should I focus on?',\n        'allowReversed' => true,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"spread":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"cardCount":{"type":"number","nullable":true}},"nullable":true},"seed":{"type":"number","nullable":true},"drawn":{"type":"array","items":{"type":"object","properties":{"position":{"type":"object","properties":{"index":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"card":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"category":{"type":"string","nullable":true},"suit":{"type":"string","nullable":true},"rank":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"upright":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"astrology":{"type":"string","nullable":true},"numerology":{"type":"number","nullable":true},"yes":{"type":"string","nullable":true},"image":{"type":"object","properties":{"url":{"type":"string","nullable":true},"url2x":{"type":"string","nullable":true},"urlSmall":{"type":"string","nullable":true},"width":{"type":"number","nullable":true},"height":{"type":"number","nullable":true},"art":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"reversed":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true},"localized":{"type":"object","properties":{"cards":{"type":"object","properties":{"8-of-pentacles":{"type":"object","properties":{"name":{"type":"string","nullable":true},"suit":{"type":"string","nullable":true},"nameLocalized":{"type":"boolean","nullable":true},"upright":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"textLocalized":{"type":"boolean","nullable":true}},"nullable":true}},"nullable":true},"positions":{"type":"array","items":{"type":"object","properties":{"index":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"spread":{"type":"object","properties":{"name":{"type":"string","nullable":true}},"nullable":true},"textLocalized":{"type":"boolean","nullable":true}},"nullable":true},"back":{"type":"object","properties":{"url":{"type":"string","nullable":true},"url2x":{"type":"string","nullable":true},"urlSmall":{"type":"string","nullable":true},"width":{"type":"number","nullable":true},"height":{"type":"number","nullable":true},"art":{"type":"string","nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"spread":{"slug":"three-card","name":"Past / Present / Future","cardCount":3},"seed":12345,"drawn":[{"position":{"index":0,"name":"Past","meaning":"Forces from the past shaping the situation."},"card":{"slug":"8-of-pentacles","number":8,"name":"Eight of Pentacles","category":"minor","suit":"pentacles","rank":"8","element":"earth","upright":{"keywords":["mastery"],"meaning":"Disciplined practice toward mastery."},"reversed":{"keywords":["lack of focus"],"meaning":"Cutting corners on the work."},"astrology":"Sun in Virgo","numerology":8,"yes":"yes","image":{"url":"https://cdn.astroway.info/tarot/rws-1909/8-of-pentacles.webp","url2x":"https://cdn.astroway.info/tarot/rws-1909/8-of-pentacles@2x.webp","urlSmall":"https://cdn.astroway.info/tarot/rws-1909/8-of-pentacles-300.webp","width":600,"height":1039,"art":"rws-1909"}},"reversed":false}],"localized":{"cards":{"8-of-pentacles":{"name":"Вісімка Пентаклів","suit":"Пентаклі","nameLocalized":true,"upright":{"keywords":["майстерність","ремесло","учнівство"],"meaning":"Дисциплінована практика на шляху до майстерності."},"reversed":{"keywords":["брак зосередженості","обхідні шляхи"],"meaning":"Робота абияк, аби швидше."},"textLocalized":true}},"positions":[{"index":0,"name":"Минуле","meaning":"Сили з минулого, що формують ситуацію."}],"spread":{"name":"Минуле / Теперішнє / Майбутнє"},"textLocalized":true},"back":{"url":"https://cdn.astroway.info/tarot/rws-1909/back.webp","url2x":"https://cdn.astroway.info/tarot/rws-1909/back@2x.webp","urlSmall":"https://cdn.astroway.info/tarot/rws-1909/back-300.webp","width":600,"height":1039,"art":"rws-1909"}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/tarot/rider-waite/draw/celtic-cross":{"post":{"tags":["Tarot: Rider-Waite-Smith"],"summary":"RWS: Celtic Cross","description":"Classical 10-card Celtic Cross spread.","operationId":"tarot_rider-waite_draw_celtic-cross","x-quality":"green","x-source":"Arthur Edward Waite \"The Pictorial Key to the Tarot\" 1909 (PD); Pamela Colman Smith images PD since 2021. Cross-referenced Mary Greer \"Tarot for Your Self\".","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TarotDraw"},"example":{"seed":12345,"question":"What should I focus on?","allowReversed":true}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/tarot/rider-waite/draw/celtic-cross \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"seed\": 12345, \"question\": \"What should I focus on?\", \"allowReversed\": true }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/tarot/rider-waite/draw/celtic-cross', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"seed\": 12345,\n    \"question\": \"What should I focus on?\",\n    \"allowReversed\": true\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/tarot/rider-waite/draw/celtic-cross',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'seed': 12345,\n      'question': \"What should I focus on?\",\n      'allowReversed': True\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('tarot/rider-waite/draw/celtic-cross', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'seed' => 12345,\n        'question' => 'What should I focus on?',\n        'allowReversed' => true,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"spread":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"cardCount":{"type":"number","nullable":true}},"nullable":true},"seed":{"type":"number","nullable":true},"drawn":{"type":"array","items":{"type":"object","properties":{"position":{"type":"object","properties":{"index":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"card":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"category":{"type":"string","nullable":true},"suit":{"type":"string","nullable":true},"rank":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"upright":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"astrology":{"type":"string","nullable":true},"numerology":{"type":"number","nullable":true},"yes":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true},"localized":{"type":"object","properties":{"cards":{"type":"object","properties":{"8-of-pentacles":{"type":"object","properties":{"name":{"type":"string","nullable":true},"suit":{"type":"string","nullable":true},"nameLocalized":{"type":"boolean","nullable":true},"upright":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"textLocalized":{"type":"boolean","nullable":true}},"nullable":true}},"nullable":true},"positions":{"type":"array","items":{"type":"object","properties":{"index":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"spread":{"type":"object","properties":{"name":{"type":"string","nullable":true}},"nullable":true},"textLocalized":{"type":"boolean","nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"spread":{"slug":"celtic-cross","name":"Celtic Cross","cardCount":10},"seed":12345,"drawn":[{"position":{"index":0,"name":"Present","meaning":"The heart of the matter now."},"card":{"slug":"8-of-pentacles","number":8,"name":"Eight of Pentacles","category":"minor","suit":"pentacles","rank":"8","element":"earth","upright":{"keywords":["mastery"],"meaning":"Disciplined practice toward mastery."},"reversed":{"keywords":["lack of focus"],"meaning":"Cutting corners on the work."},"astrology":"Sun in Virgo","numerology":8,"yes":"yes"},"reversed":false}],"localized":{"cards":{"8-of-pentacles":{"name":"Вісімка Пентаклів","suit":"Пентаклі","nameLocalized":true,"upright":{"keywords":["майстерність","ремесло","учнівство"],"meaning":"Дисциплінована практика на шляху до майстерності."},"reversed":{"keywords":["брак зосередженості","обхідні шляхи"],"meaning":"Робота абияк, аби швидше."},"textLocalized":true}},"positions":[{"index":0,"name":"Теперішнє","meaning":"Суть питання зараз."}],"spread":{"name":"Кельтський хрест"},"textLocalized":true}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/tarot/rider-waite/draw/horseshoe":{"post":{"tags":["Tarot: Rider-Waite-Smith"],"summary":"RWS: Horseshoe","description":"7-card horseshoe progression.","operationId":"tarot_rider-waite_draw_horseshoe","x-quality":"green","x-source":"Arthur Edward Waite \"The Pictorial Key to the Tarot\" 1909 (PD); Pamela Colman Smith images PD since 2021. Cross-referenced Mary Greer \"Tarot for Your Self\".","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TarotDraw"},"example":{"seed":12345,"question":"What should I focus on?","allowReversed":true}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/tarot/rider-waite/draw/horseshoe \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"seed\": 12345, \"question\": \"What should I focus on?\", \"allowReversed\": true }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/tarot/rider-waite/draw/horseshoe', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"seed\": 12345,\n    \"question\": \"What should I focus on?\",\n    \"allowReversed\": true\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/tarot/rider-waite/draw/horseshoe',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'seed': 12345,\n      'question': \"What should I focus on?\",\n      'allowReversed': True\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('tarot/rider-waite/draw/horseshoe', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'seed' => 12345,\n        'question' => 'What should I focus on?',\n        'allowReversed' => true,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"spread":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"cardCount":{"type":"number","nullable":true}},"nullable":true},"seed":{"type":"number","nullable":true},"drawn":{"type":"array","items":{"type":"object","properties":{"position":{"type":"object","properties":{"index":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"card":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"category":{"type":"string","nullable":true},"suit":{"type":"string","nullable":true},"rank":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"upright":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"astrology":{"type":"string","nullable":true},"numerology":{"type":"number","nullable":true},"yes":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"spread":{"slug":"horseshoe","name":"Horseshoe","cardCount":7},"seed":12345,"drawn":[{"position":{"index":0,"name":"Past","meaning":"Past influences."},"card":{"slug":"8-of-pentacles","number":8,"name":"Eight of Pentacles","category":"minor","suit":"pentacles","rank":"8","element":"earth","upright":{"keywords":["mastery"],"meaning":"Disciplined practice toward mastery."},"reversed":{"keywords":["lack of focus"],"meaning":"Cutting corners on the work."},"astrology":"Sun in Virgo","numerology":8,"yes":"yes"},"reversed":false}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/tarot/rider-waite/draw/relationship":{"post":{"tags":["Tarot: Rider-Waite-Smith"],"summary":"RWS: Relationship","description":"7-card relationship dynamics.","operationId":"tarot_rider-waite_draw_relationship","x-quality":"green","x-source":"Arthur Edward Waite \"The Pictorial Key to the Tarot\" 1909 (PD); Pamela Colman Smith images PD since 2021. Cross-referenced Mary Greer \"Tarot for Your Self\".","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TarotDraw"},"example":{"seed":12345,"question":"What should I focus on?","allowReversed":true}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/tarot/rider-waite/draw/relationship \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"seed\": 12345, \"question\": \"What should I focus on?\", \"allowReversed\": true }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/tarot/rider-waite/draw/relationship', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"seed\": 12345,\n    \"question\": \"What should I focus on?\",\n    \"allowReversed\": true\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/tarot/rider-waite/draw/relationship',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'seed': 12345,\n      'question': \"What should I focus on?\",\n      'allowReversed': True\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('tarot/rider-waite/draw/relationship', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'seed' => 12345,\n        'question' => 'What should I focus on?',\n        'allowReversed' => true,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"spread":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"cardCount":{"type":"number","nullable":true}},"nullable":true},"seed":{"type":"number","nullable":true},"drawn":{"type":"array","items":{"type":"object","properties":{"position":{"type":"object","properties":{"index":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"card":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"category":{"type":"string","nullable":true},"suit":{"type":"string","nullable":true},"rank":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"upright":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"astrology":{"type":"string","nullable":true},"numerology":{"type":"number","nullable":true},"yes":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"spread":{"slug":"relationship","name":"Relationship","cardCount":7},"seed":12345,"drawn":[{"position":{"index":0,"name":"You","meaning":"Your contribution."},"card":{"slug":"8-of-pentacles","number":8,"name":"Eight of Pentacles","category":"minor","suit":"pentacles","rank":"8","element":"earth","upright":{"keywords":["mastery"],"meaning":"Disciplined practice toward mastery."},"reversed":{"keywords":["lack of focus"],"meaning":"Cutting corners on the work."},"astrology":"Sun in Virgo","numerology":8,"yes":"yes"},"reversed":false}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/tarot/rider-waite/draw/year-ahead":{"post":{"tags":["Tarot: Rider-Waite-Smith"],"summary":"RWS: Year Ahead","description":"13-card spread (12 months + theme).","operationId":"tarot_rider-waite_draw_year-ahead","x-quality":"green","x-source":"Arthur Edward Waite \"The Pictorial Key to the Tarot\" 1909 (PD); Pamela Colman Smith images PD since 2021. Cross-referenced Mary Greer \"Tarot for Your Self\".","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TarotDraw"},"example":{"seed":12345,"question":"What should I focus on?","allowReversed":true}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/tarot/rider-waite/draw/year-ahead \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"seed\": 12345, \"question\": \"What should I focus on?\", \"allowReversed\": true }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/tarot/rider-waite/draw/year-ahead', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"seed\": 12345,\n    \"question\": \"What should I focus on?\",\n    \"allowReversed\": true\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/tarot/rider-waite/draw/year-ahead',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'seed': 12345,\n      'question': \"What should I focus on?\",\n      'allowReversed': True\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('tarot/rider-waite/draw/year-ahead', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'seed' => 12345,\n        'question' => 'What should I focus on?',\n        'allowReversed' => true,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"spread":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"cardCount":{"type":"number","nullable":true}},"nullable":true},"seed":{"type":"number","nullable":true},"drawn":{"type":"array","items":{"type":"object","properties":{"position":{"type":"object","properties":{"index":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"card":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"category":{"type":"string","nullable":true},"suit":{"type":"string","nullable":true},"rank":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"upright":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"astrology":{"type":"string","nullable":true},"numerology":{"type":"number","nullable":true},"yes":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"spread":{"slug":"year-ahead","name":"Year Ahead","cardCount":13},"seed":12345,"drawn":[{"position":{"index":0,"name":"Year Theme","meaning":"Overall theme of the year."},"card":{"slug":"8-of-pentacles","number":8,"name":"Eight of Pentacles","category":"minor","suit":"pentacles","rank":"8","element":"earth","upright":{"keywords":["mastery"],"meaning":"Disciplined practice toward mastery."},"reversed":{"keywords":["lack of focus"],"meaning":"Cutting corners on the work."},"astrology":"Sun in Virgo","numerology":8,"yes":"yes"},"reversed":false}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/tarot/rider-waite/draw/decision":{"post":{"tags":["Tarot: Rider-Waite-Smith"],"summary":"RWS: Yes/No","description":"Single-card draw with yes/no/maybe verdict from card affinity.","operationId":"tarot_rider-waite_draw_decision","x-quality":"green","x-source":"Arthur Edward Waite \"The Pictorial Key to the Tarot\" 1909 (PD); Pamela Colman Smith images PD since 2021. Cross-referenced Mary Greer \"Tarot for Your Self\".","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TarotDraw"},"example":{"seed":12345,"question":"What should I focus on?","allowReversed":true}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/tarot/rider-waite/draw/decision \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"seed\": 12345, \"question\": \"What should I focus on?\", \"allowReversed\": true }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/tarot/rider-waite/draw/decision', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"seed\": 12345,\n    \"question\": \"What should I focus on?\",\n    \"allowReversed\": true\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/tarot/rider-waite/draw/decision',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'seed': 12345,\n      'question': \"What should I focus on?\",\n      'allowReversed': True\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('tarot/rider-waite/draw/decision', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'seed' => 12345,\n        'question' => 'What should I focus on?',\n        'allowReversed' => true,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"spread":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"cardCount":{"type":"number","nullable":true}},"nullable":true},"seed":{"type":"number","nullable":true},"drawn":{"type":"array","items":{"type":"object","properties":{"position":{"type":"object","properties":{"index":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"card":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"category":{"type":"string","nullable":true},"suit":{"type":"string","nullable":true},"rank":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"upright":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"astrology":{"type":"string","nullable":true},"numerology":{"type":"number","nullable":true},"yes":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true},"verdict":{"type":"string","nullable":true},"reason":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"spread":{"slug":"decision","name":"Yes / No Decision","cardCount":1},"seed":12345,"drawn":[{"position":{"index":0,"name":"Decision","meaning":"Yes / No / Maybe by card affinity."},"card":{"slug":"8-of-pentacles","number":8,"name":"Eight of Pentacles","category":"minor","suit":"pentacles","rank":"8","element":"earth","upright":{"keywords":["mastery"],"meaning":"Disciplined practice toward mastery."},"reversed":{"keywords":["lack of focus"],"meaning":"Cutting corners on the work."},"astrology":"Sun in Virgo","numerology":8,"yes":"yes"},"reversed":false}],"verdict":"yes","reason":"8 of Pentacles indicates yes"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/tarot/rider-waite/draw/chakra":{"post":{"tags":["Tarot: Rider-Waite-Smith"],"summary":"RWS: Chakra","description":"7-card chakra spread (Root → Crown).","operationId":"tarot_rider-waite_draw_chakra","x-quality":"green","x-source":"Arthur Edward Waite \"The Pictorial Key to the Tarot\" 1909 (PD); Pamela Colman Smith images PD since 2021. Cross-referenced Mary Greer \"Tarot for Your Self\".","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TarotDraw"},"example":{"seed":12345,"question":"What should I focus on?","allowReversed":true}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/tarot/rider-waite/draw/chakra \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"seed\": 12345, \"question\": \"What should I focus on?\", \"allowReversed\": true }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/tarot/rider-waite/draw/chakra', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"seed\": 12345,\n    \"question\": \"What should I focus on?\",\n    \"allowReversed\": true\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/tarot/rider-waite/draw/chakra',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'seed': 12345,\n      'question': \"What should I focus on?\",\n      'allowReversed': True\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('tarot/rider-waite/draw/chakra', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'seed' => 12345,\n        'question' => 'What should I focus on?',\n        'allowReversed' => true,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"spread":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"cardCount":{"type":"number","nullable":true}},"nullable":true},"seed":{"type":"number","nullable":true},"drawn":{"type":"array","items":{"type":"object","properties":{"position":{"type":"object","properties":{"index":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"card":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"category":{"type":"string","nullable":true},"suit":{"type":"string","nullable":true},"rank":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"upright":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"astrology":{"type":"string","nullable":true},"numerology":{"type":"number","nullable":true},"yes":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"spread":{"slug":"chakra","name":"Chakra Spread","cardCount":7},"seed":12345,"drawn":[{"position":{"index":0,"name":"Root","meaning":"Survival, grounding, basic safety."},"card":{"slug":"8-of-pentacles","number":8,"name":"Eight of Pentacles","category":"minor","suit":"pentacles","rank":"8","element":"earth","upright":{"keywords":["mastery"],"meaning":"Disciplined practice toward mastery."},"reversed":{"keywords":["lack of focus"],"meaning":"Cutting corners on the work."},"astrology":"Sun in Virgo","numerology":8,"yes":"yes"},"reversed":false}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/tarot/rider-waite/draw/career":{"post":{"tags":["Tarot: Rider-Waite-Smith"],"summary":"RWS: Career","description":"5-card career trajectory spread.","operationId":"tarot_rider-waite_draw_career","x-quality":"green","x-source":"Arthur Edward Waite \"The Pictorial Key to the Tarot\" 1909 (PD); Pamela Colman Smith images PD since 2021. Cross-referenced Mary Greer \"Tarot for Your Self\".","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TarotDraw"},"example":{"seed":12345,"question":"What should I focus on?","allowReversed":true}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/tarot/rider-waite/draw/career \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"seed\": 12345, \"question\": \"What should I focus on?\", \"allowReversed\": true }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/tarot/rider-waite/draw/career', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"seed\": 12345,\n    \"question\": \"What should I focus on?\",\n    \"allowReversed\": true\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/tarot/rider-waite/draw/career',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'seed': 12345,\n      'question': \"What should I focus on?\",\n      'allowReversed': True\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('tarot/rider-waite/draw/career', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'seed' => 12345,\n        'question' => 'What should I focus on?',\n        'allowReversed' => true,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"spread":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"cardCount":{"type":"number","nullable":true}},"nullable":true},"seed":{"type":"number","nullable":true},"drawn":{"type":"array","items":{"type":"object","properties":{"position":{"type":"object","properties":{"index":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"card":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"category":{"type":"string","nullable":true},"suit":{"type":"string","nullable":true},"rank":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"upright":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"astrology":{"type":"string","nullable":true},"numerology":{"type":"number","nullable":true},"yes":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"spread":{"slug":"career","name":"Career","cardCount":5},"seed":12345,"drawn":[{"position":{"index":0,"name":"Current Role","meaning":"Where you stand professionally."},"card":{"slug":"8-of-pentacles","number":8,"name":"Eight of Pentacles","category":"minor","suit":"pentacles","rank":"8","element":"earth","upright":{"keywords":["mastery"],"meaning":"Disciplined practice toward mastery."},"reversed":{"keywords":["lack of focus"],"meaning":"Cutting corners on the work."},"astrology":"Sun in Virgo","numerology":8,"yes":"yes"},"reversed":false}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/tarot/rider-waite/draw/love-triangle":{"post":{"tags":["Tarot: Rider-Waite-Smith"],"summary":"RWS: Love Triangle","description":"6-card three-person love dynamics.","operationId":"tarot_rider-waite_draw_love-triangle","x-quality":"green","x-source":"Arthur Edward Waite \"The Pictorial Key to the Tarot\" 1909 (PD); Pamela Colman Smith images PD since 2021. Cross-referenced Mary Greer \"Tarot for Your Self\".","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TarotDraw"},"example":{"seed":12345,"question":"What should I focus on?","allowReversed":true}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/tarot/rider-waite/draw/love-triangle \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"seed\": 12345, \"question\": \"What should I focus on?\", \"allowReversed\": true }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/tarot/rider-waite/draw/love-triangle', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"seed\": 12345,\n    \"question\": \"What should I focus on?\",\n    \"allowReversed\": true\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/tarot/rider-waite/draw/love-triangle',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'seed': 12345,\n      'question': \"What should I focus on?\",\n      'allowReversed': True\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('tarot/rider-waite/draw/love-triangle', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'seed' => 12345,\n        'question' => 'What should I focus on?',\n        'allowReversed' => true,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"spread":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"cardCount":{"type":"number","nullable":true}},"nullable":true},"seed":{"type":"number","nullable":true},"drawn":{"type":"array","items":{"type":"object","properties":{"position":{"type":"object","properties":{"index":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"card":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"category":{"type":"string","nullable":true},"suit":{"type":"string","nullable":true},"rank":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"upright":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"astrology":{"type":"string","nullable":true},"numerology":{"type":"number","nullable":true},"yes":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"spread":{"slug":"love-triangle","name":"Love Triangle","cardCount":6},"seed":12345,"drawn":[{"position":{"index":0,"name":"You","meaning":"Your position."},"card":{"slug":"8-of-pentacles","number":8,"name":"Eight of Pentacles","category":"minor","suit":"pentacles","rank":"8","element":"earth","upright":{"keywords":["mastery"],"meaning":"Disciplined practice toward mastery."},"reversed":{"keywords":["lack of focus"],"meaning":"Cutting corners on the work."},"astrology":"Sun in Virgo","numerology":8,"yes":"yes"},"reversed":false}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/tarot/rider-waite/draw/spiritual-path":{"post":{"tags":["Tarot: Rider-Waite-Smith"],"summary":"RWS: Spiritual Path","description":"5-card spiritual development spread.","operationId":"tarot_rider-waite_draw_spiritual-path","x-quality":"green","x-source":"Arthur Edward Waite \"The Pictorial Key to the Tarot\" 1909 (PD); Pamela Colman Smith images PD since 2021. Cross-referenced Mary Greer \"Tarot for Your Self\".","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TarotDraw"},"example":{"seed":12345,"question":"What should I focus on?","allowReversed":true}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/tarot/rider-waite/draw/spiritual-path \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"seed\": 12345, \"question\": \"What should I focus on?\", \"allowReversed\": true }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/tarot/rider-waite/draw/spiritual-path', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"seed\": 12345,\n    \"question\": \"What should I focus on?\",\n    \"allowReversed\": true\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/tarot/rider-waite/draw/spiritual-path',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'seed': 12345,\n      'question': \"What should I focus on?\",\n      'allowReversed': True\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('tarot/rider-waite/draw/spiritual-path', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'seed' => 12345,\n        'question' => 'What should I focus on?',\n        'allowReversed' => true,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"spread":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"cardCount":{"type":"number","nullable":true}},"nullable":true},"seed":{"type":"number","nullable":true},"drawn":{"type":"array","items":{"type":"object","properties":{"position":{"type":"object","properties":{"index":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"card":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"category":{"type":"string","nullable":true},"suit":{"type":"string","nullable":true},"rank":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"upright":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"astrology":{"type":"string","nullable":true},"numerology":{"type":"number","nullable":true},"yes":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"spread":{"slug":"spiritual-path","name":"Spiritual Path","cardCount":5},"seed":12345,"drawn":[{"position":{"index":0,"name":"Current Path","meaning":"Where you are spiritually."},"card":{"slug":"8-of-pentacles","number":8,"name":"Eight of Pentacles","category":"minor","suit":"pentacles","rank":"8","element":"earth","upright":{"keywords":["mastery"],"meaning":"Disciplined practice toward mastery."},"reversed":{"keywords":["lack of focus"],"meaning":"Cutting corners on the work."},"astrology":"Sun in Virgo","numerology":8,"yes":"yes"},"reversed":false}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/tarot/rider-waite/draw/shadow-work":{"post":{"tags":["Tarot: Rider-Waite-Smith"],"summary":"RWS: Shadow Work","description":"6-card shadow integration spread.","operationId":"tarot_rider-waite_draw_shadow-work","x-quality":"green","x-source":"Arthur Edward Waite \"The Pictorial Key to the Tarot\" 1909 (PD); Pamela Colman Smith images PD since 2021. Cross-referenced Mary Greer \"Tarot for Your Self\".","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TarotDraw"},"example":{"seed":12345,"question":"What should I focus on?","allowReversed":true}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/tarot/rider-waite/draw/shadow-work \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"seed\": 12345, \"question\": \"What should I focus on?\", \"allowReversed\": true }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/tarot/rider-waite/draw/shadow-work', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"seed\": 12345,\n    \"question\": \"What should I focus on?\",\n    \"allowReversed\": true\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/tarot/rider-waite/draw/shadow-work',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'seed': 12345,\n      'question': \"What should I focus on?\",\n      'allowReversed': True\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('tarot/rider-waite/draw/shadow-work', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'seed' => 12345,\n        'question' => 'What should I focus on?',\n        'allowReversed' => true,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"spread":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"cardCount":{"type":"number","nullable":true}},"nullable":true},"seed":{"type":"number","nullable":true},"drawn":{"type":"array","items":{"type":"object","properties":{"position":{"type":"object","properties":{"index":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"card":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"category":{"type":"string","nullable":true},"suit":{"type":"string","nullable":true},"rank":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"upright":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"astrology":{"type":"string","nullable":true},"numerology":{"type":"number","nullable":true},"yes":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"spread":{"slug":"shadow-work","name":"Shadow Work","cardCount":6},"seed":12345,"drawn":[{"position":{"index":0,"name":"Shadow","meaning":"Disowned aspect emerging."},"card":{"slug":"8-of-pentacles","number":8,"name":"Eight of Pentacles","category":"minor","suit":"pentacles","rank":"8","element":"earth","upright":{"keywords":["mastery"],"meaning":"Disciplined practice toward mastery."},"reversed":{"keywords":["lack of focus"],"meaning":"Cutting corners on the work."},"astrology":"Sun in Virgo","numerology":8,"yes":"yes"},"reversed":false}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/tarot/rider-waite/daily":{"post":{"tags":["Tarot: Rider-Waite-Smith"],"summary":"RWS: Daily Card","description":"Daily card based on date seed (deterministic per day).","operationId":"tarot_rider-waite_daily","x-quality":"green","x-source":"Arthur Edward Waite \"The Pictorial Key to the Tarot\" 1909 (PD); Pamela Colman Smith images PD since 2021. Cross-referenced Mary Greer \"Tarot for Your Self\".","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TarotDaily"},"example":{"date":"2026-05-04"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/tarot/rider-waite/daily \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"2026-05-04\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/tarot/rider-waite/daily', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"2026-05-04\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/tarot/rider-waite/daily',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"2026-05-04\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('tarot/rider-waite/daily', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '2026-05-04',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"date":{"type":"string","nullable":true},"spread":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"cardCount":{"type":"number","nullable":true}},"nullable":true},"seed":{"type":"number","nullable":true},"drawn":{"type":"array","items":{"type":"object","properties":{"position":{"type":"object","properties":{"index":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"card":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"category":{"type":"string","nullable":true},"suit":{"type":"string","nullable":true},"rank":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"upright":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"astrology":{"type":"string","nullable":true},"numerology":{"type":"number","nullable":true},"yes":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true},"localized":{"type":"object","properties":{"cards":{"type":"object","properties":{"page-of-cups":{"type":"object","properties":{"name":{"type":"string","nullable":true},"suit":{"type":"string","nullable":true},"nameLocalized":{"type":"boolean","nullable":true},"upright":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"textLocalized":{"type":"boolean","nullable":true}},"nullable":true}},"nullable":true},"positions":{"type":"array","items":{"type":"object","properties":{"index":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"spread":{"type":"object","properties":{"name":{"type":"string","nullable":true}},"nullable":true},"textLocalized":{"type":"boolean","nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"date":"2026-05-04","spread":{"slug":"single-card","name":"Single Card","cardCount":1},"seed":20260504,"drawn":[{"position":{"index":0,"name":"The Card","meaning":"The essential answer or theme."},"card":{"slug":"page-of-cups","number":11,"name":"Page of Cups","category":"court","suit":"cups","rank":"page","element":"water","upright":{"keywords":["intuitive message"],"meaning":"Intuitive message; emotional opening."},"reversed":{"keywords":["emotional immaturity"],"meaning":"Emotionally immature or blocked."},"astrology":"earth of water","numerology":2,"yes":"maybe"},"reversed":false}],"localized":{"cards":{"page-of-cups":{"name":"Паж Чаш","suit":"Чаші","nameLocalized":true,"upright":{"keywords":["інтуїтивне послання","творчі початки"],"meaning":"Інтуїтивне послання; емоційне розкриття."},"reversed":{"keywords":["емоційна незрілість","творчий блок"],"meaning":"Емоційна незрілість або закритість."},"textLocalized":true}},"positions":[{"index":0,"name":"Карта","meaning":"Суть відповіді або головна тема."}],"spread":{"name":"Одна карта"},"textLocalized":true}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/tarot/rider-waite/birth-card":{"post":{"tags":["Tarot: Rider-Waite-Smith"],"summary":"RWS: Birth Card","description":"Birth card from date per Mary Greer's method (m+d+y reduced).","operationId":"tarot_rider-waite_birth-card","x-quality":"green","x-source":"Arthur Edward Waite \"The Pictorial Key to the Tarot\" 1909 (PD); Pamela Colman Smith images PD since 2021. Cross-referenced Mary Greer \"Tarot for Your Self\".","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TarotDate"},"example":{"date":"1990-05-15"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/tarot/rider-waite/birth-card \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/tarot/rider-waite/birth-card', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/tarot/rider-waite/birth-card',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('tarot/rider-waite/birth-card', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"date":{"type":"string","nullable":true},"primary":{"type":"object","properties":{"name":{"type":"string","nullable":true}},"nullable":true},"secondary":{"type":"object","properties":{"name":{"type":"string","nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"date":"1990-05-15","primary":{"name":"..."},"secondary":{"name":"..."}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/tarot/rider-waite/year-card":{"post":{"tags":["Tarot: Rider-Waite-Smith"],"summary":"RWS: Year Card","description":"Year card per Greer (m+d+year reduced).","operationId":"tarot_rider-waite_year-card","x-quality":"green","x-source":"Arthur Edward Waite \"The Pictorial Key to the Tarot\" 1909 (PD); Pamela Colman Smith images PD since 2021. Cross-referenced Mary Greer \"Tarot for Your Self\".","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TarotYear"},"example":{"date":"1990-05-15","year":2026}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/tarot/rider-waite/year-card \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"year\": 2026 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/tarot/rider-waite/year-card', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"year\": 2026\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/tarot/rider-waite/year-card',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'year': 2026\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('tarot/rider-waite/year-card', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'year' => 2026,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"date":{"type":"string","nullable":true},"year":{"type":"number","nullable":true},"card":{"type":"object","properties":{"name":{"type":"string","nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"date":"1990-05-15","year":2026,"card":{"name":"..."}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/tarot/rider-waite/soul-personality-card":{"post":{"tags":["Tarot: Rider-Waite-Smith"],"summary":"RWS: Soul + Personality","description":"Returns soul card and personality card pair from birth date.","operationId":"tarot_rider-waite_soul-personality-card","x-quality":"green","x-source":"Arthur Edward Waite \"The Pictorial Key to the Tarot\" 1909 (PD); Pamela Colman Smith images PD since 2021. Cross-referenced Mary Greer \"Tarot for Your Self\".","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TarotDate"},"example":{"date":"1990-05-15"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/tarot/rider-waite/soul-personality-card \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/tarot/rider-waite/soul-personality-card', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/tarot/rider-waite/soul-personality-card',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('tarot/rider-waite/soul-personality-card', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"date":{"type":"string","nullable":true},"soulCard":{"type":"object","properties":{"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"upright":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"astrology":{"type":"string","nullable":true},"numerology":{"type":"number","nullable":true},"yes":{"type":"string","nullable":true},"slug":{"type":"string","nullable":true},"category":{"type":"string","nullable":true}},"nullable":true},"personalityCard":{"type":"object","properties":{"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"upright":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"astrology":{"type":"string","nullable":true},"numerology":{"type":"number","nullable":true},"yes":{"type":"string","nullable":true},"slug":{"type":"string","nullable":true},"category":{"type":"string","nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"date":"1990-05-15","soulCard":{"number":3,"name":"The Empress","upright":{"keywords":["fertility"],"meaning":"Creative and material abundance; embodied feminine power."},"reversed":{"keywords":["dependence"],"meaning":"Over-nurturing or creative blockage."},"astrology":"Venus","numerology":3,"yes":"yes","slug":"the-empress","category":"major"},"personalityCard":{"number":3,"name":"The Empress","upright":{"keywords":["fertility"],"meaning":"Creative and material abundance; embodied feminine power."},"reversed":{"keywords":["dependence"],"meaning":"Over-nurturing or creative blockage."},"astrology":"Venus","numerology":3,"yes":"yes","slug":"the-empress","category":"major"}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/tarot/rider-waite/shadow-card":{"post":{"tags":["Tarot: Rider-Waite-Smith"],"summary":"RWS: Shadow Card","description":"Shadow card pair (mirror in major arcana of personality card).","operationId":"tarot_rider-waite_shadow-card","x-quality":"green","x-source":"Arthur Edward Waite \"The Pictorial Key to the Tarot\" 1909 (PD); Pamela Colman Smith images PD since 2021. Cross-referenced Mary Greer \"Tarot for Your Self\".","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TarotDate"},"example":{"date":"1990-05-15"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/tarot/rider-waite/shadow-card \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/tarot/rider-waite/shadow-card', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/tarot/rider-waite/shadow-card',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('tarot/rider-waite/shadow-card', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"date":{"type":"string","nullable":true},"personalityCard":{"type":"object","properties":{"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"upright":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"astrology":{"type":"string","nullable":true},"numerology":{"type":"number","nullable":true},"yes":{"type":"string","nullable":true},"slug":{"type":"string","nullable":true},"category":{"type":"string","nullable":true}},"nullable":true},"shadowCard":{"type":"object","properties":{"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"upright":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"astrology":{"type":"string","nullable":true},"numerology":{"type":"number","nullable":true},"yes":{"type":"string","nullable":true},"slug":{"type":"string","nullable":true},"category":{"type":"string","nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"date":"1990-05-15","personalityCard":{"number":3,"name":"The Empress","upright":{"keywords":["fertility"],"meaning":"Creative and material abundance; embodied feminine power."},"reversed":{"keywords":["dependence"],"meaning":"Over-nurturing or creative blockage."},"astrology":"Venus","numerology":3,"yes":"yes","slug":"the-empress","category":"major"},"shadowCard":{"number":18,"name":"The Moon","upright":{"keywords":["illusion"],"meaning":"Things are not as they appear; trust intuition through fog."},"reversed":{"keywords":["repressed fears"],"meaning":"Confusion lifting; suppressed fears surfacing."},"astrology":"Pisces","numerology":18,"yes":"maybe","slug":"the-moon","category":"major"}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/tarot/rider-waite/cross-sum":{"post":{"tags":["Tarot: Rider-Waite-Smith"],"summary":"RWS: Court Card Cross-Sum","description":"Birth-card meditation pair for court-card practice.","operationId":"tarot_rider-waite_cross-sum","x-quality":"green","x-source":"Arthur Edward Waite \"The Pictorial Key to the Tarot\" 1909 (PD); Pamela Colman Smith images PD since 2021. Cross-referenced Mary Greer \"Tarot for Your Self\".","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TarotDate"},"example":{"date":"1990-05-15"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/tarot/rider-waite/cross-sum \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/tarot/rider-waite/cross-sum', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/tarot/rider-waite/cross-sum',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('tarot/rider-waite/cross-sum', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"date":{"type":"string","nullable":true},"meditationPair":{"type":"array","items":{"type":"object","properties":{"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"upright":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"astrology":{"type":"string","nullable":true},"numerology":{"type":"number","nullable":true},"yes":{"type":"string","nullable":true},"slug":{"type":"string","nullable":true},"category":{"type":"string","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"date":"1990-05-15","meditationPair":[{"number":3,"name":"The Empress","upright":{"keywords":["fertility"],"meaning":"Creative and material abundance; embodied feminine power."},"reversed":{"keywords":["dependence"],"meaning":"Over-nurturing or creative blockage."},"astrology":"Venus","numerology":3,"yes":"yes","slug":"the-empress","category":"major"}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/tarot/rider-waite/interpret":{"post":{"tags":["Tarot: Rider-Waite-Smith"],"summary":"RWS: Interpret a Hand","description":"Resolve a list of card slugs into structured meanings (POST /interpret/tarot writes the reading of the whole spread).","operationId":"tarot_rider-waite_interpret","x-quality":"green","x-source":"Arthur Edward Waite \"The Pictorial Key to the Tarot\" 1909 (PD); Pamela Colman Smith images PD since 2021. Cross-referenced Mary Greer \"Tarot for Your Self\".","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TarotInterpret"},"example":{"cards":["the-fool","the-magician"],"question":"Career change?"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/tarot/rider-waite/interpret \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"cards\": [ \"the-fool\", \"the-magician\" ], \"question\": \"Career change?\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/tarot/rider-waite/interpret', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"cards\": [\n      \"the-fool\",\n      \"the-magician\"\n    ],\n    \"question\": \"Career change?\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/tarot/rider-waite/interpret',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'cards': [\n        \"the-fool\",\n        \"the-magician\"\n      ],\n      'question': \"Career change?\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('tarot/rider-waite/interpret', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'cards' => ['the-fool', 'the-magician'],\n        'question' => 'Career change?',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"question":{"type":"string","nullable":true},"cards":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"upright":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"nullable":true},"narrativeStub":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"question":"Career change?","cards":[{"slug":"the-fool","name":"The Fool","upright":{"keywords":["new beginnings"],"meaning":"A leap of faith into the unknown. Trust the journey, embrace beginner's mind."}}],"narrativeStub":"2-card reading: The Fool → The Magician. (POST /v1/interpret/tarot reads the positions and the whole spread.)"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/tarot/rider-waite/clarify":{"post":{"tags":["Tarot: Rider-Waite-Smith"],"summary":"RWS: Clarifier Card","description":"Single clarifying card after a primary draw.","operationId":"tarot_rider-waite_clarify","x-quality":"green","x-source":"Arthur Edward Waite \"The Pictorial Key to the Tarot\" 1909 (PD); Pamela Colman Smith images PD since 2021. Cross-referenced Mary Greer \"Tarot for Your Self\".","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TarotDraw"},"example":{"seed":12345,"question":"What should I focus on?","allowReversed":true}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/tarot/rider-waite/clarify \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"seed\": 12345, \"question\": \"What should I focus on?\", \"allowReversed\": true }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/tarot/rider-waite/clarify', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"seed\": 12345,\n    \"question\": \"What should I focus on?\",\n    \"allowReversed\": true\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/tarot/rider-waite/clarify',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'seed': 12345,\n      'question': \"What should I focus on?\",\n      'allowReversed': True\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('tarot/rider-waite/clarify', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'seed' => 12345,\n        'question' => 'What should I focus on?',\n        'allowReversed' => true,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"type":{"type":"string","nullable":true},"spread":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"cardCount":{"type":"number","nullable":true}},"nullable":true},"seed":{"type":"number","nullable":true},"drawn":{"type":"array","items":{"type":"object","properties":{"position":{"type":"object","properties":{"index":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"card":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"category":{"type":"string","nullable":true},"suit":{"type":"string","nullable":true},"rank":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"upright":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"astrology":{"type":"string","nullable":true},"numerology":{"type":"number","nullable":true},"yes":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"type":"clarify","spread":{"slug":"single-card","name":"Single Card","cardCount":1},"seed":12345,"drawn":[{"position":{"index":0,"name":"The Card","meaning":"The essential answer or theme."},"card":{"slug":"8-of-pentacles","number":8,"name":"Eight of Pentacles","category":"minor","suit":"pentacles","rank":"8","element":"earth","upright":{"keywords":["mastery"],"meaning":"Disciplined practice toward mastery."},"reversed":{"keywords":["lack of focus"],"meaning":"Cutting corners on the work."},"astrology":"Sun in Virgo","numerology":8,"yes":"yes"},"reversed":false}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/tarot/rider-waite/timing":{"post":{"tags":["Tarot: Rider-Waite-Smith"],"summary":"RWS: Timing Card","description":"Single timing card to indicate when.","operationId":"tarot_rider-waite_timing","x-quality":"green","x-source":"Arthur Edward Waite \"The Pictorial Key to the Tarot\" 1909 (PD); Pamela Colman Smith images PD since 2021. Cross-referenced Mary Greer \"Tarot for Your Self\".","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TarotDraw"},"example":{"seed":12345,"question":"What should I focus on?","allowReversed":true}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/tarot/rider-waite/timing \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"seed\": 12345, \"question\": \"What should I focus on?\", \"allowReversed\": true }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/tarot/rider-waite/timing', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"seed\": 12345,\n    \"question\": \"What should I focus on?\",\n    \"allowReversed\": true\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/tarot/rider-waite/timing',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'seed': 12345,\n      'question': \"What should I focus on?\",\n      'allowReversed': True\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('tarot/rider-waite/timing', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'seed' => 12345,\n        'question' => 'What should I focus on?',\n        'allowReversed' => true,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"type":{"type":"string","nullable":true},"spread":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"cardCount":{"type":"number","nullable":true}},"nullable":true},"seed":{"type":"number","nullable":true},"drawn":{"type":"array","items":{"type":"object","properties":{"position":{"type":"object","properties":{"index":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"card":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"category":{"type":"string","nullable":true},"suit":{"type":"string","nullable":true},"rank":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"upright":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"astrology":{"type":"string","nullable":true},"numerology":{"type":"number","nullable":true},"yes":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"type":"timing","spread":{"slug":"single-card","name":"Single Card","cardCount":1},"seed":12345,"drawn":[{"position":{"index":0,"name":"The Card","meaning":"The essential answer or theme."},"card":{"slug":"8-of-pentacles","number":8,"name":"Eight of Pentacles","category":"minor","suit":"pentacles","rank":"8","element":"earth","upright":{"keywords":["mastery"],"meaning":"Disciplined practice toward mastery."},"reversed":{"keywords":["lack of focus"],"meaning":"Cutting corners on the work."},"astrology":"Sun in Virgo","numerology":8,"yes":"yes"},"reversed":false}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/tarot/rider-waite/missing-info":{"post":{"tags":["Tarot: Rider-Waite-Smith"],"summary":"RWS: Missing Info Card","description":"Single card to surface hidden information.","operationId":"tarot_rider-waite_missing-info","x-quality":"green","x-source":"Arthur Edward Waite \"The Pictorial Key to the Tarot\" 1909 (PD); Pamela Colman Smith images PD since 2021. Cross-referenced Mary Greer \"Tarot for Your Self\".","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TarotDraw"},"example":{"seed":12345,"question":"What should I focus on?","allowReversed":true}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/tarot/rider-waite/missing-info \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"seed\": 12345, \"question\": \"What should I focus on?\", \"allowReversed\": true }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/tarot/rider-waite/missing-info', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"seed\": 12345,\n    \"question\": \"What should I focus on?\",\n    \"allowReversed\": true\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/tarot/rider-waite/missing-info',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'seed': 12345,\n      'question': \"What should I focus on?\",\n      'allowReversed': True\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('tarot/rider-waite/missing-info', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'seed' => 12345,\n        'question' => 'What should I focus on?',\n        'allowReversed' => true,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"type":{"type":"string","nullable":true},"spread":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"cardCount":{"type":"number","nullable":true}},"nullable":true},"seed":{"type":"number","nullable":true},"drawn":{"type":"array","items":{"type":"object","properties":{"position":{"type":"object","properties":{"index":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"card":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"category":{"type":"string","nullable":true},"suit":{"type":"string","nullable":true},"rank":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"upright":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"astrology":{"type":"string","nullable":true},"numerology":{"type":"number","nullable":true},"yes":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"type":"missing-info","spread":{"slug":"single-card","name":"Single Card","cardCount":1},"seed":12345,"drawn":[{"position":{"index":0,"name":"The Card","meaning":"The essential answer or theme."},"card":{"slug":"8-of-pentacles","number":8,"name":"Eight of Pentacles","category":"minor","suit":"pentacles","rank":"8","element":"earth","upright":{"keywords":["mastery"],"meaning":"Disciplined practice toward mastery."},"reversed":{"keywords":["lack of focus"],"meaning":"Cutting corners on the work."},"astrology":"Sun in Virgo","numerology":8,"yes":"yes"},"reversed":false}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/tarot/rider-waite/advice":{"post":{"tags":["Tarot: Rider-Waite-Smith"],"summary":"RWS: Advice Card","description":"Single advice card.","operationId":"tarot_rider-waite_advice","x-quality":"green","x-source":"Arthur Edward Waite \"The Pictorial Key to the Tarot\" 1909 (PD); Pamela Colman Smith images PD since 2021. Cross-referenced Mary Greer \"Tarot for Your Self\".","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TarotDraw"},"example":{"seed":12345,"question":"What should I focus on?","allowReversed":true}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/tarot/rider-waite/advice \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"seed\": 12345, \"question\": \"What should I focus on?\", \"allowReversed\": true }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/tarot/rider-waite/advice', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"seed\": 12345,\n    \"question\": \"What should I focus on?\",\n    \"allowReversed\": true\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/tarot/rider-waite/advice',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'seed': 12345,\n      'question': \"What should I focus on?\",\n      'allowReversed': True\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('tarot/rider-waite/advice', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'seed' => 12345,\n        'question' => 'What should I focus on?',\n        'allowReversed' => true,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"type":{"type":"string","nullable":true},"spread":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"cardCount":{"type":"number","nullable":true}},"nullable":true},"seed":{"type":"number","nullable":true},"drawn":{"type":"array","items":{"type":"object","properties":{"position":{"type":"object","properties":{"index":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"card":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"category":{"type":"string","nullable":true},"suit":{"type":"string","nullable":true},"rank":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"upright":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"astrology":{"type":"string","nullable":true},"numerology":{"type":"number","nullable":true},"yes":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"type":"advice","spread":{"slug":"single-card","name":"Single Card","cardCount":1},"seed":12345,"drawn":[{"position":{"index":0,"name":"The Card","meaning":"The essential answer or theme."},"card":{"slug":"8-of-pentacles","number":8,"name":"Eight of Pentacles","category":"minor","suit":"pentacles","rank":"8","element":"earth","upright":{"keywords":["mastery"],"meaning":"Disciplined practice toward mastery."},"reversed":{"keywords":["lack of focus"],"meaning":"Cutting corners on the work."},"astrology":"Sun in Virgo","numerology":8,"yes":"yes"},"reversed":false}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/tarot/rider-waite/outcome":{"post":{"tags":["Tarot: Rider-Waite-Smith"],"summary":"RWS: Outcome Card","description":"Single outcome card.","operationId":"tarot_rider-waite_outcome","x-quality":"green","x-source":"Arthur Edward Waite \"The Pictorial Key to the Tarot\" 1909 (PD); Pamela Colman Smith images PD since 2021. Cross-referenced Mary Greer \"Tarot for Your Self\".","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TarotDraw"},"example":{"seed":12345,"question":"What should I focus on?","allowReversed":true}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/tarot/rider-waite/outcome \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"seed\": 12345, \"question\": \"What should I focus on?\", \"allowReversed\": true }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/tarot/rider-waite/outcome', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"seed\": 12345,\n    \"question\": \"What should I focus on?\",\n    \"allowReversed\": true\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/tarot/rider-waite/outcome',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'seed': 12345,\n      'question': \"What should I focus on?\",\n      'allowReversed': True\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('tarot/rider-waite/outcome', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'seed' => 12345,\n        'question' => 'What should I focus on?',\n        'allowReversed' => true,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"type":{"type":"string","nullable":true},"spread":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"cardCount":{"type":"number","nullable":true}},"nullable":true},"seed":{"type":"number","nullable":true},"drawn":{"type":"array","items":{"type":"object","properties":{"position":{"type":"object","properties":{"index":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"card":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"category":{"type":"string","nullable":true},"suit":{"type":"string","nullable":true},"rank":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"upright":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"astrology":{"type":"string","nullable":true},"numerology":{"type":"number","nullable":true},"yes":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"type":"outcome","spread":{"slug":"single-card","name":"Single Card","cardCount":1},"seed":12345,"drawn":[{"position":{"index":0,"name":"The Card","meaning":"The essential answer or theme."},"card":{"slug":"8-of-pentacles","number":8,"name":"Eight of Pentacles","category":"minor","suit":"pentacles","rank":"8","element":"earth","upright":{"keywords":["mastery"],"meaning":"Disciplined practice toward mastery."},"reversed":{"keywords":["lack of focus"],"meaning":"Cutting corners on the work."},"astrology":"Sun in Virgo","numerology":8,"yes":"yes"},"reversed":false}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/tarot/marseille/cards":{"get":{"tags":["Tarot: Marseille"],"summary":"Marseille: All Cards","description":"78-card Marseille deck. Justice = 8, Strength = 11 (pre-Waite swap). Pip minors interpreted by number+suit.","operationId":"tarot_marseille_cards_get","x-quality":"yellow","x-source":"Camoin/Jodorowsky restoration of Conver 1760 deck; Yoav Ben-Dov \"Tarot: The Open Reading\"; pre-Waite Justice/Strength swap.","security":[{"ApiKeyAuth":[]}],"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X GET https://api.astroway.info/v1/tarot/marseille/cards \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/tarot/marseille/cards', {\n  method: 'GET',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.get(\n    'https://api.astroway.info/v1/tarot/marseille/cards',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->get('tarot/marseille/cards', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"upright":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"astrology":{"type":"string","nullable":true},"numerology":{"type":"number","nullable":true},"yes":{"type":"string","nullable":true},"slug":{"type":"string","nullable":true},"category":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"count":{"type":"number","nullable":true}}}}},"example":{"ok":true,"data":{"items":[{"number":0,"name":"Le Mat (The Fool)","upright":{"keywords":["leap of faith"],"meaning":"The wanderer leaps without map; trust the journey."},"reversed":{"keywords":["naivety"],"meaning":"Reckless leaps without grounding."},"astrology":"Uranus","numerology":0,"yes":"maybe","slug":"le-mat-the-fool-marseille","category":"major"}],"count":78}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/tarot/marseille/cards/{slug}":{"get":{"tags":["Tarot: Marseille"],"summary":"Marseille: Single Card","description":"Single Marseille card lookup by slug.","operationId":"tarot_marseille_cards_{slug}_get","x-quality":"yellow","x-source":"Camoin/Jodorowsky restoration of Conver 1760 deck; Yoav Ben-Dov \"Tarot: The Open Reading\"; pre-Waite Justice/Strength swap.","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"slug","in":"path","required":true,"description":"Card slug, lowercase and hyphenated.","schema":{"type":"string"},"example":"le-mat"},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X GET https://api.astroway.info/v1/tarot/marseille/cards/{slug} \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/tarot/marseille/cards/{slug}', {\n  method: 'GET',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.get(\n    'https://api.astroway.info/v1/tarot/marseille/cards/{slug}',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->get('tarot/marseille/cards/{slug}', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"category":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"slug":"...-marseille","name":"...","category":"..."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}}}},"/tarot/marseille/majors":{"get":{"tags":["Tarot: Marseille"],"summary":"Marseille: 22 Majors","description":"22 Major Arcana of Marseille deck.","operationId":"tarot_marseille_majors_get","x-quality":"yellow","x-source":"Camoin/Jodorowsky restoration of Conver 1760 deck; Yoav Ben-Dov \"Tarot: The Open Reading\"; pre-Waite Justice/Strength swap.","security":[{"ApiKeyAuth":[]}],"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X GET https://api.astroway.info/v1/tarot/marseille/majors \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/tarot/marseille/majors', {\n  method: 'GET',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.get(\n    'https://api.astroway.info/v1/tarot/marseille/majors',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->get('tarot/marseille/majors', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"upright":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"astrology":{"type":"string","nullable":true},"numerology":{"type":"number","nullable":true},"yes":{"type":"string","nullable":true},"slug":{"type":"string","nullable":true},"category":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"count":{"type":"number","nullable":true}}}}},"example":{"ok":true,"data":{"items":[{"number":0,"name":"Le Mat (The Fool)","upright":{"keywords":["leap of faith"],"meaning":"The wanderer leaps without map; trust the journey."},"reversed":{"keywords":["naivety"],"meaning":"Reckless leaps without grounding."},"astrology":"Uranus","numerology":0,"yes":"maybe","slug":"le-mat-the-fool-marseille","category":"major"}],"count":22}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/tarot/marseille/spreads":{"get":{"tags":["Tarot: Marseille"],"summary":"Marseille: All Spreads","description":"List of all Marseille spreads (incl. Jodorowsky cross).","operationId":"tarot_marseille_spreads_get","x-quality":"yellow","x-source":"Camoin/Jodorowsky restoration of Conver 1760 deck; Yoav Ben-Dov \"Tarot: The Open Reading\"; pre-Waite Justice/Strength swap.","security":[{"ApiKeyAuth":[]}],"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X GET https://api.astroway.info/v1/tarot/marseille/spreads \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/tarot/marseille/spreads', {\n  method: 'GET',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.get(\n    'https://api.astroway.info/v1/tarot/marseille/spreads',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->get('tarot/marseille/spreads', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"cardCount":{"type":"number","nullable":true},"description":{"type":"string","nullable":true},"positions":{"type":"array","items":{"type":"object","properties":{"index":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"nullable":true}},"nullable":true},"nullable":true},"count":{"type":"number","nullable":true}}}}},"example":{"ok":true,"data":{"items":[{"slug":"single-card","name":"Single Card","cardCount":1,"description":"Single card pull for direct guidance.","positions":[{"index":0,"name":"The Card","meaning":"Essential guidance."}]}],"count":10}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/tarot/marseille/spreads/{slug}":{"get":{"tags":["Tarot: Marseille"],"summary":"Marseille: Single Spread","description":"Definition of a single Marseille spread.","operationId":"tarot_marseille_spreads_{slug}_get","x-quality":"yellow","x-source":"Camoin/Jodorowsky restoration of Conver 1760 deck; Yoav Ben-Dov \"Tarot: The Open Reading\"; pre-Waite Justice/Strength swap.","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"slug","in":"path","required":true,"description":"Spread slug, lowercase and hyphenated.","schema":{"type":"string"},"example":"croix"},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X GET https://api.astroway.info/v1/tarot/marseille/spreads/{slug} \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/tarot/marseille/spreads/{slug}', {\n  method: 'GET',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.get(\n    'https://api.astroway.info/v1/tarot/marseille/spreads/{slug}',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->get('tarot/marseille/spreads/{slug}', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"cardCount":{"type":"number","nullable":true}}}}},"example":{"ok":true,"data":{"slug":"jodorowsky-cross","cardCount":5}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}}}},"/tarot/marseille/draw/single":{"post":{"tags":["Tarot: Marseille"],"summary":"Marseille: Single Card","description":"Single-card draw from Marseille deck.","operationId":"tarot_marseille_draw_single","x-quality":"yellow","x-source":"Camoin/Jodorowsky restoration of Conver 1760 deck; Yoav Ben-Dov \"Tarot: The Open Reading\"; pre-Waite Justice/Strength swap.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TarotDraw"},"example":{"seed":12345,"question":"What should I focus on?","allowReversed":true}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/tarot/marseille/draw/single \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"seed\": 12345, \"question\": \"What should I focus on?\", \"allowReversed\": true }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/tarot/marseille/draw/single', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"seed\": 12345,\n    \"question\": \"What should I focus on?\",\n    \"allowReversed\": true\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/tarot/marseille/draw/single',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'seed': 12345,\n      'question': \"What should I focus on?\",\n      'allowReversed': True\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('tarot/marseille/draw/single', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'seed' => 12345,\n        'question' => 'What should I focus on?',\n        'allowReversed' => true,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"spread":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"cardCount":{"type":"number","nullable":true}},"nullable":true},"seed":{"type":"number","nullable":true},"drawn":{"type":"array","items":{"type":"object","properties":{"position":{"type":"object","properties":{"index":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"card":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"category":{"type":"string","nullable":true},"suit":{"type":"string","nullable":true},"rank":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"upright":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"astrology":{"type":"string","nullable":true},"numerology":{"type":"number","nullable":true},"yes":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"spread":{"slug":"single-card","name":"Single Card","cardCount":1},"seed":12345,"drawn":[{"position":{"index":0,"name":"The Card","meaning":"Essential guidance."},"card":{"slug":"8-of-pentacles-marseille","number":8,"name":"Eight of Pentacles","category":"minor","suit":"pentacles","rank":"8","element":"earth","upright":{"keywords":["mastery"],"meaning":"Disciplined practice toward mastery. (Marseille pip: interpret by number 8, pentacles element earth)."},"reversed":{"keywords":["lack of focus"],"meaning":"Cutting corners on the work. (Marseille pip: reversed pip carries softer reading)."},"astrology":"Sun in Virgo","numerology":8,"yes":"yes"},"reversed":false}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/tarot/marseille/draw/three-card":{"post":{"tags":["Tarot: Marseille"],"summary":"Marseille: Three-Card","description":"Past / Present / Future three-card spread.","operationId":"tarot_marseille_draw_three-card","x-quality":"yellow","x-source":"Camoin/Jodorowsky restoration of Conver 1760 deck; Yoav Ben-Dov \"Tarot: The Open Reading\"; pre-Waite Justice/Strength swap.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TarotDraw"},"example":{"seed":12345,"question":"What should I focus on?","allowReversed":true}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/tarot/marseille/draw/three-card \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"seed\": 12345, \"question\": \"What should I focus on?\", \"allowReversed\": true }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/tarot/marseille/draw/three-card', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"seed\": 12345,\n    \"question\": \"What should I focus on?\",\n    \"allowReversed\": true\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/tarot/marseille/draw/three-card',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'seed': 12345,\n      'question': \"What should I focus on?\",\n      'allowReversed': True\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('tarot/marseille/draw/three-card', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'seed' => 12345,\n        'question' => 'What should I focus on?',\n        'allowReversed' => true,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"spread":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"cardCount":{"type":"number","nullable":true}},"nullable":true},"seed":{"type":"number","nullable":true},"drawn":{"type":"array","items":{"type":"object","properties":{"position":{"type":"object","properties":{"index":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"card":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"category":{"type":"string","nullable":true},"suit":{"type":"string","nullable":true},"rank":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"upright":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"astrology":{"type":"string","nullable":true},"numerology":{"type":"number","nullable":true},"yes":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"spread":{"slug":"three-card","name":"Three-Card","cardCount":3},"seed":12345,"drawn":[{"position":{"index":0,"name":"Past","meaning":"Past influences."},"card":{"slug":"8-of-pentacles-marseille","number":8,"name":"Eight of Pentacles","category":"minor","suit":"pentacles","rank":"8","element":"earth","upright":{"keywords":["mastery"],"meaning":"Disciplined practice toward mastery. (Marseille pip: interpret by number 8, pentacles element earth)."},"reversed":{"keywords":["lack of focus"],"meaning":"Cutting corners on the work. (Marseille pip: reversed pip carries softer reading)."},"astrology":"Sun in Virgo","numerology":8,"yes":"yes"},"reversed":false}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/tarot/marseille/draw/cross":{"post":{"tags":["Tarot: Marseille"],"summary":"Marseille: Tirage Réduit (Jodorowsky Reduced Cross)","description":"Authentic 5-card cross from Jodorowsky/Costa \"The Way of Tarot\" + Camoin ArtduTarot: 4 Major Arcana (consultant / external / higher / result) + 5th synthesis card (numerological sum reduced ≤22).","operationId":"tarot_marseille_draw_cross","x-quality":"yellow","x-source":"Camoin/Jodorowsky restoration of Conver 1760 deck; Yoav Ben-Dov \"Tarot: The Open Reading\"; pre-Waite Justice/Strength swap.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TarotDraw"},"example":{"seed":12345,"question":"What should I focus on?","allowReversed":true}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/tarot/marseille/draw/cross \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"seed\": 12345, \"question\": \"What should I focus on?\", \"allowReversed\": true }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/tarot/marseille/draw/cross', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"seed\": 12345,\n    \"question\": \"What should I focus on?\",\n    \"allowReversed\": true\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/tarot/marseille/draw/cross',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'seed': 12345,\n      'question': \"What should I focus on?\",\n      'allowReversed': True\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('tarot/marseille/draw/cross', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'seed' => 12345,\n        'question' => 'What should I focus on?',\n        'allowReversed' => true,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"spread":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"cardCount":{"type":"number","nullable":true}},"nullable":true},"seed":{"type":"number","nullable":true},"drawn":{"type":"array","items":{"type":"object","properties":{"position":{"type":"object","properties":{"index":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"card":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"category":{"type":"string","nullable":true},"suit":{"type":"string","nullable":true},"rank":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"upright":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"astrology":{"type":"string","nullable":true},"numerology":{"type":"number","nullable":true},"yes":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"spread":{"slug":"jodorowsky-cross","name":"Tirage Réduit (Jodorowsky Reduced Cross)","cardCount":5},"seed":12345,"drawn":[{"position":{"index":0,"name":"Consultant","meaning":"Left arm: the querent and their inner state."},"card":{"slug":"8-of-pentacles-marseille","number":8,"name":"Eight of Pentacles","category":"minor","suit":"pentacles","rank":"8","element":"earth","upright":{"keywords":["mastery"],"meaning":"Disciplined practice toward mastery. (Marseille pip: interpret by number 8, pentacles element earth)."},"reversed":{"keywords":["lack of focus"],"meaning":"Cutting corners on the work. (Marseille pip: reversed pip carries softer reading)."},"astrology":"Sun in Virgo","numerology":8,"yes":"yes"},"reversed":false}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/tarot/marseille/draw/hero":{"post":{"tags":["Tarot: Marseille"],"summary":"Marseille: Tirage du Héros (Hero's Journey)","description":"Authentic 6-card Hero's Journey spread from Jodorowsky/Costa \"The Way of Tarot\": Hero / Objective / two Obstacles / Key / Resolution.","operationId":"tarot_marseille_draw_hero","x-quality":"yellow","x-source":"Camoin/Jodorowsky restoration of Conver 1760 deck; Yoav Ben-Dov \"Tarot: The Open Reading\"; pre-Waite Justice/Strength swap.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TarotDraw"},"example":{"seed":12345,"question":"What should I focus on?","allowReversed":true}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/tarot/marseille/draw/hero \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"seed\": 12345, \"question\": \"What should I focus on?\", \"allowReversed\": true }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/tarot/marseille/draw/hero', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"seed\": 12345,\n    \"question\": \"What should I focus on?\",\n    \"allowReversed\": true\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/tarot/marseille/draw/hero',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'seed': 12345,\n      'question': \"What should I focus on?\",\n      'allowReversed': True\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('tarot/marseille/draw/hero', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'seed' => 12345,\n        'question' => 'What should I focus on?',\n        'allowReversed' => true,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"spread":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"cardCount":{"type":"number","nullable":true}},"nullable":true},"seed":{"type":"number","nullable":true},"drawn":{"type":"array","items":{"type":"object","properties":{"position":{"type":"object","properties":{"index":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"card":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"category":{"type":"string","nullable":true},"suit":{"type":"string","nullable":true},"rank":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"upright":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"astrology":{"type":"string","nullable":true},"numerology":{"type":"number","nullable":true},"yes":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"spread":{"slug":"jodorowsky-hero","name":"Tirage du Héros (Jodorowsky Hero's Journey)","cardCount":6},"seed":12345,"drawn":[{"position":{"index":0,"name":"Hero","meaning":"The querent as protagonist; current state."},"card":{"slug":"8-of-pentacles-marseille","number":8,"name":"Eight of Pentacles","category":"minor","suit":"pentacles","rank":"8","element":"earth","upright":{"keywords":["mastery"],"meaning":"Disciplined practice toward mastery. (Marseille pip: interpret by number 8, pentacles element earth)."},"reversed":{"keywords":["lack of focus"],"meaning":"Cutting corners on the work. (Marseille pip: reversed pip carries softer reading)."},"astrology":"Sun in Virgo","numerology":8,"yes":"yes"},"reversed":false}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/tarot/marseille/draw/seven-card":{"post":{"tags":["Tarot: Marseille"],"summary":"Marseille: Seven-Card","description":"7-card pyramid spread.","operationId":"tarot_marseille_draw_seven-card","x-quality":"yellow","x-source":"Camoin/Jodorowsky restoration of Conver 1760 deck; Yoav Ben-Dov \"Tarot: The Open Reading\"; pre-Waite Justice/Strength swap.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TarotDraw"},"example":{"seed":12345,"question":"What should I focus on?","allowReversed":true}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/tarot/marseille/draw/seven-card \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"seed\": 12345, \"question\": \"What should I focus on?\", \"allowReversed\": true }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/tarot/marseille/draw/seven-card', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"seed\": 12345,\n    \"question\": \"What should I focus on?\",\n    \"allowReversed\": true\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/tarot/marseille/draw/seven-card',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'seed': 12345,\n      'question': \"What should I focus on?\",\n      'allowReversed': True\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('tarot/marseille/draw/seven-card', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'seed' => 12345,\n        'question' => 'What should I focus on?',\n        'allowReversed' => true,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"spread":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"cardCount":{"type":"number","nullable":true}},"nullable":true},"seed":{"type":"number","nullable":true},"drawn":{"type":"array","items":{"type":"object","properties":{"position":{"type":"object","properties":{"index":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"card":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"category":{"type":"string","nullable":true},"suit":{"type":"string","nullable":true},"rank":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"upright":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"astrology":{"type":"string","nullable":true},"numerology":{"type":"number","nullable":true},"yes":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"spread":{"slug":"seven-card","name":"Seven-Card Pyramid","cardCount":7},"seed":12345,"drawn":[{"position":{"index":0,"name":"Foundation A","meaning":"Underlying force A."},"card":{"slug":"8-of-pentacles-marseille","number":8,"name":"Eight of Pentacles","category":"minor","suit":"pentacles","rank":"8","element":"earth","upright":{"keywords":["mastery"],"meaning":"Disciplined practice toward mastery. (Marseille pip: interpret by number 8, pentacles element earth)."},"reversed":{"keywords":["lack of focus"],"meaning":"Cutting corners on the work. (Marseille pip: reversed pip carries softer reading)."},"astrology":"Sun in Virgo","numerology":8,"yes":"yes"},"reversed":false}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/tarot/marseille/draw/celtic-cross":{"post":{"tags":["Tarot: Marseille"],"summary":"Marseille: Celtic Cross","description":"Adapted 10-card Celtic Cross with Marseille pip-style reading.","operationId":"tarot_marseille_draw_celtic-cross","x-quality":"yellow","x-source":"Camoin/Jodorowsky restoration of Conver 1760 deck; Yoav Ben-Dov \"Tarot: The Open Reading\"; pre-Waite Justice/Strength swap.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TarotDraw"},"example":{"seed":12345,"question":"What should I focus on?","allowReversed":true}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/tarot/marseille/draw/celtic-cross \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"seed\": 12345, \"question\": \"What should I focus on?\", \"allowReversed\": true }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/tarot/marseille/draw/celtic-cross', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"seed\": 12345,\n    \"question\": \"What should I focus on?\",\n    \"allowReversed\": true\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/tarot/marseille/draw/celtic-cross',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'seed': 12345,\n      'question': \"What should I focus on?\",\n      'allowReversed': True\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('tarot/marseille/draw/celtic-cross', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'seed' => 12345,\n        'question' => 'What should I focus on?',\n        'allowReversed' => true,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"spread":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"cardCount":{"type":"number","nullable":true}},"nullable":true},"seed":{"type":"number","nullable":true},"drawn":{"type":"array","items":{"type":"object","properties":{"position":{"type":"object","properties":{"index":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"card":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"category":{"type":"string","nullable":true},"suit":{"type":"string","nullable":true},"rank":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"upright":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"astrology":{"type":"string","nullable":true},"numerology":{"type":"number","nullable":true},"yes":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"spread":{"slug":"celtic-cross","name":"Celtic Cross (Marseille)","cardCount":10},"seed":12345,"drawn":[{"position":{"index":0,"name":"Present","meaning":"Now."},"card":{"slug":"8-of-pentacles-marseille","number":8,"name":"Eight of Pentacles","category":"minor","suit":"pentacles","rank":"8","element":"earth","upright":{"keywords":["mastery"],"meaning":"Disciplined practice toward mastery. (Marseille pip: interpret by number 8, pentacles element earth)."},"reversed":{"keywords":["lack of focus"],"meaning":"Cutting corners on the work. (Marseille pip: reversed pip carries softer reading)."},"astrology":"Sun in Virgo","numerology":8,"yes":"yes"},"reversed":false}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/tarot/marseille/draw/decision":{"post":{"tags":["Tarot: Marseille"],"summary":"Marseille: Yes/No","description":"Single-card yes/no with verdict.","operationId":"tarot_marseille_draw_decision","x-quality":"yellow","x-source":"Camoin/Jodorowsky restoration of Conver 1760 deck; Yoav Ben-Dov \"Tarot: The Open Reading\"; pre-Waite Justice/Strength swap.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TarotDraw"},"example":{"seed":12345,"question":"What should I focus on?","allowReversed":true}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/tarot/marseille/draw/decision \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"seed\": 12345, \"question\": \"What should I focus on?\", \"allowReversed\": true }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/tarot/marseille/draw/decision', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"seed\": 12345,\n    \"question\": \"What should I focus on?\",\n    \"allowReversed\": true\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/tarot/marseille/draw/decision',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'seed': 12345,\n      'question': \"What should I focus on?\",\n      'allowReversed': True\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('tarot/marseille/draw/decision', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'seed' => 12345,\n        'question' => 'What should I focus on?',\n        'allowReversed' => true,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"verdict":{"type":"string","nullable":true},"reason":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"verdict":"...","reason":"..."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/tarot/marseille/draw/love":{"post":{"tags":["Tarot: Marseille"],"summary":"Marseille: Love","description":"5-card love and connection spread.","operationId":"tarot_marseille_draw_love","x-quality":"yellow","x-source":"Camoin/Jodorowsky restoration of Conver 1760 deck; Yoav Ben-Dov \"Tarot: The Open Reading\"; pre-Waite Justice/Strength swap.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TarotDraw"},"example":{"seed":12345,"question":"What should I focus on?","allowReversed":true}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/tarot/marseille/draw/love \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"seed\": 12345, \"question\": \"What should I focus on?\", \"allowReversed\": true }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/tarot/marseille/draw/love', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"seed\": 12345,\n    \"question\": \"What should I focus on?\",\n    \"allowReversed\": true\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/tarot/marseille/draw/love',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'seed': 12345,\n      'question': \"What should I focus on?\",\n      'allowReversed': True\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('tarot/marseille/draw/love', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'seed' => 12345,\n        'question' => 'What should I focus on?',\n        'allowReversed' => true,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"spread":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"cardCount":{"type":"number","nullable":true}},"nullable":true},"seed":{"type":"number","nullable":true},"drawn":{"type":"array","items":{"type":"object","properties":{"position":{"type":"object","properties":{"index":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"card":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"category":{"type":"string","nullable":true},"suit":{"type":"string","nullable":true},"rank":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"upright":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"astrology":{"type":"string","nullable":true},"numerology":{"type":"number","nullable":true},"yes":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"spread":{"slug":"love","name":"Love Spread","cardCount":5},"seed":12345,"drawn":[{"position":{"index":0,"name":"You","meaning":"Your contribution."},"card":{"slug":"8-of-pentacles-marseille","number":8,"name":"Eight of Pentacles","category":"minor","suit":"pentacles","rank":"8","element":"earth","upright":{"keywords":["mastery"],"meaning":"Disciplined practice toward mastery. (Marseille pip: interpret by number 8, pentacles element earth)."},"reversed":{"keywords":["lack of focus"],"meaning":"Cutting corners on the work. (Marseille pip: reversed pip carries softer reading)."},"astrology":"Sun in Virgo","numerology":8,"yes":"yes"},"reversed":false}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/tarot/marseille/draw/career":{"post":{"tags":["Tarot: Marseille"],"summary":"Marseille: Career","description":"4-card career spread.","operationId":"tarot_marseille_draw_career","x-quality":"yellow","x-source":"Camoin/Jodorowsky restoration of Conver 1760 deck; Yoav Ben-Dov \"Tarot: The Open Reading\"; pre-Waite Justice/Strength swap.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TarotDraw"},"example":{"seed":12345,"question":"What should I focus on?","allowReversed":true}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/tarot/marseille/draw/career \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"seed\": 12345, \"question\": \"What should I focus on?\", \"allowReversed\": true }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/tarot/marseille/draw/career', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"seed\": 12345,\n    \"question\": \"What should I focus on?\",\n    \"allowReversed\": true\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/tarot/marseille/draw/career',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'seed': 12345,\n      'question': \"What should I focus on?\",\n      'allowReversed': True\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('tarot/marseille/draw/career', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'seed' => 12345,\n        'question' => 'What should I focus on?',\n        'allowReversed' => true,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"spread":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"cardCount":{"type":"number","nullable":true}},"nullable":true},"seed":{"type":"number","nullable":true},"drawn":{"type":"array","items":{"type":"object","properties":{"position":{"type":"object","properties":{"index":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"card":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"category":{"type":"string","nullable":true},"suit":{"type":"string","nullable":true},"rank":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"upright":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"astrology":{"type":"string","nullable":true},"numerology":{"type":"number","nullable":true},"yes":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"spread":{"slug":"career","name":"Career","cardCount":4},"seed":12345,"drawn":[{"position":{"index":0,"name":"Now","meaning":"Where you stand."},"card":{"slug":"8-of-pentacles-marseille","number":8,"name":"Eight of Pentacles","category":"minor","suit":"pentacles","rank":"8","element":"earth","upright":{"keywords":["mastery"],"meaning":"Disciplined practice toward mastery. (Marseille pip: interpret by number 8, pentacles element earth)."},"reversed":{"keywords":["lack of focus"],"meaning":"Cutting corners on the work. (Marseille pip: reversed pip carries softer reading)."},"astrology":"Sun in Virgo","numerology":8,"yes":"yes"},"reversed":false}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/tarot/marseille/draw/spiritual":{"post":{"tags":["Tarot: Marseille"],"summary":"Marseille: Spiritual","description":"4-card spiritual development spread.","operationId":"tarot_marseille_draw_spiritual","x-quality":"yellow","x-source":"Camoin/Jodorowsky restoration of Conver 1760 deck; Yoav Ben-Dov \"Tarot: The Open Reading\"; pre-Waite Justice/Strength swap.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TarotDraw"},"example":{"seed":12345,"question":"What should I focus on?","allowReversed":true}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/tarot/marseille/draw/spiritual \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"seed\": 12345, \"question\": \"What should I focus on?\", \"allowReversed\": true }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/tarot/marseille/draw/spiritual', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"seed\": 12345,\n    \"question\": \"What should I focus on?\",\n    \"allowReversed\": true\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/tarot/marseille/draw/spiritual',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'seed': 12345,\n      'question': \"What should I focus on?\",\n      'allowReversed': True\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('tarot/marseille/draw/spiritual', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'seed' => 12345,\n        'question' => 'What should I focus on?',\n        'allowReversed' => true,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"spread":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"cardCount":{"type":"number","nullable":true}},"nullable":true},"seed":{"type":"number","nullable":true},"drawn":{"type":"array","items":{"type":"object","properties":{"position":{"type":"object","properties":{"index":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"card":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"category":{"type":"string","nullable":true},"suit":{"type":"string","nullable":true},"rank":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"upright":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"astrology":{"type":"string","nullable":true},"numerology":{"type":"number","nullable":true},"yes":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"spread":{"slug":"spiritual","name":"Spiritual Path","cardCount":4},"seed":12345,"drawn":[{"position":{"index":0,"name":"Soul Now","meaning":"Soul state now."},"card":{"slug":"8-of-pentacles-marseille","number":8,"name":"Eight of Pentacles","category":"minor","suit":"pentacles","rank":"8","element":"earth","upright":{"keywords":["mastery"],"meaning":"Disciplined practice toward mastery. (Marseille pip: interpret by number 8, pentacles element earth)."},"reversed":{"keywords":["lack of focus"],"meaning":"Cutting corners on the work. (Marseille pip: reversed pip carries softer reading)."},"astrology":"Sun in Virgo","numerology":8,"yes":"yes"},"reversed":false}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/tarot/marseille/daily":{"post":{"tags":["Tarot: Marseille"],"summary":"Marseille: Daily Card","description":"Daily Marseille card based on date seed.","operationId":"tarot_marseille_daily","x-quality":"yellow","x-source":"Camoin/Jodorowsky restoration of Conver 1760 deck; Yoav Ben-Dov \"Tarot: The Open Reading\"; pre-Waite Justice/Strength swap.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TarotDaily"},"example":{"date":"2026-05-04"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/tarot/marseille/daily \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"2026-05-04\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/tarot/marseille/daily', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"2026-05-04\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/tarot/marseille/daily',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"2026-05-04\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('tarot/marseille/daily', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '2026-05-04',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"date":{"type":"string","nullable":true},"spread":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"cardCount":{"type":"number","nullable":true}},"nullable":true},"seed":{"type":"number","nullable":true},"drawn":{"type":"array","items":{"type":"object","properties":{"position":{"type":"object","properties":{"index":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"card":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"category":{"type":"string","nullable":true},"suit":{"type":"string","nullable":true},"rank":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"upright":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"astrology":{"type":"string","nullable":true},"numerology":{"type":"number","nullable":true},"yes":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"date":"2026-05-04","spread":{"slug":"single-card","name":"Single Card","cardCount":1},"seed":20260504,"drawn":[{"position":{"index":0,"name":"The Card","meaning":"Essential guidance."},"card":{"slug":"page-of-cups-marseille","number":11,"name":"Valet of Cups","category":"court","suit":"cups","rank":"page","element":"water","upright":{"keywords":["intuitive message"],"meaning":"Intuitive message; emotional opening."},"reversed":{"keywords":["emotional immaturity"],"meaning":"Emotionally immature or blocked."},"astrology":"earth of water","numerology":2,"yes":"maybe"},"reversed":false}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/tarot/marseille/birth-card":{"post":{"tags":["Tarot: Marseille"],"summary":"Marseille: Birth Card","description":"Birth card per Greer method, Marseille deck.","operationId":"tarot_marseille_birth-card","x-quality":"yellow","x-source":"Camoin/Jodorowsky restoration of Conver 1760 deck; Yoav Ben-Dov \"Tarot: The Open Reading\"; pre-Waite Justice/Strength swap.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TarotDate"},"example":{"date":"1990-05-15"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/tarot/marseille/birth-card \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/tarot/marseille/birth-card', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/tarot/marseille/birth-card',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('tarot/marseille/birth-card', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"primary":{"type":"object","properties":{"name":{"type":"string","nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"primary":{"name":"..."}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/tarot/marseille/year-card":{"post":{"tags":["Tarot: Marseille"],"summary":"Marseille: Year Card","description":"Year card per Greer method.","operationId":"tarot_marseille_year-card","x-quality":"yellow","x-source":"Camoin/Jodorowsky restoration of Conver 1760 deck; Yoav Ben-Dov \"Tarot: The Open Reading\"; pre-Waite Justice/Strength swap.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TarotYear"},"example":{"date":"1990-05-15","year":2026}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/tarot/marseille/year-card \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"year\": 2026 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/tarot/marseille/year-card', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"year\": 2026\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/tarot/marseille/year-card',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'year': 2026\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('tarot/marseille/year-card', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'year' => 2026,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"card":{"type":"object","properties":{"name":{"type":"string","nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"card":{"name":"..."}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/tarot/marseille/interpret":{"post":{"tags":["Tarot: Marseille"],"summary":"Marseille: Interpret","description":"Resolve list of card slugs into meanings.","operationId":"tarot_marseille_interpret","x-quality":"yellow","x-source":"Camoin/Jodorowsky restoration of Conver 1760 deck; Yoav Ben-Dov \"Tarot: The Open Reading\"; pre-Waite Justice/Strength swap.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TarotInterpret"},"example":{"cards":["le-mat-the-fool-marseille","le-bateleur-the-juggler-marseille"],"question":"Career change?"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/tarot/marseille/interpret \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"cards\": [ \"le-mat-the-fool-marseille\", \"le-bateleur-the-juggler-marseille\" ], \"question\": \"Career change?\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/tarot/marseille/interpret', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"cards\": [\n      \"le-mat-the-fool-marseille\",\n      \"le-bateleur-the-juggler-marseille\"\n    ],\n    \"question\": \"Career change?\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/tarot/marseille/interpret',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'cards': [\n        \"le-mat-the-fool-marseille\",\n        \"le-bateleur-the-juggler-marseille\"\n      ],\n      'question': \"Career change?\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('tarot/marseille/interpret', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'cards' => ['le-mat-the-fool-marseille', 'le-bateleur-the-juggler-marseille'],\n        'question' => 'Career change?',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"question":{"type":"string","nullable":true},"cards":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"upright":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"question":"Career change?","cards":[{"slug":"le-mat-the-fool-marseille","name":"Le Mat (The Fool)","upright":{"keywords":["leap of faith"],"meaning":"The wanderer leaps without map; trust the journey."}}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/tarot/marseille/clarify":{"post":{"tags":["Tarot: Marseille"],"summary":"Marseille: Clarifier","description":"Single clarifying card.","operationId":"tarot_marseille_clarify","x-quality":"yellow","x-source":"Camoin/Jodorowsky restoration of Conver 1760 deck; Yoav Ben-Dov \"Tarot: The Open Reading\"; pre-Waite Justice/Strength swap.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TarotDraw"},"example":{"seed":12345,"question":"What should I focus on?","allowReversed":true}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/tarot/marseille/clarify \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"seed\": 12345, \"question\": \"What should I focus on?\", \"allowReversed\": true }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/tarot/marseille/clarify', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"seed\": 12345,\n    \"question\": \"What should I focus on?\",\n    \"allowReversed\": true\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/tarot/marseille/clarify',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'seed': 12345,\n      'question': \"What should I focus on?\",\n      'allowReversed': True\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('tarot/marseille/clarify', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'seed' => 12345,\n        'question' => 'What should I focus on?',\n        'allowReversed' => true,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"type":{"type":"string","nullable":true},"spread":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"cardCount":{"type":"number","nullable":true}},"nullable":true},"seed":{"type":"number","nullable":true},"drawn":{"type":"array","items":{"type":"object","properties":{"position":{"type":"object","properties":{"index":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"card":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"category":{"type":"string","nullable":true},"suit":{"type":"string","nullable":true},"rank":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"upright":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"astrology":{"type":"string","nullable":true},"numerology":{"type":"number","nullable":true},"yes":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"type":"clarify","spread":{"slug":"single-card","name":"Single Card","cardCount":1},"seed":12345,"drawn":[{"position":{"index":0,"name":"The Card","meaning":"Essential guidance."},"card":{"slug":"8-of-pentacles-marseille","number":8,"name":"Eight of Pentacles","category":"minor","suit":"pentacles","rank":"8","element":"earth","upright":{"keywords":["mastery"],"meaning":"Disciplined practice toward mastery. (Marseille pip: interpret by number 8, pentacles element earth)."},"reversed":{"keywords":["lack of focus"],"meaning":"Cutting corners on the work. (Marseille pip: reversed pip carries softer reading)."},"astrology":"Sun in Virgo","numerology":8,"yes":"yes"},"reversed":false}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/tarot/marseille/timing":{"post":{"tags":["Tarot: Marseille"],"summary":"Marseille: Timing","description":"Single timing card.","operationId":"tarot_marseille_timing","x-quality":"yellow","x-source":"Camoin/Jodorowsky restoration of Conver 1760 deck; Yoav Ben-Dov \"Tarot: The Open Reading\"; pre-Waite Justice/Strength swap.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TarotDraw"},"example":{"seed":12345,"question":"What should I focus on?","allowReversed":true}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/tarot/marseille/timing \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"seed\": 12345, \"question\": \"What should I focus on?\", \"allowReversed\": true }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/tarot/marseille/timing', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"seed\": 12345,\n    \"question\": \"What should I focus on?\",\n    \"allowReversed\": true\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/tarot/marseille/timing',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'seed': 12345,\n      'question': \"What should I focus on?\",\n      'allowReversed': True\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('tarot/marseille/timing', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'seed' => 12345,\n        'question' => 'What should I focus on?',\n        'allowReversed' => true,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"type":{"type":"string","nullable":true},"spread":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"cardCount":{"type":"number","nullable":true}},"nullable":true},"seed":{"type":"number","nullable":true},"drawn":{"type":"array","items":{"type":"object","properties":{"position":{"type":"object","properties":{"index":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"card":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"category":{"type":"string","nullable":true},"suit":{"type":"string","nullable":true},"rank":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"upright":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"astrology":{"type":"string","nullable":true},"numerology":{"type":"number","nullable":true},"yes":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"type":"timing","spread":{"slug":"single-card","name":"Single Card","cardCount":1},"seed":12345,"drawn":[{"position":{"index":0,"name":"The Card","meaning":"Essential guidance."},"card":{"slug":"8-of-pentacles-marseille","number":8,"name":"Eight of Pentacles","category":"minor","suit":"pentacles","rank":"8","element":"earth","upright":{"keywords":["mastery"],"meaning":"Disciplined practice toward mastery. (Marseille pip: interpret by number 8, pentacles element earth)."},"reversed":{"keywords":["lack of focus"],"meaning":"Cutting corners on the work. (Marseille pip: reversed pip carries softer reading)."},"astrology":"Sun in Virgo","numerology":8,"yes":"yes"},"reversed":false}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/tarot/lenormand/cards":{"get":{"tags":["Tarot: Lenormand"],"summary":"Lenormand: All Cards","description":"36-card Lenormand oracle deck.","operationId":"tarot_lenormand_cards_get","x-quality":"green","x-source":"Mlle Lenormand 1772-1843 / Game of Hope (Bavarian, 1799); modern revival via Andy Boroveshengra, Caitlin Matthews \"The Complete Lenormand Oracle Handbook\".","security":[{"ApiKeyAuth":[]}],"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X GET https://api.astroway.info/v1/tarot/lenormand/cards \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/tarot/lenormand/cards', {\n  method: 'GET',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.get(\n    'https://api.astroway.info/v1/tarot/lenormand/cards',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->get('tarot/lenormand/cards', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"category":{"type":"string","nullable":true},"upright":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"yes":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"count":{"type":"number","nullable":true}}}}},"example":{"ok":true,"data":{"items":[{"slug":"rider","number":1,"name":"Rider","category":"lenormand","upright":{"keywords":["news"],"meaning":"news arrives, swift movement, message"},"reversed":{"keywords":["news"],"meaning":"news arrives, swift movement, message (reversed: shadow side or delay)."},"yes":"maybe"}],"count":36}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/tarot/lenormand/cards/{slug}":{"get":{"tags":["Tarot: Lenormand"],"summary":"Lenormand: Single Card","description":"Single Lenormand card lookup by slug.","operationId":"tarot_lenormand_cards_{slug}_get","x-quality":"green","x-source":"Mlle Lenormand 1772-1843 / Game of Hope (Bavarian, 1799); modern revival via Andy Boroveshengra, Caitlin Matthews \"The Complete Lenormand Oracle Handbook\".","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"slug","in":"path","required":true,"description":"Card slug, lowercase and hyphenated.","schema":{"type":"string"},"example":"rider"},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X GET https://api.astroway.info/v1/tarot/lenormand/cards/{slug} \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/tarot/lenormand/cards/{slug}', {\n  method: 'GET',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.get(\n    'https://api.astroway.info/v1/tarot/lenormand/cards/{slug}',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->get('tarot/lenormand/cards/{slug}', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"number":{"type":"number","nullable":true}}}}},"example":{"ok":true,"data":{"slug":"rider","name":"Rider","number":1}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}}}},"/tarot/lenormand/draw/three-card":{"post":{"tags":["Tarot: Lenormand"],"summary":"Lenormand: Three-Card","description":"Subject / Situation / Outcome three-card line.","operationId":"tarot_lenormand_draw_three-card","x-quality":"green","x-source":"Mlle Lenormand 1772-1843 / Game of Hope (Bavarian, 1799); modern revival via Andy Boroveshengra, Caitlin Matthews \"The Complete Lenormand Oracle Handbook\".","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TarotDraw"},"example":{"seed":12345,"question":"What should I focus on?","allowReversed":true}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/tarot/lenormand/draw/three-card \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"seed\": 12345, \"question\": \"What should I focus on?\", \"allowReversed\": true }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/tarot/lenormand/draw/three-card', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"seed\": 12345,\n    \"question\": \"What should I focus on?\",\n    \"allowReversed\": true\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/tarot/lenormand/draw/three-card',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'seed': 12345,\n      'question': \"What should I focus on?\",\n      'allowReversed': True\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('tarot/lenormand/draw/three-card', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'seed' => 12345,\n        'question' => 'What should I focus on?',\n        'allowReversed' => true,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"spread":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"cardCount":{"type":"number","nullable":true}},"nullable":true},"seed":{"type":"number","nullable":true},"drawn":{"type":"array","items":{"type":"object","properties":{"position":{"type":"object","properties":{"index":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"card":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"category":{"type":"string","nullable":true},"upright":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"yes":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"spread":{"slug":"three-card","name":"Three-Card Line","cardCount":3},"seed":12345,"drawn":[{"position":{"index":0,"name":"Subject","meaning":"The querent or subject."},"card":{"slug":"dog","number":18,"name":"Dog","category":"lenormand","upright":{"keywords":["friend"],"meaning":"loyal friend, dependability, trusted person"},"reversed":{"keywords":["friend"],"meaning":"loyal friend, dependability, trusted person (reversed: shadow side or delay)."},"yes":"maybe"},"reversed":true}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/tarot/lenormand/draw/grand-tableau":{"post":{"tags":["Tarot: Lenormand"],"summary":"Lenormand: Grand Tableau","description":"Full 36-card layout: every card and house used.","operationId":"tarot_lenormand_draw_grand-tableau","x-quality":"green","x-source":"Mlle Lenormand 1772-1843 / Game of Hope (Bavarian, 1799); modern revival via Andy Boroveshengra, Caitlin Matthews \"The Complete Lenormand Oracle Handbook\".","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TarotDraw"},"example":{"seed":12345,"question":"What should I focus on?","allowReversed":true}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/tarot/lenormand/draw/grand-tableau \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"seed\": 12345, \"question\": \"What should I focus on?\", \"allowReversed\": true }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/tarot/lenormand/draw/grand-tableau', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"seed\": 12345,\n    \"question\": \"What should I focus on?\",\n    \"allowReversed\": true\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/tarot/lenormand/draw/grand-tableau',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'seed': 12345,\n      'question': \"What should I focus on?\",\n      'allowReversed': True\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('tarot/lenormand/draw/grand-tableau', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'seed' => 12345,\n        'question' => 'What should I focus on?',\n        'allowReversed' => true,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"spread":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"cardCount":{"type":"number","nullable":true}},"nullable":true},"seed":{"type":"number","nullable":true},"drawn":{"type":"array","items":{"type":"object","properties":{"position":{"type":"object","properties":{"index":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"card":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"category":{"type":"string","nullable":true},"upright":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"yes":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"spread":{"slug":"grand-tableau","name":"Grand Tableau","cardCount":36},"seed":12345,"drawn":[{"position":{"index":0,"name":"House 1: Rider","meaning":"Life area: messages, news, information about the situation. Card landing here modifies this area."},"card":{"slug":"dog","number":18,"name":"Dog","category":"lenormand","upright":{"keywords":["friend"],"meaning":"loyal friend, dependability, trusted person"},"reversed":{"keywords":["friend"],"meaning":"loyal friend, dependability, trusted person (reversed: shadow side or delay)."},"yes":"maybe"},"reversed":true}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/tarot/lenormand/draw/9-card-square":{"post":{"tags":["Tarot: Lenormand"],"summary":"Lenormand: 9-Card Square","description":"Three-by-three grid: rows = past/present/future, cols = mind/heart/body.","operationId":"tarot_lenormand_draw_9-card-square","x-quality":"green","x-source":"Mlle Lenormand 1772-1843 / Game of Hope (Bavarian, 1799); modern revival via Andy Boroveshengra, Caitlin Matthews \"The Complete Lenormand Oracle Handbook\".","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TarotDraw"},"example":{"seed":12345,"question":"What should I focus on?","allowReversed":true}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/tarot/lenormand/draw/9-card-square \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"seed\": 12345, \"question\": \"What should I focus on?\", \"allowReversed\": true }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/tarot/lenormand/draw/9-card-square', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"seed\": 12345,\n    \"question\": \"What should I focus on?\",\n    \"allowReversed\": true\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/tarot/lenormand/draw/9-card-square',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'seed': 12345,\n      'question': \"What should I focus on?\",\n      'allowReversed': True\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('tarot/lenormand/draw/9-card-square', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'seed' => 12345,\n        'question' => 'What should I focus on?',\n        'allowReversed' => true,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"spread":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"cardCount":{"type":"number","nullable":true}},"nullable":true},"seed":{"type":"number","nullable":true},"drawn":{"type":"array","items":{"type":"object","properties":{"position":{"type":"object","properties":{"index":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"card":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"category":{"type":"string","nullable":true},"upright":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"yes":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"spread":{"slug":"nine-card-square","name":"9-Card Square (3×3)","cardCount":9},"seed":12345,"drawn":[{"position":{"index":0,"name":"Top-Left Corner","meaning":"Main influence (often past or first cause)."},"card":{"slug":"dog","number":18,"name":"Dog","category":"lenormand","upright":{"keywords":["friend"],"meaning":"loyal friend, dependability, trusted person"},"reversed":{"keywords":["friend"],"meaning":"loyal friend, dependability, trusted person (reversed: shadow side or delay)."},"yes":"maybe"},"reversed":true}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/tarot/lenormand/draw/line-of-five":{"post":{"tags":["Tarot: Lenormand"],"summary":"Lenormand: Line of Five","description":"Five-card linear story spread.","operationId":"tarot_lenormand_draw_line-of-five","x-quality":"green","x-source":"Mlle Lenormand 1772-1843 / Game of Hope (Bavarian, 1799); modern revival via Andy Boroveshengra, Caitlin Matthews \"The Complete Lenormand Oracle Handbook\".","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TarotDraw"},"example":{"seed":12345,"question":"What should I focus on?","allowReversed":true}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/tarot/lenormand/draw/line-of-five \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"seed\": 12345, \"question\": \"What should I focus on?\", \"allowReversed\": true }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/tarot/lenormand/draw/line-of-five', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"seed\": 12345,\n    \"question\": \"What should I focus on?\",\n    \"allowReversed\": true\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/tarot/lenormand/draw/line-of-five',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'seed': 12345,\n      'question': \"What should I focus on?\",\n      'allowReversed': True\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('tarot/lenormand/draw/line-of-five', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'seed' => 12345,\n        'question' => 'What should I focus on?',\n        'allowReversed' => true,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"spread":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"cardCount":{"type":"number","nullable":true}},"nullable":true},"seed":{"type":"number","nullable":true},"drawn":{"type":"array","items":{"type":"object","properties":{"position":{"type":"object","properties":{"index":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"card":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"category":{"type":"string","nullable":true},"upright":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"yes":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"spread":{"slug":"line-of-five","name":"Line of Five","cardCount":5},"seed":12345,"drawn":[{"position":{"index":0,"name":"Past","meaning":"Past influence."},"card":{"slug":"dog","number":18,"name":"Dog","category":"lenormand","upright":{"keywords":["friend"],"meaning":"loyal friend, dependability, trusted person"},"reversed":{"keywords":["friend"],"meaning":"loyal friend, dependability, trusted person (reversed: shadow side or delay)."},"yes":"maybe"},"reversed":true}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/tarot/lenormand/draw/celtic-cross-lenormand":{"post":{"tags":["Tarot: Lenormand"],"summary":"Lenormand: Celtic Cross","description":"Adapted Celtic Cross with Lenormand cards.","operationId":"tarot_lenormand_draw_celtic-cross-lenormand","x-quality":"green","x-source":"Mlle Lenormand 1772-1843 / Game of Hope (Bavarian, 1799); modern revival via Andy Boroveshengra, Caitlin Matthews \"The Complete Lenormand Oracle Handbook\".","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TarotDraw"},"example":{"seed":12345,"question":"What should I focus on?","allowReversed":true}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/tarot/lenormand/draw/celtic-cross-lenormand \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"seed\": 12345, \"question\": \"What should I focus on?\", \"allowReversed\": true }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/tarot/lenormand/draw/celtic-cross-lenormand', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"seed\": 12345,\n    \"question\": \"What should I focus on?\",\n    \"allowReversed\": true\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/tarot/lenormand/draw/celtic-cross-lenormand',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'seed': 12345,\n      'question': \"What should I focus on?\",\n      'allowReversed': True\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('tarot/lenormand/draw/celtic-cross-lenormand', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'seed' => 12345,\n        'question' => 'What should I focus on?',\n        'allowReversed' => true,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"spread":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"cardCount":{"type":"number","nullable":true}},"nullable":true},"seed":{"type":"number","nullable":true},"drawn":{"type":"array","items":{"type":"object","properties":{"position":{"type":"object","properties":{"index":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"card":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"category":{"type":"string","nullable":true},"upright":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"yes":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"spread":{"slug":"celtic-cross-lenormand","name":"Detailed 10-Card Cross (modern hybrid)","cardCount":10},"seed":12345,"drawn":[{"position":{"index":0,"name":"Present","meaning":"Now."},"card":{"slug":"dog","number":18,"name":"Dog","category":"lenormand","upright":{"keywords":["friend"],"meaning":"loyal friend, dependability, trusted person"},"reversed":{"keywords":["friend"],"meaning":"loyal friend, dependability, trusted person (reversed: shadow side or delay)."},"yes":"maybe"},"reversed":true}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/tarot/lenormand/draw/relationship":{"post":{"tags":["Tarot: Lenormand"],"summary":"Lenormand: Relationship","description":"7-card relationship dynamics.","operationId":"tarot_lenormand_draw_relationship","x-quality":"green","x-source":"Mlle Lenormand 1772-1843 / Game of Hope (Bavarian, 1799); modern revival via Andy Boroveshengra, Caitlin Matthews \"The Complete Lenormand Oracle Handbook\".","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TarotDraw"},"example":{"seed":12345,"question":"What should I focus on?","allowReversed":true}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/tarot/lenormand/draw/relationship \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"seed\": 12345, \"question\": \"What should I focus on?\", \"allowReversed\": true }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/tarot/lenormand/draw/relationship', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"seed\": 12345,\n    \"question\": \"What should I focus on?\",\n    \"allowReversed\": true\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/tarot/lenormand/draw/relationship',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'seed': 12345,\n      'question': \"What should I focus on?\",\n      'allowReversed': True\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('tarot/lenormand/draw/relationship', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'seed' => 12345,\n        'question' => 'What should I focus on?',\n        'allowReversed' => true,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"spread":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"cardCount":{"type":"number","nullable":true}},"nullable":true},"seed":{"type":"number","nullable":true},"drawn":{"type":"array","items":{"type":"object","properties":{"position":{"type":"object","properties":{"index":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"card":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"category":{"type":"string","nullable":true},"upright":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"yes":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"spread":{"slug":"relationship","name":"Relationship","cardCount":7},"seed":12345,"drawn":[{"position":{"index":0,"name":"You","meaning":"Your contribution."},"card":{"slug":"dog","number":18,"name":"Dog","category":"lenormand","upright":{"keywords":["friend"],"meaning":"loyal friend, dependability, trusted person"},"reversed":{"keywords":["friend"],"meaning":"loyal friend, dependability, trusted person (reversed: shadow side or delay)."},"yes":"maybe"},"reversed":true}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/tarot/lenormand/daily":{"post":{"tags":["Tarot: Lenormand"],"summary":"Lenormand: Daily Cards","description":"Daily three-card draw based on date seed.","operationId":"tarot_lenormand_daily","x-quality":"green","x-source":"Mlle Lenormand 1772-1843 / Game of Hope (Bavarian, 1799); modern revival via Andy Boroveshengra, Caitlin Matthews \"The Complete Lenormand Oracle Handbook\".","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TarotDaily"},"example":{"date":"2026-05-04"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/tarot/lenormand/daily \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"2026-05-04\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/tarot/lenormand/daily', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"2026-05-04\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/tarot/lenormand/daily',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"2026-05-04\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('tarot/lenormand/daily', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '2026-05-04',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"date":{"type":"string","nullable":true},"spread":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"cardCount":{"type":"number","nullable":true}},"nullable":true},"seed":{"type":"number","nullable":true},"drawn":{"type":"array","items":{"type":"object","properties":{"position":{"type":"object","properties":{"index":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"card":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"category":{"type":"string","nullable":true},"upright":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"yes":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"date":"2026-05-04","spread":{"slug":"three-card","name":"Three-Card Line","cardCount":3},"seed":20260504,"drawn":[{"position":{"index":0,"name":"Subject","meaning":"The querent or subject."},"card":{"slug":"fish","number":34,"name":"Fish","category":"lenormand","upright":{"keywords":["money"],"meaning":"money, business, abundance, finance"},"reversed":{"keywords":["money"],"meaning":"money, business, abundance, finance (reversed: shadow side or delay)."},"yes":"yes"},"reversed":true}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/tarot/lenormand/houses":{"get":{"tags":["Tarot: Lenormand"],"summary":"Lenormand: 36 Houses","description":"The 36 fixed houses for Grand Tableau interpretation.","operationId":"tarot_lenormand_houses_get","x-quality":"green","x-source":"Mlle Lenormand 1772-1843 / Game of Hope (Bavarian, 1799); modern revival via Andy Boroveshengra, Caitlin Matthews \"The Complete Lenormand Oracle Handbook\".","security":[{"ApiKeyAuth":[]}],"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X GET https://api.astroway.info/v1/tarot/lenormand/houses \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/tarot/lenormand/houses', {\n  method: 'GET',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.get(\n    'https://api.astroway.info/v1/tarot/lenormand/houses',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->get('tarot/lenormand/houses', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"position":{"type":"number","nullable":true},"baseCardName":{"type":"string","nullable":true},"lifeArea":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"count":{"type":"number","nullable":true}}}}},"example":{"ok":true,"data":{"items":[{"position":1,"baseCardName":"Rider","lifeArea":"messages, news, information about the situation"}],"count":36}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/destiny-matrix/ladini":{"post":{"tags":["Destiny Matrix"],"summary":"Destiny Matrix: Ladini Method","description":"The core of the Destiny Matrix per Natalia Ladini's method from a birth date: the personal square (pointA day, pointB month, pointC year digits, pointD bottom = A+B+C, pointE centre = A+B+C+D), the ancestral square corners, the sky (B+D) and earth (A+C) lines and the personal purpose, each with its arcanum. Numbers above 22 are reduced by summing digits. `karmicTail`, `loveLine` and `moneyLine` give the three arcana of each chain read from the centre outward, with `code` (\"3-7-22\"); the love and money channels share the `crossing` point. `ageScale` lists the 64 points from 0 to 78.75 years, clockwise from A in 1.25-year steps (the example shows the first 3). Ladini publishes no formulas; the chains and the scale follow E. Pribylova's book and the published calculators, which agree.","operationId":"destiny-matrix_ladini","x-quality":"yellow","x-source":"Natalia Ladini, single-author method (CIS market). Synthesises 22 Major Arcana with 22-position diagram from birth date.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DestinyMatrixLadini"},"example":{"date":"1990-05-15"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/destiny-matrix/ladini \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/destiny-matrix/ladini', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/destiny-matrix/ladini',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('destiny-matrix/ladini', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"method":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true},"date":{"type":"string","nullable":true},"pointA":{"type":"object","properties":{"number":{"type":"number","nullable":true},"arcanum":{"type":"object","properties":{"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"archetype":{"type":"string","nullable":true},"positiveSide":{"type":"string","nullable":true},"negativeSide":{"type":"string","nullable":true},"taskOfSoul":{"type":"string","nullable":true},"resourceOffered":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"pointB":{"type":"object","properties":{"number":{"type":"number","nullable":true},"arcanum":{"type":"object","properties":{"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"archetype":{"type":"string","nullable":true},"positiveSide":{"type":"string","nullable":true},"negativeSide":{"type":"string","nullable":true},"taskOfSoul":{"type":"string","nullable":true},"resourceOffered":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"pointC":{"type":"object","properties":{"number":{"type":"number","nullable":true},"arcanum":{"type":"object","properties":{"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"archetype":{"type":"string","nullable":true},"positiveSide":{"type":"string","nullable":true},"negativeSide":{"type":"string","nullable":true},"taskOfSoul":{"type":"string","nullable":true},"resourceOffered":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"pointD":{"type":"object","properties":{"number":{"type":"number","nullable":true},"arcanum":{"type":"object","properties":{"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"archetype":{"type":"string","nullable":true},"positiveSide":{"type":"string","nullable":true},"negativeSide":{"type":"string","nullable":true},"taskOfSoul":{"type":"string","nullable":true},"resourceOffered":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"pointE":{"type":"object","properties":{"number":{"type":"number","nullable":true},"arcanum":{"type":"object","properties":{"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"archetype":{"type":"string","nullable":true},"positiveSide":{"type":"string","nullable":true},"negativeSide":{"type":"string","nullable":true},"taskOfSoul":{"type":"string","nullable":true},"resourceOffered":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"centre":{"type":"object","properties":{"number":{"type":"number","nullable":true},"arcanum":{"type":"object","properties":{"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"archetype":{"type":"string","nullable":true},"positiveSide":{"type":"string","nullable":true},"negativeSide":{"type":"string","nullable":true},"taskOfSoul":{"type":"string","nullable":true},"resourceOffered":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"ancestral":{"type":"object","properties":{"topLeft":{"type":"object","properties":{"number":{"type":"number","nullable":true},"arcanum":{"type":"object","properties":{"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"archetype":{"type":"string","nullable":true},"positiveSide":{"type":"string","nullable":true},"negativeSide":{"type":"string","nullable":true},"taskOfSoul":{"type":"string","nullable":true},"resourceOffered":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"topRight":{"type":"object","properties":{"number":{"type":"number","nullable":true},"arcanum":{"type":"object","properties":{"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"archetype":{"type":"string","nullable":true},"positiveSide":{"type":"string","nullable":true},"negativeSide":{"type":"string","nullable":true},"taskOfSoul":{"type":"string","nullable":true},"resourceOffered":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"bottomRight":{"type":"object","properties":{"number":{"type":"number","nullable":true},"arcanum":{"type":"object","properties":{"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"archetype":{"type":"string","nullable":true},"positiveSide":{"type":"string","nullable":true},"negativeSide":{"type":"string","nullable":true},"taskOfSoul":{"type":"string","nullable":true},"resourceOffered":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"bottomLeft":{"type":"object","properties":{"number":{"type":"number","nullable":true},"arcanum":{"type":"object","properties":{"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"archetype":{"type":"string","nullable":true},"positiveSide":{"type":"string","nullable":true},"negativeSide":{"type":"string","nullable":true},"taskOfSoul":{"type":"string","nullable":true},"resourceOffered":{"type":"string","nullable":true}},"nullable":true}},"nullable":true}},"nullable":true},"skyAxis":{"type":"object","properties":{"number":{"type":"number","nullable":true},"arcanum":{"type":"object","properties":{"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"archetype":{"type":"string","nullable":true},"positiveSide":{"type":"string","nullable":true},"negativeSide":{"type":"string","nullable":true},"taskOfSoul":{"type":"string","nullable":true},"resourceOffered":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"earthAxis":{"type":"object","properties":{"number":{"type":"number","nullable":true},"arcanum":{"type":"object","properties":{"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"archetype":{"type":"string","nullable":true},"positiveSide":{"type":"string","nullable":true},"negativeSide":{"type":"string","nullable":true},"taskOfSoul":{"type":"string","nullable":true},"resourceOffered":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"personalPurpose":{"type":"object","properties":{"number":{"type":"number","nullable":true},"arcanum":{"type":"object","properties":{"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"archetype":{"type":"string","nullable":true},"positiveSide":{"type":"string","nullable":true},"negativeSide":{"type":"string","nullable":true},"taskOfSoul":{"type":"string","nullable":true},"resourceOffered":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"moneyLineNode":{"type":"object","properties":{"number":{"type":"number","nullable":true},"arcanum":{"type":"object","properties":{"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"archetype":{"type":"string","nullable":true},"positiveSide":{"type":"string","nullable":true},"negativeSide":{"type":"string","nullable":true},"taskOfSoul":{"type":"string","nullable":true},"resourceOffered":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"loveLineNode":{"type":"object","properties":{"number":{"type":"number","nullable":true},"arcanum":{"type":"object","properties":{"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"archetype":{"type":"string","nullable":true},"positiveSide":{"type":"string","nullable":true},"negativeSide":{"type":"string","nullable":true},"taskOfSoul":{"type":"string","nullable":true},"resourceOffered":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"karmicTailSum":{"type":"object","properties":{"number":{"type":"number","nullable":true},"arcanum":{"type":"object","properties":{"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"archetype":{"type":"string","nullable":true},"positiveSide":{"type":"string","nullable":true},"negativeSide":{"type":"string","nullable":true},"taskOfSoul":{"type":"string","nullable":true},"resourceOffered":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"karmicTail":{"type":"object","properties":{"code":{"type":"string","nullable":true},"d1":{"type":"object","properties":{"number":{"type":"number","nullable":true},"arcanum":{"type":"object","properties":{"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"archetype":{"type":"string","nullable":true},"positiveSide":{"type":"string","nullable":true},"negativeSide":{"type":"string","nullable":true},"taskOfSoul":{"type":"string","nullable":true},"resourceOffered":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"d2":{"type":"object","properties":{"number":{"type":"number","nullable":true},"arcanum":{"type":"object","properties":{"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"archetype":{"type":"string","nullable":true},"positiveSide":{"type":"string","nullable":true},"negativeSide":{"type":"string","nullable":true},"taskOfSoul":{"type":"string","nullable":true},"resourceOffered":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"d":{"type":"object","properties":{"number":{"type":"number","nullable":true},"arcanum":{"type":"object","properties":{"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"archetype":{"type":"string","nullable":true},"positiveSide":{"type":"string","nullable":true},"negativeSide":{"type":"string","nullable":true},"taskOfSoul":{"type":"string","nullable":true},"resourceOffered":{"type":"string","nullable":true}},"nullable":true}},"nullable":true}},"nullable":true},"loveLine":{"type":"object","properties":{"code":{"type":"string","nullable":true},"d1":{"type":"object","properties":{"number":{"type":"number","nullable":true},"arcanum":{"type":"object","properties":{"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"archetype":{"type":"string","nullable":true},"positiveSide":{"type":"string","nullable":true},"negativeSide":{"type":"string","nullable":true},"taskOfSoul":{"type":"string","nullable":true},"resourceOffered":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"heart":{"type":"object","properties":{"number":{"type":"number","nullable":true},"arcanum":{"type":"object","properties":{"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"archetype":{"type":"string","nullable":true},"positiveSide":{"type":"string","nullable":true},"negativeSide":{"type":"string","nullable":true},"taskOfSoul":{"type":"string","nullable":true},"resourceOffered":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"crossing":{"type":"object","properties":{"number":{"type":"number","nullable":true},"arcanum":{"type":"object","properties":{"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"archetype":{"type":"string","nullable":true},"positiveSide":{"type":"string","nullable":true},"negativeSide":{"type":"string","nullable":true},"taskOfSoul":{"type":"string","nullable":true},"resourceOffered":{"type":"string","nullable":true}},"nullable":true}},"nullable":true}},"nullable":true},"moneyLine":{"type":"object","properties":{"code":{"type":"string","nullable":true},"crossing":{"type":"object","properties":{"number":{"type":"number","nullable":true},"arcanum":{"type":"object","properties":{"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"archetype":{"type":"string","nullable":true},"positiveSide":{"type":"string","nullable":true},"negativeSide":{"type":"string","nullable":true},"taskOfSoul":{"type":"string","nullable":true},"resourceOffered":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"dollar":{"type":"object","properties":{"number":{"type":"number","nullable":true},"arcanum":{"type":"object","properties":{"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"archetype":{"type":"string","nullable":true},"positiveSide":{"type":"string","nullable":true},"negativeSide":{"type":"string","nullable":true},"taskOfSoul":{"type":"string","nullable":true},"resourceOffered":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"c1":{"type":"object","properties":{"number":{"type":"number","nullable":true},"arcanum":{"type":"object","properties":{"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"archetype":{"type":"string","nullable":true},"positiveSide":{"type":"string","nullable":true},"negativeSide":{"type":"string","nullable":true},"taskOfSoul":{"type":"string","nullable":true},"resourceOffered":{"type":"string","nullable":true}},"nullable":true}},"nullable":true}},"nullable":true},"ageScale":{"type":"array","items":{"type":"object","properties":{"age":{"type":"number","nullable":true},"number":{"type":"number","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"method":"ladini","disclaimer":"Single-author method (Natalia Ladini, CIS market). Not historically attested.","date":"1990-05-15","pointA":{"number":15,"arcanum":{"number":15,"name":"The Devil","archetype":"shadow","positiveSide":"integration of shadow, sexual force, embodiment","negativeSide":"addiction, materialism, bondage","taskOfSoul":"face and integrate the shadow","resourceOffered":"access to vital and shadow energy"}},"pointB":{"number":5,"arcanum":{"number":5,"name":"The Hierophant","archetype":"transmitter","positiveSide":"spiritual teaching, mentorship, sacred tradition","negativeSide":"dogma, control through belief, conformity","taskOfSoul":"transmit timeless wisdom in modern form","resourceOffered":"connection to lineage, teaching gift"}},"pointC":{"number":19,"arcanum":{"number":19,"name":"The Sun","archetype":"illuminator","positiveSide":"joy, vitality, success, clarity","negativeSide":"inflation, burnout, false success","taskOfSoul":"shine authentic light","resourceOffered":"access to vital joy"}},"pointD":{"number":12,"arcanum":{"number":12,"name":"The Hanged Man","archetype":"surrenderer","positiveSide":"sacred sacrifice, new perspective, surrender","negativeSide":"martyrdom, paralysis, victim","taskOfSoul":"release for new sight","resourceOffered":"capacity for conscious sacrifice"}},"pointE":{"number":6,"arcanum":{"number":6,"name":"The Lovers","archetype":"partner","positiveSide":"love, value alignment, conscious choice","negativeSide":"codependence, indecision, loss of self in other","taskOfSoul":"integrate self and other","resourceOffered":"capacity for deep partnership"}},"centre":{"number":6,"arcanum":{"number":6,"name":"The Lovers","archetype":"partner","positiveSide":"love, value alignment, conscious choice","negativeSide":"codependence, indecision, loss of self in other","taskOfSoul":"integrate self and other","resourceOffered":"capacity for deep partnership"}},"ancestral":{"topLeft":{"number":20,"arcanum":{"number":20,"name":"Judgement","archetype":"awakener","positiveSide":"rebirth, calling, awakening to mission","negativeSide":"self-judgement, ignored calling","taskOfSoul":"answer the inner call","resourceOffered":"access to rebirth"}},"topRight":{"number":6,"arcanum":{"number":6,"name":"The Lovers","archetype":"partner","positiveSide":"love, value alignment, conscious choice","negativeSide":"codependence, indecision, loss of self in other","taskOfSoul":"integrate self and other","resourceOffered":"capacity for deep partnership"}},"bottomRight":{"number":4,"arcanum":{"number":4,"name":"The Emperor","archetype":"sovereign","positiveSide":"order, structure, protective leadership","negativeSide":"tyranny, rigidity, control","taskOfSoul":"lead from balanced authority","resourceOffered":"capacity to build lasting structures"}},"bottomLeft":{"number":9,"arcanum":{"number":9,"name":"The Hermit","archetype":"seeker","positiveSide":"inner light, solitude as resource, deep wisdom","negativeSide":"isolation, depression, rejection of community","taskOfSoul":"descend within and return with light","resourceOffered":"access to inner truth"}}},"skyAxis":{"number":17,"arcanum":{"number":17,"name":"The Star","archetype":"visionary","positiveSide":"hope, inspiration, vision, healing","negativeSide":"despair, lost faith, disillusion","taskOfSoul":"hold hope through dark times","resourceOffered":"access to vision and healing"}},"earthAxis":{"number":7,"arcanum":{"number":7,"name":"The Chariot","archetype":"mover","positiveSide":"willpower, focused movement, victory","negativeSide":"aggression, force, stalled progress","taskOfSoul":"master direction of life","resourceOffered":"capacity for focused action"}},"personalPurpose":{"number":6,"arcanum":{"number":6,"name":"The Lovers","archetype":"partner","positiveSide":"love, value alignment, conscious choice","negativeSide":"codependence, indecision, loss of self in other","taskOfSoul":"integrate self and other","resourceOffered":"capacity for deep partnership"}},"moneyLineNode":{"number":7,"arcanum":{"number":7,"name":"The Chariot","archetype":"mover","positiveSide":"willpower, focused movement, victory","negativeSide":"aggression, force, stalled progress","taskOfSoul":"master direction of life","resourceOffered":"capacity for focused action"}},"loveLineNode":{"number":11,"arcanum":{"number":11,"name":"Strength","archetype":"tamer","positiveSide":"gentle power, integration of wild self, courage","negativeSide":"weakness, brutality, suppressed wildness","taskOfSoul":"integrate inner beast with love","resourceOffered":"soft power"}},"karmicTailSum":{"number":6,"arcanum":{"number":6,"name":"The Lovers","archetype":"partner","positiveSide":"love, value alignment, conscious choice","negativeSide":"codependence, indecision, loss of self in other","taskOfSoul":"integrate self and other","resourceOffered":"capacity for deep partnership"}},"karmicTail":{"code":"18-3-12","d1":{"number":18,"arcanum":{"number":18,"name":"The Moon","archetype":"illuminator","positiveSide":"intuition, dreamwork, navigating uncertainty","negativeSide":"illusion, fear, confusion","taskOfSoul":"navigate truth through illusion","resourceOffered":"access to deep intuition"}},"d2":{"number":3,"arcanum":{"number":3,"name":"The Empress","archetype":"creator","positiveSide":"fertility, abundance, embodied beauty","negativeSide":"over-nurturing, codependence, materialism","taskOfSoul":"create and nurture from wholeness","resourceOffered":"creative force, embodied feminine power"}},"d":{"number":12,"arcanum":{"number":12,"name":"The Hanged Man","archetype":"surrenderer","positiveSide":"sacred sacrifice, new perspective, surrender","negativeSide":"martyrdom, paralysis, victim","taskOfSoul":"release for new sight","resourceOffered":"capacity for conscious sacrifice"}}},"loveLine":{"code":"18-7-7","d1":{"number":18,"arcanum":{"number":18,"name":"The Moon","archetype":"illuminator","positiveSide":"intuition, dreamwork, navigating uncertainty","negativeSide":"illusion, fear, confusion","taskOfSoul":"navigate truth through illusion","resourceOffered":"access to deep intuition"}},"heart":{"number":7,"arcanum":{"number":7,"name":"The Chariot","archetype":"mover","positiveSide":"willpower, focused movement, victory","negativeSide":"aggression, force, stalled progress","taskOfSoul":"master direction of life","resourceOffered":"capacity for focused action"}},"crossing":{"number":7,"arcanum":{"number":7,"name":"The Chariot","archetype":"mover","positiveSide":"willpower, focused movement, victory","negativeSide":"aggression, force, stalled progress","taskOfSoul":"master direction of life","resourceOffered":"capacity for focused action"}}},"moneyLine":{"code":"7-14-7","crossing":{"number":7,"arcanum":{"number":7,"name":"The Chariot","archetype":"mover","positiveSide":"willpower, focused movement, victory","negativeSide":"aggression, force, stalled progress","taskOfSoul":"master direction of life","resourceOffered":"capacity for focused action"}},"dollar":{"number":14,"arcanum":{"number":14,"name":"Temperance","archetype":"alchemist","positiveSide":"integration, moderation, alchemy of opposites","negativeSide":"excess, imbalance, recklessness","taskOfSoul":"blend opposites with skill","resourceOffered":"alchemical balance"}},"c1":{"number":7,"arcanum":{"number":7,"name":"The Chariot","archetype":"mover","positiveSide":"willpower, focused movement, victory","negativeSide":"aggression, force, stalled progress","taskOfSoul":"master direction of life","resourceOffered":"capacity for focused action"}}},"ageScale":[{"age":0,"number":15},{"age":1.25,"number":20},{"age":2.5,"number":5}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/health":{"get":{"tags":["System"],"summary":"Health Check","description":"Returns API health status. No authentication required.","operationId":"health","x-quality":"green","responses":{"200":{"description":"API is healthy","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"status":{"type":"string","example":"ok"},"version":{"type":"string","example":"2.157.1"},"uptime_seconds":{"type":"number","example":295},"timestamp":{"type":"string","example":"2026-08-23T13:07:23.339Z"}}}}},"example":{"ok":true,"data":{"status":"ok","version":"2.157.1","uptime_seconds":295,"timestamp":"2026-08-23T13:07:23.339Z"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/status":{"get":{"tags":["System"],"summary":"API Status","description":"Status of the key you authenticate with: its plan and rate limit, request counts for today, this week and this month, the top endpoints it calls, and a daily series. Authenticate with the `X-Api-Key` header; without one the answer is 400 MISSING_KEY. The `?key=` query parameter still works but is deprecated and answers carry a `Deprecation` header: a URL ends up in access logs, CDN logs and browser history, so a key passed that way stops being secret.","operationId":"status_get","x-quality":"green","x-source":"System endpoints for health, status, OpenAPI spec discovery. No astrological content.","security":[{"ApiKeyAuth":[]}],"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X GET https://api.astroway.info/v1/status \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/status', {\n  method: 'GET',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.get(\n    'https://api.astroway.info/v1/status',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->get('status', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"key":{"type":"object","properties":{"name":{"type":"string","nullable":true},"plan":{"type":"string","nullable":true},"rateLimit":{"type":"number","nullable":true},"requestsTotal":{"type":"number","nullable":true},"lastUsedAt":{"type":"string","nullable":true},"createdAt":{"type":"string","nullable":true}},"nullable":true},"usage":{"type":"object","properties":{"today":{"type":"number","nullable":true},"week":{"type":"number","nullable":true},"month":{"type":"number","nullable":true}},"nullable":true},"limits":{"type":"object","properties":{"plan":{"type":"string","nullable":true},"requestsPerMinute":{"type":"number","nullable":true},"dailyEstimate":{"type":"number","nullable":true},"monthlyEstimate":{"type":"number","nullable":true},"usagePercent":{"type":"object","properties":{"today":{"type":"number","nullable":true},"month":{"type":"number","nullable":true}},"nullable":true},"onExceeded":{"type":"string","nullable":true}},"nullable":true},"endpoints":{"type":"array","items":{"type":"object","properties":{"endpoint":{"type":"string","nullable":true},"total":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"daily":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string","nullable":true},"count":{"type":"number","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"key":{"name":"My App","plan":"free","rateLimit":10,"requestsTotal":5328,"lastUsedAt":"2026-08-22T22:37:46.000Z","createdAt":"2026-08-05T23:01:56.000Z"},"usage":{"today":358,"week":1189,"month":5328},"limits":{"plan":"free","requestsPerMinute":10,"dailyEstimate":14400,"monthlyEstimate":432000,"usagePercent":{"today":0,"month":0},"onExceeded":"HTTP 429 Too Many Requests with Retry-After header (seconds)"},"endpoints":[{"endpoint":"chart","total":175}],"daily":[{"date":"Thu Aug 06","count":5}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/keys":{"post":{"tags":["System"],"summary":"Create API Key","description":"Create a new API key. Requires an internal or enterprise API key. Returns the generated key string once: only its SHA-256 is stored, so it cannot be retrieved later, only rotated. The plan comes from the account and is not accepted in the body. allowed_endpoints limits the key to a subset of the API: paths under /v1, exact (\"chart\") or a namespace (\"embed/*\"); omit it and the key may call everything the plan includes. credits_cap_cycle caps what this key may spend per billing cycle (0 parks it). A publishable key (origin_restriction.type \"public\", prefix pk_) is for page source, so it needs allowed_origins, credits_cap_cycle and allowed_endpoints: without any of them the request is refused with 400, and a pk_ key missing a bound is refused with 403 PUBLISHABLE_KEY_UNBOUNDED wherever it is used.","operationId":"keys","x-quality":"green","x-source":"System endpoints for health, status, OpenAPI spec discovery. No astrological content.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateKey"},"example":{"name":"My App","mode":"live","allowed_endpoints":["chart","embed/*"],"credits_cap_cycle":20000}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/keys \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"name\": \"My App\", \"mode\": \"live\", \"allowed_endpoints\": [ \"chart\", \"embed/*\" ], \"credits_cap_cycle\": 20000 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/keys', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"name\": \"My App\",\n    \"mode\": \"live\",\n    \"allowed_endpoints\": [\n      \"chart\",\n      \"embed/*\"\n    ],\n    \"credits_cap_cycle\": 20000\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/keys',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'name': \"My App\",\n      'mode': \"live\",\n      'allowed_endpoints': [\n        \"chart\",\n        \"embed/*\"\n      ],\n      'credits_cap_cycle': 20000\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('keys', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'name' => 'My App',\n        'mode' => 'live',\n        'allowed_endpoints' => ['chart', 'embed/*'],\n        'credits_cap_cycle' => 20000,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"id":{"type":"number","nullable":true},"api_key_masked":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"plan":{"type":"string","nullable":true},"rate_limit":{"type":"number","nullable":true},"credits_limit":{"type":"number","nullable":true},"credits_used":{"type":"number","nullable":true},"created_at":{"type":"string","nullable":true},"last_used_at":{"nullable":true},"is_active":{"type":"boolean","nullable":true},"origin_restriction":{"type":"object","properties":{"type":{"type":"string","nullable":true}},"nullable":true},"credits_cap_cycle":{"type":"number","nullable":true},"allowed_endpoints":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"key_shown":{"type":"boolean","nullable":true},"api_key":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"id":42,"api_key_masked":"aw_live_…_USE","name":"My App","plan":"free","rate_limit":10,"credits_limit":10000,"credits_used":0,"created_at":"2026-08-22T21:05:14.335Z","last_used_at":null,"is_active":true,"origin_restriction":{"type":"server-only"},"credits_cap_cycle":20000,"allowed_endpoints":["chart","embed/*"],"key_shown":true,"api_key":"aw_live_EXAMPLE_KEY_SHOWN_ONCE_DO_NOT_USE"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/keys/{id}":{"patch":{"tags":["System"],"summary":"Rename a Key, Edit Origins, Budget or Scope","description":"Rename a key, rewrite the origin list of a publishable key, set a per-key credit budget, limit the key to a subset of endpoints, or any combination. The class is fixed at creation: a pk_ key cannot become server-only, and a secret key cannot be given a list, so either request is refused with 400 rather than quietly rewritten. A new list takes effect at once and the key string does not change. credits_cap_cycle caps what this one key may spend per billing cycle, which credits alone do not, since they pool across the account; null clears it and a call over the cap answers 429 KEY_BUDGET_EXHAUSTED without falling through to overage. allowed_endpoints takes paths under /v1, exact (\"chart\") or a namespace (\"embed/*\"); null removes the limit and a call outside the list answers 403 ENDPOINT_NOT_IN_SCOPE. On a publishable pk_ key neither bound can be cleared: null for either is refused with 400.","operationId":"keys_{id}_patch","x-quality":"green","x-source":"System endpoints for health, status, OpenAPI spec discovery. No astrological content.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateKey"},"example":{"name":"site-widget","credits_cap_cycle":5000,"allowed_endpoints":["embed/*"],"origin_restriction":{"type":"public","allowed_origins":["example.com","*.example.com"]}}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X PATCH https://api.astroway.info/v1/keys/{id} \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"name\": \"site-widget\", \"credits_cap_cycle\": 5000, \"allowed_endpoints\": [ \"embed/*\" ], \"origin_restriction\": { \"type\": \"public\", \"allowed_origins\": [ \"example.com\", \"*.example.com\" ] } }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/keys/{id}', {\n  method: 'PATCH',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"name\": \"site-widget\",\n    \"credits_cap_cycle\": 5000,\n    \"allowed_endpoints\": [\n      \"embed/*\"\n    ],\n    \"origin_restriction\": {\n      \"type\": \"public\",\n      \"allowed_origins\": [\n        \"example.com\",\n        \"*.example.com\"\n      ]\n    }\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.patch(\n    'https://api.astroway.info/v1/keys/{id}',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'name': \"site-widget\",\n      'credits_cap_cycle': 5000,\n      'allowed_endpoints': [\n        \"embed/*\"\n      ],\n      'origin_restriction': {\n        'type': \"public\",\n        'allowed_origins': [\n          \"example.com\",\n          \"*.example.com\"\n        ]\n      }\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->patch('keys/{id}', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'name' => 'site-widget',\n        'credits_cap_cycle' => 5000,\n        'allowed_endpoints' => ['embed/*'],\n        'origin_restriction' => [\n            'type' => 'public',\n            'allowed_origins' => ['example.com', '*.example.com'],\n        ],\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"id":{"type":"number","nullable":true},"api_key_masked":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"plan":{"type":"string","nullable":true},"rate_limit":{"type":"number","nullable":true},"credits_limit":{"type":"number","nullable":true},"credits_used":{"type":"number","nullable":true},"created_at":{"type":"string","nullable":true},"last_used_at":{"nullable":true},"is_active":{"type":"boolean","nullable":true},"origin_restriction":{"type":"object","properties":{"type":{"type":"string","nullable":true},"allowed_origins":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}},"nullable":true},"credits_cap_cycle":{"type":"number","nullable":true},"allowed_endpoints":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"id":42,"api_key_masked":"pk_live…e5f6","name":"site-widget","plan":"free","rate_limit":10,"credits_limit":10000,"credits_used":0,"created_at":"2026-08-22T21:05:14.335Z","last_used_at":null,"is_active":true,"origin_restriction":{"type":"public","allowed_origins":["example.com","*.example.com"]},"credits_cap_cycle":5000,"allowed_endpoints":["embed/*"]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/keys/usage":{"get":{"tags":["System"],"summary":"API Key Usage","description":"Get usage statistics for the current API key: today/week/month request counts, rate limit info, and top endpoints by usage.","operationId":"keys_usage_get","x-quality":"green","x-source":"System endpoints for health, status, OpenAPI spec discovery. No astrological content.","security":[{"ApiKeyAuth":[]}],"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X GET https://api.astroway.info/v1/keys/usage \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/keys/usage', {\n  method: 'GET',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.get(\n    'https://api.astroway.info/v1/keys/usage',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->get('keys/usage', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"plan":{"type":"string","nullable":true},"rateLimit":{"type":"number","nullable":true},"credits":{"type":"object","properties":{"used":{"type":"number","nullable":true},"remaining":{"type":"number","nullable":true},"limit":{"type":"number","nullable":true},"reset":{"type":"string","nullable":true}},"nullable":true},"usage":{"type":"object","properties":{"today":{"type":"number","nullable":true},"week":{"type":"number","nullable":true},"month":{"type":"number","nullable":true}},"nullable":true},"topEndpoints":{"type":"array","items":{"type":"object","properties":{"endpoint":{"type":"string","nullable":true},"requests":{"type":"number","nullable":true},"credits":{"type":"number","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"plan":"free","rateLimit":10,"credits":{"used":1250,"remaining":8750,"limit":10000,"reset":"2026-09-01T00:00:00.000Z"},"usage":{"today":42,"week":285,"month":1250},"topEndpoints":[{"endpoint":"chart","requests":155,"credits":3100}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/auth/keys/me":{"get":{"tags":["System"],"summary":"API Key Introspection","description":"Return metadata about the calling API key: plan, remaining credits, period end, bound domain, status. Useful for any SDK consumer that wants to surface plan and balance in its own UI. A key that is not metered (internal, or a custom plan without a limit) returns `credits_remaining` and `credits_total_this_period` as null with `unlimited: true`; a site key returns them as null with `limits.per_hour`.","operationId":"auth_keys_me_get","x-quality":"green","x-source":"System endpoints for health, status, OpenAPI spec discovery. No astrological content.","security":[{"ApiKeyAuth":[]}],"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X GET https://api.astroway.info/v1/auth/keys/me \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/auth/keys/me', {\n  method: 'GET',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.get(\n    'https://api.astroway.info/v1/auth/keys/me',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->get('auth/keys/me', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"key_prefix":{"type":"string","nullable":true},"plan":{"type":"string","nullable":true},"credits_remaining":{"type":"number","nullable":true},"credits_total_this_period":{"type":"number","nullable":true},"period_end":{"type":"string","nullable":true},"status":{"type":"string","nullable":true},"domain":{"type":"string","nullable":true},"domain_bound_at":{"type":"string","nullable":true},"created_at":{"type":"string","nullable":true},"referrer_source":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"key_prefix":"aw_live_a3f...","plan":"indie","credits_remaining":18432,"credits_total_this_period":50000,"period_end":"2026-06-01T00:00:00.000Z","status":"active","domain":"example.com","domain_bound_at":"2026-05-14T18:22:00.000Z","created_at":"2026-05-12T08:00:00.000Z","referrer_source":"wp_plugin"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/site-keys":{"post":{"tags":["System"],"summary":"Site key for a verified WordPress site","description":"Issues a key to a site that proves it controls its domain: we fetch the proof from the site's REST route (`/wp-json/astroway/v1/verify?nonce=<proof_id>`, or `verify_url` for plain permalinks) and compare it with the one sent. The key is bound to the host, covers a free set of readings and shares 300 calls an hour with the other installs on the host (at most 5). One key per install (host + home path): a new key for the same install revokes the previous one. Server-side only. No API key needed.","operationId":"site-keys","x-quality":"green","x-source":"System endpoints for health, status, OpenAPI spec discovery. No astrological content.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteKeyIssue"},"example":{"site_url":"https://example.com","proof_id":"3f1c2a9e-8b7d-4c1e-9f3a-2b6d5e4c1a07","proof":"q3v1Zk0yX2h8sR5tPwL9mN4bD7cF6gH1jK2lE0aS3uT","plugin_version":"2.1.0"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/site-keys \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"site_url\": \"https://example.com\", \"proof_id\": \"3f1c2a9e-8b7d-4c1e-9f3a-2b6d5e4c1a07\", \"proof\": \"q3v1Zk0yX2h8sR5tPwL9mN4bD7cF6gH1jK2lE0aS3uT\", \"plugin_version\": \"2.1.0\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/site-keys', {\n  method: 'POST',\n  headers: {\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"site_url\": \"https://example.com\",\n    \"proof_id\": \"3f1c2a9e-8b7d-4c1e-9f3a-2b6d5e4c1a07\",\n    \"proof\": \"q3v1Zk0yX2h8sR5tPwL9mN4bD7cF6gH1jK2lE0aS3uT\",\n    \"plugin_version\": \"2.1.0\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/site-keys',\n    headers={'Content-Type': 'application/json'},\n    json={\n      'site_url': \"https://example.com\",\n      'proof_id': \"3f1c2a9e-8b7d-4c1e-9f3a-2b6d5e4c1a07\",\n      'proof': \"q3v1Zk0yX2h8sR5tPwL9mN4bD7cF6gH1jK2lE0aS3uT\",\n      'plugin_version': \"2.1.0\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('site-keys', [\n    'json' => [\n        'site_url' => 'https://example.com',\n        'proof_id' => '3f1c2a9e-8b7d-4c1e-9f3a-2b6d5e4c1a07',\n        'proof' => 'q3v1Zk0yX2h8sR5tPwL9mN4bD7cF6gH1jK2lE0aS3uT',\n        'plugin_version' => '2.1.0',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"key":{"type":"string","nullable":true},"plan":{"type":"string","nullable":true},"domain":{"type":"string","nullable":true},"home_path":{"type":"string","nullable":true},"limits":{"type":"object","properties":{"per_hour":{"type":"number","nullable":true}},"nullable":true},"endpoints":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"replaced_previous":{"type":"boolean","nullable":true}}}}},"example":{"ok":true,"data":{"key":"aw_live_…","plan":"site","domain":"example.com","home_path":"/","limits":{"per_hour":300},"endpoints":["public/chart","public/horoscope/*","natal-texts","…"],"replaced_previous":false}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/site-keys/connect/exchange":{"post":{"tags":["System"],"summary":"Move a WordPress site onto an account key","description":"Second half of connecting a site to an account. The owner picks a key on api.astroway.info/dashboard/connect, which sends the admin back to the site with a one-time `code`; the plugin exchanges it here, server side, sending its site key in `X-Api-Key`. The code lives 5 minutes; the same code from the same site key within 10 minutes returns the same answer, so a plugin that crashed before saving can ask again. The site key stops working 24 hours after the exchange. Errors: `400 INVALID_CODE`, `410 CODE_EXPIRED`, `403 SITE_MISMATCH`.","operationId":"site-keys_connect_exchange","x-quality":"green","x-source":"System endpoints for health, status, OpenAPI spec discovery. No astrological content.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteConnectExchange"},"example":{"code":"Jx3l0v8QeZcX2n9F1aK7pM4sT6bW5yR0uH2dG8jC1oE","site_url":"https://example.com"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/site-keys/connect/exchange \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"code\": \"Jx3l0v8QeZcX2n9F1aK7pM4sT6bW5yR0uH2dG8jC1oE\", \"site_url\": \"https://example.com\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/site-keys/connect/exchange', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"code\": \"Jx3l0v8QeZcX2n9F1aK7pM4sT6bW5yR0uH2dG8jC1oE\",\n    \"site_url\": \"https://example.com\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/site-keys/connect/exchange',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'code': \"Jx3l0v8QeZcX2n9F1aK7pM4sT6bW5yR0uH2dG8jC1oE\",\n      'site_url': \"https://example.com\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('site-keys/connect/exchange', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'code' => 'Jx3l0v8QeZcX2n9F1aK7pM4sT6bW5yR0uH2dG8jC1oE',\n        'site_url' => 'https://example.com',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"key":{"type":"string","nullable":true},"plan":{"type":"string","nullable":true},"domain":{"type":"string","nullable":true},"account":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"key":"aw_live_…","plan":"free","domain":"example.com","account":"j***@example.com"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/whitelabel/config":{"get":{"tags":["White-label"],"summary":"Get White-label Config","description":"Read the authenticated user's branding overrides (logo, colour palette, font, footer text, custom domain). On first access, defaults are seeded.","operationId":"whitelabel_config_get","x-quality":"green","x-source":"White-label customisation infrastructure: logo upload, theme palette, custom font, custom domain CNAME with verification. Per-account branding override.","security":[{"ApiKeyAuth":[]}],"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X GET https://api.astroway.info/v1/whitelabel/config \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/whitelabel/config', {\n  method: 'GET',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.get(\n    'https://api.astroway.info/v1/whitelabel/config',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->get('whitelabel/config', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"primary_color":{"type":"string","nullable":true},"secondary_color":{"type":"string","nullable":true},"font_family":{"type":"string","nullable":true},"footer_text":{"nullable":true},"custom_domain":{"nullable":true},"domain_verified":{"type":"boolean","nullable":true},"domain_last_checked_at":{"nullable":true},"logo_storage_key":{"nullable":true},"updated_at":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"primary_color":"#d4a84c","secondary_color":"#7e6bff","font_family":"Inter","footer_text":null,"custom_domain":null,"domain_verified":false,"domain_last_checked_at":null,"logo_storage_key":null,"updated_at":"2026-05-08T07:00:00Z"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]},"patch":{"tags":["White-label"],"summary":"Update White-label Config","description":"Update one or more branding fields. Hex colours validated as #RRGGBB; custom_domain validated as RFC-1035 subdomain. Setting custom_domain resets domain_verified=false; call /whitelabel/domain/verify after pointing your CNAME to api.astroway.info.","operationId":"whitelabel_config_patch","x-quality":"green","x-source":"White-label customisation infrastructure: logo upload, theme palette, custom font, custom domain CNAME with verification. Per-account branding override.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WhitelabelConfigPatch"},"example":{"primary_color":"#0a0b1e","footer_text":"© 2026 MyAstroBrand","custom_domain":"api.myastrobrand.com"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X PATCH https://api.astroway.info/v1/whitelabel/config \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"primary_color\": \"#0a0b1e\", \"footer_text\": \"© 2026 MyAstroBrand\", \"custom_domain\": \"api.myastrobrand.com\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/whitelabel/config', {\n  method: 'PATCH',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"primary_color\": \"#0a0b1e\",\n    \"footer_text\": \"© 2026 MyAstroBrand\",\n    \"custom_domain\": \"api.myastrobrand.com\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.patch(\n    'https://api.astroway.info/v1/whitelabel/config',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'primary_color': \"#0a0b1e\",\n      'footer_text': \"© 2026 MyAstroBrand\",\n      'custom_domain': \"api.myastrobrand.com\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->patch('whitelabel/config', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'primary_color' => '#0a0b1e',\n        'footer_text' => '© 2026 MyAstroBrand',\n        'custom_domain' => 'api.myastrobrand.com',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"primary_color":{"type":"string","nullable":true},"secondary_color":{"type":"string","nullable":true},"font_family":{"type":"string","nullable":true},"footer_text":{"type":"string","nullable":true},"custom_domain":{"type":"string","nullable":true},"domain_verified":{"type":"boolean","nullable":true},"domain_last_checked_at":{"nullable":true},"logo_storage_key":{"nullable":true},"updated_at":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"primary_color":"#0a0b1e","secondary_color":"#7e6bff","font_family":"Inter","footer_text":"© 2026 MyAstroBrand","custom_domain":"api.myastrobrand.com","domain_verified":false,"domain_last_checked_at":null,"logo_storage_key":null,"updated_at":"..."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/whitelabel/domain/verify":{"post":{"tags":["White-label"],"summary":"Verify Custom Domain DNS","description":"Check whether the configured custom_domain points to api.astroway.info via CNAME. Persists the result. If only A records resolve, returns them with a hint to switch to CNAME.","operationId":"whitelabel_domain_verify","x-quality":"green","x-source":"White-label customisation infrastructure: logo upload, theme palette, custom font, custom domain CNAME with verification. Per-account branding override.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmptyBody"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/whitelabel/domain/verify \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/whitelabel/domain/verify', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/whitelabel/domain/verify',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('whitelabel/domain/verify', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"domain":{"type":"string","nullable":true},"resolved":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"verified":{"type":"boolean","nullable":true},"expectedTarget":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"domain":"api.myastrobrand.com","resolved":["api.astroway.info"],"verified":true,"expectedTarget":"api.astroway.info"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/whitelabel/logo":{"post":{"tags":["White-label"],"summary":"Upload White-label Logo","description":"Upload a logo as a base64 data URL (`data:image/<png|jpeg|svg+xml|webp>;base64,...`). Maximum 512 KB. Replaces any prior logo and deletes the old file from storage.","operationId":"whitelabel_logo","x-quality":"green","x-source":"White-label customisation infrastructure: logo upload, theme palette, custom font, custom domain CNAME with verification. Per-account branding override.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Logo"},"example":{"data_url":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII="}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/whitelabel/logo \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"data_url\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/whitelabel/logo', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"data_url\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/whitelabel/logo',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'data_url': \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('whitelabel/logo', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'data_url' => 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"logo_storage_key":{"type":"string","nullable":true},"logo_url":{"type":"string","nullable":true},"byte_length":{"type":"number","nullable":true},"mime_type":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"logo_storage_key":"logos/abc-wl-1.png","logo_url":"https://api.astroway.info/logos/abc-wl-1.png","byte_length":67,"mime_type":"image/png"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/whitelabel/preview":{"post":{"tags":["White-label"],"summary":"Preview White-label Report","description":"Render a sample natal report PDF using the authenticated user's white-label configuration (colours, font, footer, logo). Pass `chart` to use your own birth data; omit to use the bundled Kyiv 1990 sample.","operationId":"whitelabel_preview","x-quality":"green","x-source":"White-label customisation infrastructure: logo upload, theme palette, custom font, custom domain CNAME with verification. Per-account branding override.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Preview"},"example":{"language":"uk"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/whitelabel/preview \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"language\": \"uk\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/whitelabel/preview', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"language\": \"uk\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/whitelabel/preview',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'language': \"uk\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('whitelabel/preview', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'language' => 'uk',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"url":{"type":"string","nullable":true},"storage_key":{"type":"string","nullable":true},"byte_length":{"type":"number","nullable":true},"page_count":{"type":"number","nullable":true},"duration_ms":{"type":"number","nullable":true},"expires_at":{"type":"string","nullable":true},"preview":{"type":"boolean","nullable":true}}}}},"example":{"ok":true,"data":{"url":"https://api.astroway.info/reports/abc-wl-preview.pdf","storage_key":"reports/abc-wl-preview.pdf","byte_length":124350,"page_count":1,"duration_ms":3210,"expires_at":"2026-05-09T07:00:00Z","preview":true}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/reports/natal":{"post":{"tags":["Reports"],"summary":"Generate Natal Report (PDF or HTML)","description":"Render a Western tropical natal chart as a single-page A4 PDF (default) or live HTML (add `?format=html`). Includes Big Three (Sun/Moon/ASC), full planets table with houses + retrograde, all 12 house cusps, and major aspects. Set `whitelabel: true` to apply the caller's branding overrides. `depth: \"extended\"` (10000 credits instead of 5000) adds the chart wheel and a chapter for each of Sun to Pluto, Chiron and the Ascendant in its sign, from edited texts in the 20 languages of `/natal-texts`; no AI at request time. Languages: `uk` (default) or `en`. PDF URLs valid 24h via auto-cleanup cron; HTML mode streams directly without storage.","operationId":"reports_natal","x-quality":"green","x-source":"PDF report generation via Puppeteer + headless Chrome. A4 pages, multi-language (21 langs). Storage: VPS local FS with signed URL TTL=24h. White-label-aware. Sources cited per report category.","security":[{"ApiKeyAuth":[]}],"parameters":[{"in":"query","name":"retain_days","required":false,"schema":{"type":"integer","minimum":1,"maximum":90,"default":1},"description":"How many days the PDF stays at its `url`. 1 by default; up to 90 for a link you hand to a client. Delete it sooner with `DELETE /v1/reports/files/{filename}`."},{"in":"query","name":"format","required":false,"schema":{"type":"string","enum":["pdf","html"],"default":"pdf"},"description":"`html` returns the rendered report as `text/html` instead of storing a PDF; nothing is kept."},{"in":"header","name":"X-Provider","required":false,"schema":{"type":"string","enum":["openai","anthropic","google","groq","mistral","openrouter","deepseek","together"]},"description":"Bring your own model key: the LLM provider that should run this completion. Send together with X-Provider-Key or the request is refused: a key with no provider bills us for tokens you meant to pay for, and a provider with no key would look like it worked. The endpoint is fixed per provider on our side and is never taken from the request. There is no fallback to our own chain: if your key fails you get the provider's status and message. Applies only when `enrich: true` asks for the AI narrative.","example":"anthropic"},{"in":"header","name":"X-Provider-Key","required":false,"schema":{"type":"string"},"description":"Your own credential for X-Provider. Never logged, stored or cached: it travels in a header because the request body is hashed into two cache keys, and a BYOK turn bypasses both caches in each direction. A provider error that quotes the key back is redacted before it reaches our logs or your response. Such a turn costs 5 credits instead of the endpoint price, and only when a completion actually ran on your key.","example":"sk-ant-..."},{"in":"header","name":"X-Provider-Model","required":false,"schema":{"type":"string","maxLength":120},"description":"Optional model id, overriding the default for that provider. Defaults: openai → gpt-4o-mini, anthropic → claude-sonnet-4-5, google → gemini-2.5-flash, groq → openai/gpt-oss-120b, mistral → mistral-large-latest, openrouter → meta-llama/llama-3.3-70b-instruct, deepseek → deepseek-chat, together → meta-llama/Llama-3.3-70B-Instruct-Turbo.","example":"claude-sonnet-4-5"},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NatalReport"},"example":{"chart":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52},"language":"uk","whitelabel":false}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/reports/natal \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"chart\": { \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }, \"language\": \"uk\", \"whitelabel\": false }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/reports/natal', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"chart\": {\n      \"date\": \"1990-05-15\",\n      \"time\": \"15:30:00\",\n      \"timezone\": \"Europe/Kyiv\",\n      \"latitude\": 50.45,\n      \"longitude\": 30.52\n    },\n    \"language\": \"uk\",\n    \"whitelabel\": false\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/reports/natal',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'chart': {\n        'date': \"1990-05-15\",\n        'time': \"15:30:00\",\n        'timezone': \"Europe/Kyiv\",\n        'latitude': 50.45,\n        'longitude': 30.52\n      },\n      'language': \"uk\",\n      'whitelabel': False\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('reports/natal', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'chart' => [\n            'date' => '1990-05-15',\n            'time' => '15:30:00',\n            'timezone' => 'Europe/Kyiv',\n            'latitude' => 50.45,\n            'longitude' => 30.52,\n        ],\n        'language' => 'uk',\n        'whitelabel' => false,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"url":{"type":"string","nullable":true},"storage_key":{"type":"string","nullable":true},"byte_length":{"type":"number","nullable":true},"page_count":{"type":"number","nullable":true},"duration_ms":{"type":"number","nullable":true},"expires_at":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"url":"https://api.astroway.info/reports/7423f03c-0853-4bfa-bb3c-74f0abbcb9e3-natal.pdf","storage_key":"reports/7423f03c-0853-4bfa-bb3c-74f0abbcb9e3-natal.pdf","byte_length":121072,"page_count":3,"duration_ms":1706,"expires_at":"2026-09-18T20:02:25.525Z"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}}}},"/reports/relocation":{"post":{"tags":["Reports"],"summary":"Generate Relocation Report (PDF or HTML)","description":"Compare up to five places for one birth chart as a multi-page A4 PDF (default) or live HTML (add `?format=html`). Per place: the relocated ascendant and midheaven with the signed shift from birth, **which planets changed house** (the substantive difference, diffed rather than left as two tables), every astrocartography line running within 300 km with its interpretation text, and supportive/challenging scores across the 19 life categories. With more than one place a side-by-side comparison leads the document. Relocation moves no planet: every body keeps its natal zodiac degree and only the houses and angles are re-cast, which the report states before anything else. Distance to a line comes from the body hour angle and altitude rather than from a discretised polyline, so it is exact. Coordinates are required per place and never defaulted. No AI narrative and no chart wheel, both on purpose: a wheel of the relocated chart reads as a second chart, and a narrative about a place is advice on where to live.","operationId":"reports_relocation","x-quality":"green","x-source":"Relocated-chart technique as in POST /relocation. Line geometry and category weights per /acg/best-places (audited 2026-08-05) and /acg/by-category (2026-07-26); interpretation text from the curated geo knowledge base.","security":[{"ApiKeyAuth":[]}],"parameters":[{"in":"query","name":"retain_days","required":false,"schema":{"type":"integer","minimum":1,"maximum":90,"default":1},"description":"How many days the PDF stays at its `url`. 1 by default; up to 90 for a link you hand to a client. Delete it sooner with `DELETE /v1/reports/files/{filename}`."},{"in":"query","name":"format","required":false,"schema":{"type":"string","enum":["pdf","html"],"default":"pdf"},"description":"`html` returns the rendered report as `text/html` instead of storing a PDF; nothing is kept."},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RelocationReport"},"example":{"chart":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52},"locations":[{"name":"Lisbon","latitude":38.7223,"longitude":-9.1393},{"name":"Vancouver","latitude":49.2827,"longitude":-123.1207}],"categories":["career","love"],"orbKm":1126,"language":"uk","whitelabel":false}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/reports/relocation \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"chart\": { \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }, \"locations\": [ { \"name\": \"Lisbon\", \"latitude\": 38.7223, \"longitude\": -9.1393 }, { \"name\": \"Vancouver\", \"latitude\": 49.2827, \"longitude\": -123.1207 } ], \"categories\": [ \"career\", \"love\" ], \"orbKm\": 1126, \"language\": \"uk\", \"whitelabel\": false }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/reports/relocation', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"chart\": {\n      \"date\": \"1990-05-15\",\n      \"time\": \"15:30:00\",\n      \"timezone\": \"Europe/Kyiv\",\n      \"latitude\": 50.45,\n      \"longitude\": 30.52\n    },\n    \"locations\": [\n      {\n        \"name\": \"Lisbon\",\n        \"latitude\": 38.7223,\n        \"longitude\": -9.1393\n      },\n      {\n        \"name\": \"Vancouver\",\n        \"latitude\": 49.2827,\n        \"longitude\": -123.1207\n      }\n    ],\n    \"categories\": [\n      \"career\",\n      \"love\"\n    ],\n    \"orbKm\": 1126,\n    \"language\": \"uk\",\n    \"whitelabel\": false\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/reports/relocation',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'chart': {\n        'date': \"1990-05-15\",\n        'time': \"15:30:00\",\n        'timezone': \"Europe/Kyiv\",\n        'latitude': 50.45,\n        'longitude': 30.52\n      },\n      'locations': [\n        {\n          'name': \"Lisbon\",\n          'latitude': 38.7223,\n          'longitude': -9.1393\n        },\n        {\n          'name': \"Vancouver\",\n          'latitude': 49.2827,\n          'longitude': -123.1207\n        }\n      ],\n      'categories': [\n        \"career\",\n        \"love\"\n      ],\n      'orbKm': 1126,\n      'language': \"uk\",\n      'whitelabel': False\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('reports/relocation', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'chart' => [\n            'date' => '1990-05-15',\n            'time' => '15:30:00',\n            'timezone' => 'Europe/Kyiv',\n            'latitude' => 50.45,\n            'longitude' => 30.52,\n        ],\n        'locations' => [[\n            'name' => 'Lisbon',\n            'latitude' => 38.7223,\n            'longitude' => -9.1393,\n        ], [\n            'name' => 'Vancouver',\n            'latitude' => 49.2827,\n            'longitude' => -123.1207,\n        ]],\n        'categories' => ['career', 'love'],\n        'orbKm' => 1126,\n        'language' => 'uk',\n        'whitelabel' => false,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"url":{"type":"string","nullable":true},"storage_key":{"type":"string","nullable":true},"byte_length":{"type":"number","nullable":true},"page_count":{"type":"number","nullable":true},"duration_ms":{"type":"number","nullable":true},"expires_at":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"url":"https://api.astroway.info/reports/6af5f28d-9b1b-429e-adf1-581ec2edf188-relocation.pdf","storage_key":"reports/6af5f28d-9b1b-429e-adf1-581ec2edf188-relocation.pdf","byte_length":129257,"page_count":6,"duration_ms":1588,"expires_at":"2026-09-18T20:02:25.399Z"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}}}},"/reports/gemstone":{"post":{"tags":["Reports"],"summary":"Generate Gemstone Report (PDF or HTML)","description":"The ratna prescription as a multi-page A4 PDF (default) or live HTML (add `?format=html`). Same astrology as `POST /vedic/gemstones`, and pinned by a test to never disagree with it: same sidereal lagna, same two schools, same three gems. What the document adds is what a table cannot carry. Every recommended gem gets a page: what the graha it belongs to signifies classically, the basis in house ownership, mineral and substitutes, weight in ratti with gram and carat conversions, weekday, finger, metal, mantra and japa count, and **the next auspicious day to first wear it**, found by scanning the Panchang for the nearest favourable day that falls on that graha own weekday. **The school is named on the cover**: the two prescribe the same gems but withhold different ones, so a document that hid which produced it would be less honest than the JSON. Coordinates are required and never defaulted. The gemmologist and physician boundary is carried verbatim from the JSON endpoint.","operationId":"reports_gemstone","x-quality":"green","x-source":"Prescription is POST /vedic/gemstones verbatim (audited 2026-08-04): gem-to-graha mapping from the Garuda Purana and Brihat Samhita ch. 80, functional classification from Bepin Behari, yogakaraka rule from BPHS. The first-wearing date composes the already-audited NAVARATNA weekday with the already-audited general-auspicious muhurta scan, and returns nothing rather than a fallback when no auspicious day lands on that weekday inside 60 days. Body prose is authored: the JSON data set carries attributes only, and every line states a traditional signification of the graha rather than a claim about the stone.","security":[{"ApiKeyAuth":[]}],"parameters":[{"in":"query","name":"retain_days","required":false,"schema":{"type":"integer","minimum":1,"maximum":90,"default":1},"description":"How many days the PDF stays at its `url`. 1 by default; up to 90 for a link you hand to a client. Delete it sooner with `DELETE /v1/reports/files/{filename}`."},{"in":"query","name":"format","required":false,"schema":{"type":"string","enum":["pdf","html"],"default":"pdf"},"description":"`html` returns the rendered report as `text/html` instead of storing a PDF; nothing is kept."},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GemstoneReport"},"example":{"chart":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52},"school":"lagna-lord","wearingFrom":"2026-09-01","language":"uk","whitelabel":false}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/reports/gemstone \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"chart\": { \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }, \"school\": \"lagna-lord\", \"wearingFrom\": \"2026-09-01\", \"language\": \"uk\", \"whitelabel\": false }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/reports/gemstone', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"chart\": {\n      \"date\": \"1990-05-15\",\n      \"time\": \"15:30:00\",\n      \"timezone\": \"Europe/Kyiv\",\n      \"latitude\": 50.45,\n      \"longitude\": 30.52\n    },\n    \"school\": \"lagna-lord\",\n    \"wearingFrom\": \"2026-09-01\",\n    \"language\": \"uk\",\n    \"whitelabel\": false\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/reports/gemstone',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'chart': {\n        'date': \"1990-05-15\",\n        'time': \"15:30:00\",\n        'timezone': \"Europe/Kyiv\",\n        'latitude': 50.45,\n        'longitude': 30.52\n      },\n      'school': \"lagna-lord\",\n      'wearingFrom': \"2026-09-01\",\n      'language': \"uk\",\n      'whitelabel': False\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('reports/gemstone', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'chart' => [\n            'date' => '1990-05-15',\n            'time' => '15:30:00',\n            'timezone' => 'Europe/Kyiv',\n            'latitude' => 50.45,\n            'longitude' => 30.52,\n        ],\n        'school' => 'lagna-lord',\n        'wearingFrom' => '2026-09-01',\n        'language' => 'uk',\n        'whitelabel' => false,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"url":{"type":"string","nullable":true},"storage_key":{"type":"string","nullable":true},"byte_length":{"type":"number","nullable":true},"page_count":{"type":"number","nullable":true},"duration_ms":{"type":"number","nullable":true},"expires_at":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"url":"https://api.astroway.info/reports/9b1f0077-73dd-41fd-a644-6591dcb7614e-gemstone.pdf","storage_key":"reports/9b1f0077-73dd-41fd-a644-6591dcb7614e-gemstone.pdf","byte_length":134431,"page_count":7,"duration_ms":1392,"expires_at":"2026-09-18T20:02:22.513Z"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}}}},"/reports/transit-yearly":{"post":{"tags":["Reports"],"summary":"Generate Year-Ahead Transit (PDF or HTML)","description":"Render a year-ahead transit calendar PDF grouped by month. Includes major aspects (conjunction, sextile, square, trine, opposition) of outer planets (Mars through Pluto) to natal positions, with 0.5° max orb. Defaults to next calendar year if `year` omitted.","operationId":"reports_transit-yearly","x-quality":"green","x-source":"PDF report generation via Puppeteer + headless Chrome. A4 pages, multi-language (21 langs). Storage: VPS local FS with signed URL TTL=24h. White-label-aware. Sources cited per report category.","security":[{"ApiKeyAuth":[]}],"parameters":[{"in":"query","name":"retain_days","required":false,"schema":{"type":"integer","minimum":1,"maximum":90,"default":1},"description":"How many days the PDF stays at its `url`. 1 by default; up to 90 for a link you hand to a client. Delete it sooner with `DELETE /v1/reports/files/{filename}`."},{"in":"query","name":"format","required":false,"schema":{"type":"string","enum":["pdf","html"],"default":"pdf"},"description":"`html` returns the rendered report as `text/html` instead of storing a PDF; nothing is kept."},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransitYearlyReport"},"example":{"chart":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52},"year":2027,"language":"uk","whitelabel":false}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/reports/transit-yearly \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"chart\": { \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }, \"year\": 2027, \"language\": \"uk\", \"whitelabel\": false }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/reports/transit-yearly', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"chart\": {\n      \"date\": \"1990-05-15\",\n      \"time\": \"15:30:00\",\n      \"timezone\": \"Europe/Kyiv\",\n      \"latitude\": 50.45,\n      \"longitude\": 30.52\n    },\n    \"year\": 2027,\n    \"language\": \"uk\",\n    \"whitelabel\": false\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/reports/transit-yearly',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'chart': {\n        'date': \"1990-05-15\",\n        'time': \"15:30:00\",\n        'timezone': \"Europe/Kyiv\",\n        'latitude': 50.45,\n        'longitude': 30.52\n      },\n      'year': 2027,\n      'language': \"uk\",\n      'whitelabel': False\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('reports/transit-yearly', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'chart' => [\n            'date' => '1990-05-15',\n            'time' => '15:30:00',\n            'timezone' => 'Europe/Kyiv',\n            'latitude' => 50.45,\n            'longitude' => 30.52,\n        ],\n        'year' => 2027,\n        'language' => 'uk',\n        'whitelabel' => false,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"url":{"type":"string","nullable":true},"storage_key":{"type":"string","nullable":true},"byte_length":{"type":"number","nullable":true},"page_count":{"type":"number","nullable":true},"duration_ms":{"type":"number","nullable":true},"expires_at":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"url":"https://api.astroway.info/reports/6ae6661a-7b1b-4ccc-b28c-64d119ee76ed-transit-2027.pdf","storage_key":"reports/6ae6661a-7b1b-4ccc-b28c-64d119ee76ed-transit-2027.pdf","byte_length":172279,"page_count":5,"duration_ms":1465,"expires_at":"2026-09-18T20:02:26.788Z"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}}}},"/reports/synastry":{"post":{"tags":["Reports"],"summary":"Generate Synastry Report (PDF or HTML)","description":"Render a relationship synastry PDF: side-by-side Big Three, full cross-chart aspect table (top 40 major aspects), and per-chart + combined element/modality balance.","operationId":"reports_synastry","x-quality":"green","x-source":"PDF report generation via Puppeteer + headless Chrome. A4 pages, multi-language (21 langs). Storage: VPS local FS with signed URL TTL=24h. White-label-aware. Sources cited per report category.","security":[{"ApiKeyAuth":[]}],"parameters":[{"in":"query","name":"retain_days","required":false,"schema":{"type":"integer","minimum":1,"maximum":90,"default":1},"description":"How many days the PDF stays at its `url`. 1 by default; up to 90 for a link you hand to a client. Delete it sooner with `DELETE /v1/reports/files/{filename}`."},{"in":"query","name":"format","required":false,"schema":{"type":"string","enum":["pdf","html"],"default":"pdf"},"description":"`html` returns the rendered report as `text/html` instead of storing a PDF; nothing is kept."},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SynastryReport"},"example":{"chart1":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52},"chart2":{"date":"1985-11-03","time":"09:15:00","timezone":"Europe/Kyiv","latitude":48.46,"longitude":35.04},"language":"uk"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/reports/synastry \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"chart1\": { \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }, \"chart2\": { \"date\": \"1985-11-03\", \"time\": \"09:15:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 48.46, \"longitude\": 35.04 }, \"language\": \"uk\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/reports/synastry', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"chart1\": {\n      \"date\": \"1990-05-15\",\n      \"time\": \"15:30:00\",\n      \"timezone\": \"Europe/Kyiv\",\n      \"latitude\": 50.45,\n      \"longitude\": 30.52\n    },\n    \"chart2\": {\n      \"date\": \"1985-11-03\",\n      \"time\": \"09:15:00\",\n      \"timezone\": \"Europe/Kyiv\",\n      \"latitude\": 48.46,\n      \"longitude\": 35.04\n    },\n    \"language\": \"uk\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/reports/synastry',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'chart1': {\n        'date': \"1990-05-15\",\n        'time': \"15:30:00\",\n        'timezone': \"Europe/Kyiv\",\n        'latitude': 50.45,\n        'longitude': 30.52\n      },\n      'chart2': {\n        'date': \"1985-11-03\",\n        'time': \"09:15:00\",\n        'timezone': \"Europe/Kyiv\",\n        'latitude': 48.46,\n        'longitude': 35.04\n      },\n      'language': \"uk\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('reports/synastry', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'chart1' => [\n            'date' => '1990-05-15',\n            'time' => '15:30:00',\n            'timezone' => 'Europe/Kyiv',\n            'latitude' => 50.45,\n            'longitude' => 30.52,\n        ],\n        'chart2' => [\n            'date' => '1985-11-03',\n            'time' => '09:15:00',\n            'timezone' => 'Europe/Kyiv',\n            'latitude' => 48.46,\n            'longitude' => 35.04,\n        ],\n        'language' => 'uk',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"url":{"type":"string","nullable":true},"storage_key":{"type":"string","nullable":true},"byte_length":{"type":"number","nullable":true},"page_count":{"type":"number","nullable":true},"duration_ms":{"type":"number","nullable":true},"expires_at":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"url":"https://api.astroway.info/reports/04a864b0-91ed-43df-a535-66848eded653-synastry.pdf","storage_key":"reports/04a864b0-91ed-43df-a535-66848eded653-synastry.pdf","byte_length":114494,"page_count":2,"duration_ms":1387,"expires_at":"2026-09-18T20:02:25.940Z"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}}}},"/reports/child":{"post":{"tags":["Reports"],"summary":"Generate Child Astrology Report (PDF or HTML)","description":"Parenting-oriented natal report. Highlights Moon (emotional core), Mercury (learning style), Venus (connection style), Mars (energy/temperament). Includes full natal data and a disclaimer noting interpretive nature.","operationId":"reports_child","x-quality":"yellow","x-source":"Marketing category atop classical natal: Liz Greene + Stephen Arroyo + Steven Forrest psychological lineage. Disclaimer surfaces interpretive nature.","security":[{"ApiKeyAuth":[]}],"parameters":[{"in":"query","name":"retain_days","required":false,"schema":{"type":"integer","minimum":1,"maximum":90,"default":1},"description":"How many days the PDF stays at its `url`. 1 by default; up to 90 for a link you hand to a client. Delete it sooner with `DELETE /v1/reports/files/{filename}`."},{"in":"query","name":"format","required":false,"schema":{"type":"string","enum":["pdf","html"],"default":"pdf"},"description":"`html` returns the rendered report as `text/html` instead of storing a PDF; nothing is kept."},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ThemedReport"},"example":{"chart":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52},"language":"uk"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/reports/child \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"chart\": { \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }, \"language\": \"uk\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/reports/child', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"chart\": {\n      \"date\": \"1990-05-15\",\n      \"time\": \"15:30:00\",\n      \"timezone\": \"Europe/Kyiv\",\n      \"latitude\": 50.45,\n      \"longitude\": 30.52\n    },\n    \"language\": \"uk\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/reports/child',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'chart': {\n        'date': \"1990-05-15\",\n        'time': \"15:30:00\",\n        'timezone': \"Europe/Kyiv\",\n        'latitude': 50.45,\n        'longitude': 30.52\n      },\n      'language': \"uk\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('reports/child', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'chart' => [\n            'date' => '1990-05-15',\n            'time' => '15:30:00',\n            'timezone' => 'Europe/Kyiv',\n            'latitude' => 50.45,\n            'longitude' => 30.52,\n        ],\n        'language' => 'uk',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"url":{"type":"string","nullable":true},"storage_key":{"type":"string","nullable":true},"byte_length":{"type":"number","nullable":true},"page_count":{"type":"number","nullable":true},"duration_ms":{"type":"number","nullable":true},"expires_at":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"url":"https://api.astroway.info/reports/36342b8f-4dd9-4502-918a-18a006aa0515-child.pdf","storage_key":"reports/36342b8f-4dd9-4502-918a-18a006aa0515-child.pdf","byte_length":92493,"page_count":2,"duration_ms":1422,"expires_at":"2026-09-18T20:02:20.736Z"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}}}},"/reports/business":{"post":{"tags":["Reports"],"summary":"Generate Business Astrology Report (PDF or HTML)","description":"Founding-chart analysis (mundane astrology). Highlights Sun (purpose), MC (reputation), Jupiter (growth), Saturn (structure). Disclaimer: \"not financial advice\".","operationId":"reports_business","x-quality":"yellow","x-source":"Mundane-astrology founding-chart technique: Carter \"Encyclopaedia of Psychological Astrology\" 1924, Hand \"Horoscope Symbols\" 1981. Marketing category.","security":[{"ApiKeyAuth":[]}],"parameters":[{"in":"query","name":"retain_days","required":false,"schema":{"type":"integer","minimum":1,"maximum":90,"default":1},"description":"How many days the PDF stays at its `url`. 1 by default; up to 90 for a link you hand to a client. Delete it sooner with `DELETE /v1/reports/files/{filename}`."},{"in":"query","name":"format","required":false,"schema":{"type":"string","enum":["pdf","html"],"default":"pdf"},"description":"`html` returns the rendered report as `text/html` instead of storing a PDF; nothing is kept."},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ThemedReport"},"example":{"chart":{"date":"2020-01-15","time":"09:00:00","timezoneOffset":-5,"latitude":40.7128,"longitude":-74.006,"name":"MyCompany Inc"},"language":"en"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/reports/business \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"chart\": { \"date\": \"2020-01-15\", \"time\": \"09:00:00\", \"timezoneOffset\": -5, \"latitude\": 40.7128, \"longitude\": -74.006, \"name\": \"MyCompany Inc\" }, \"language\": \"en\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/reports/business', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"chart\": {\n      \"date\": \"2020-01-15\",\n      \"time\": \"09:00:00\",\n      \"timezoneOffset\": -5,\n      \"latitude\": 40.7128,\n      \"longitude\": -74.006,\n      \"name\": \"MyCompany Inc\"\n    },\n    \"language\": \"en\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/reports/business',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'chart': {\n        'date': \"2020-01-15\",\n        'time': \"09:00:00\",\n        'timezoneOffset': -5,\n        'latitude': 40.7128,\n        'longitude': -74.006,\n        'name': \"MyCompany Inc\"\n      },\n      'language': \"en\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('reports/business', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'chart' => [\n            'date' => '2020-01-15',\n            'time' => '09:00:00',\n            'timezoneOffset' => -5,\n            'latitude' => 40.7128,\n            'longitude' => -74.006,\n            'name' => 'MyCompany Inc',\n        ],\n        'language' => 'en',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"url":{"type":"string","nullable":true},"storage_key":{"type":"string","nullable":true},"byte_length":{"type":"number","nullable":true},"page_count":{"type":"number","nullable":true},"duration_ms":{"type":"number","nullable":true},"expires_at":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"url":"https://api.astroway.info/reports/abc-business.pdf","storage_key":"reports/abc-business.pdf","byte_length":132000,"page_count":2,"duration_ms":4200,"expires_at":"2026-05-09T07:00:00Z"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}}}},"/reports/love":{"post":{"tags":["Reports"],"summary":"Generate Love Report (PDF or HTML)","description":"Romantic-relationship natal report. Highlights Venus (attraction style), Mars (desire), Moon (emotional needs), Descendant (partner profile). Disclaimer: not a prophecy.","operationId":"reports_love","x-quality":"yellow","x-source":"Liz Greene \"Astrology for Lovers\" 1980; Stephen Arroyo \"Relationships and Life Cycles\" 1979.","security":[{"ApiKeyAuth":[]}],"parameters":[{"in":"query","name":"retain_days","required":false,"schema":{"type":"integer","minimum":1,"maximum":90,"default":1},"description":"How many days the PDF stays at its `url`. 1 by default; up to 90 for a link you hand to a client. Delete it sooner with `DELETE /v1/reports/files/{filename}`."},{"in":"query","name":"format","required":false,"schema":{"type":"string","enum":["pdf","html"],"default":"pdf"},"description":"`html` returns the rendered report as `text/html` instead of storing a PDF; nothing is kept."},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ThemedReport"},"example":{"chart":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52},"language":"uk"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/reports/love \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"chart\": { \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }, \"language\": \"uk\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/reports/love', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"chart\": {\n      \"date\": \"1990-05-15\",\n      \"time\": \"15:30:00\",\n      \"timezone\": \"Europe/Kyiv\",\n      \"latitude\": 50.45,\n      \"longitude\": 30.52\n    },\n    \"language\": \"uk\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/reports/love',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'chart': {\n        'date': \"1990-05-15\",\n        'time': \"15:30:00\",\n        'timezone': \"Europe/Kyiv\",\n        'latitude': 50.45,\n        'longitude': 30.52\n      },\n      'language': \"uk\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('reports/love', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'chart' => [\n            'date' => '1990-05-15',\n            'time' => '15:30:00',\n            'timezone' => 'Europe/Kyiv',\n            'latitude' => 50.45,\n            'longitude' => 30.52,\n        ],\n        'language' => 'uk',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"url":{"type":"string","nullable":true},"storage_key":{"type":"string","nullable":true},"byte_length":{"type":"number","nullable":true},"page_count":{"type":"number","nullable":true},"duration_ms":{"type":"number","nullable":true},"expires_at":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"url":"https://api.astroway.info/reports/2a3ae5fc-c57d-4ee1-8b07-6bb2e7c047df-love.pdf","storage_key":"reports/2a3ae5fc-c57d-4ee1-8b07-6bb2e7c047df-love.pdf","byte_length":100132,"page_count":2,"duration_ms":1485,"expires_at":"2026-09-18T20:02:24.276Z"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}}}},"/reports/muhurta":{"post":{"tags":["Reports"],"summary":"Generate Muhurta Report (PDF or HTML)","description":"Render a standard A4 report of the most auspicious dates for a chosen activity over a search window. Same window-scan engine as /vedic/muhurat/*: it scores each day by sunrise Panchang (Tithi/Vara/Nakshatra/Yoga/Karana) per Muhurta Chintamani + B.V.Raman, and lists ranked days with per-day Abhijit Muhurat and the scoring factors as the rationale. `activity` is one of the 12 from /muhurta/types. PDF default; ?format=html returns HTML.","operationId":"reports_muhurta","x-quality":"green","x-source":"Muhurta Chintamani + B.V.Raman *Muhurta*; window-scan engine shared with /vedic/muhurat/* (lib/vedic/muhurat-scan.ts). Standard reports path (sync PDF/HTML), not the book pipeline.","security":[{"ApiKeyAuth":[]}],"parameters":[{"in":"query","name":"retain_days","required":false,"schema":{"type":"integer","minimum":1,"maximum":90,"default":1},"description":"How many days the PDF stays at its `url`. 1 by default; up to 90 for a link you hand to a client. Delete it sooner with `DELETE /v1/reports/files/{filename}`."},{"in":"query","name":"format","required":false,"schema":{"type":"string","enum":["pdf","html"],"default":"pdf"},"description":"`html` returns the rendered report as `text/html` instead of storing a PDF; nothing is kept."},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MuhurtaReport"},"example":{"activity":"marriage","search_window_start":"2026-05-15","search_window_end":"2026-06-15","latitude":28.61,"longitude":77.21,"timezoneOffset":5.5,"topN":10,"language":"en"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/reports/muhurta \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"activity\": \"marriage\", \"search_window_start\": \"2026-05-15\", \"search_window_end\": \"2026-06-15\", \"latitude\": 28.61, \"longitude\": 77.21, \"timezoneOffset\": 5.5, \"topN\": 10, \"language\": \"en\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/reports/muhurta', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"activity\": \"marriage\",\n    \"search_window_start\": \"2026-05-15\",\n    \"search_window_end\": \"2026-06-15\",\n    \"latitude\": 28.61,\n    \"longitude\": 77.21,\n    \"timezoneOffset\": 5.5,\n    \"topN\": 10,\n    \"language\": \"en\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/reports/muhurta',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'activity': \"marriage\",\n      'search_window_start': \"2026-05-15\",\n      'search_window_end': \"2026-06-15\",\n      'latitude': 28.61,\n      'longitude': 77.21,\n      'timezoneOffset': 5.5,\n      'topN': 10,\n      'language': \"en\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('reports/muhurta', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'activity' => 'marriage',\n        'search_window_start' => '2026-05-15',\n        'search_window_end' => '2026-06-15',\n        'latitude' => 28.61,\n        'longitude' => 77.21,\n        'timezoneOffset' => 5.5,\n        'topN' => 10,\n        'language' => 'en',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"url":{"type":"string","nullable":true},"storage_key":{"type":"string","nullable":true},"byte_length":{"type":"number","nullable":true},"page_count":{"type":"number","nullable":true},"duration_ms":{"type":"number","nullable":true},"expires_at":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"url":"https://api.astroway.info/reports/abc-muhurta.pdf","storage_key":"reports/abc-muhurta.pdf","byte_length":90000,"page_count":2,"duration_ms":5200,"expires_at":"2026-06-23T07:00:00Z"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}}}},"/reports/stellaforge":{"post":{"tags":["Reports"],"summary":"Generate Stellaforge Birth-Chart Poster (PDF or HTML)","description":"Render a data-rich, print-ready natal chart poster. A high-detail western wheel (colored element sectors, colored glyphs, degree labels, ASC arrow, MC marker, house cusps) plus the Sun/Moon/Rising trio, a placements table, element/modality balance bars, and the top aspects, fully deterministic, 0 AI. Three styles via `style`: `editorial` (light), `celestial` (dark + gold), `classic` (minimal). White-label via `whitelabel`. i18n via `language`. PDF default; `?format=html` returns HTML. NB `style` is read from the request BODY, not the query string.","operationId":"reports_stellaforge","x-quality":"green","x-source":"Swiss Ephemeris natal calc + the western wheel renderer (lib/render/wheel-western-pro.ts); deterministic poster layout, no AI. Standard reports path (sync PDF/HTML), not the book pipeline.","security":[{"ApiKeyAuth":[]}],"parameters":[{"in":"query","name":"retain_days","required":false,"schema":{"type":"integer","minimum":1,"maximum":90,"default":1},"description":"How many days the PDF stays at its `url`. 1 by default; up to 90 for a link you hand to a client. Delete it sooner with `DELETE /v1/reports/files/{filename}`."},{"in":"query","name":"format","required":false,"schema":{"type":"string","enum":["pdf","html"],"default":"pdf"},"description":"`html` returns the rendered report as `text/html` instead of storing a PDF; nothing is kept."},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StellaforgePoster"},"example":{"chart":{"name":"Ada Lovelace","date":"1815-12-10","time":"18:00:00","timezone":"Europe/London","latitude":51.5074,"longitude":-0.1278,"city":"London"},"style":"celestial","language":"en"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/reports/stellaforge \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"chart\": { \"name\": \"Ada Lovelace\", \"date\": \"1815-12-10\", \"time\": \"18:00:00\", \"timezone\": \"Europe/London\", \"latitude\": 51.5074, \"longitude\": -0.1278, \"city\": \"London\" }, \"style\": \"celestial\", \"language\": \"en\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/reports/stellaforge', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"chart\": {\n      \"name\": \"Ada Lovelace\",\n      \"date\": \"1815-12-10\",\n      \"time\": \"18:00:00\",\n      \"timezone\": \"Europe/London\",\n      \"latitude\": 51.5074,\n      \"longitude\": -0.1278,\n      \"city\": \"London\"\n    },\n    \"style\": \"celestial\",\n    \"language\": \"en\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/reports/stellaforge',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'chart': {\n        'name': \"Ada Lovelace\",\n        'date': \"1815-12-10\",\n        'time': \"18:00:00\",\n        'timezone': \"Europe/London\",\n        'latitude': 51.5074,\n        'longitude': -0.1278,\n        'city': \"London\"\n      },\n      'style': \"celestial\",\n      'language': \"en\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('reports/stellaforge', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'chart' => [\n            'name' => 'Ada Lovelace',\n            'date' => '1815-12-10',\n            'time' => '18:00:00',\n            'timezone' => 'Europe/London',\n            'latitude' => 51.5074,\n            'longitude' => -0.1278,\n            'city' => 'London',\n        ],\n        'style' => 'celestial',\n        'language' => 'en',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"url":{"type":"string","nullable":true},"storage_key":{"type":"string","nullable":true},"byte_length":{"type":"number","nullable":true},"page_count":{"type":"number","nullable":true},"duration_ms":{"type":"number","nullable":true},"expires_at":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"url":"https://api.astroway.info/reports/abc-stellaforge.pdf","storage_key":"reports/abc-stellaforge.pdf","byte_length":147850,"page_count":1,"duration_ms":1400,"expires_at":"2026-06-26T07:00:00Z"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}}}},"/reports/tarot":{"post":{"tags":["Reports"],"summary":"Generate Tarot Reading (PDF or HTML)","description":"Render a tarot reading PDF. Default spread `three-card` (Past/Present/Future from Rider-Waite-Smith deck). Available spreads: single-card, three-card, celtic-cross, horseshoe, relationship, year-ahead, decision, chakra, career, love-triangle. Pass `seed` for reproducibility (deterministic mulberry32 RNG); omit to use a daily seed. Set `allowReversed: false` to draw upright cards only.","operationId":"reports_tarot","x-quality":"green","x-source":"Rider-Waite-Smith deck (Smith images PD since 2021; Waite \"Pictorial Key to the Tarot\" 1909 PD). Deterministic mulberry32 RNG.","security":[{"ApiKeyAuth":[]}],"parameters":[{"in":"query","name":"retain_days","required":false,"schema":{"type":"integer","minimum":1,"maximum":90,"default":1},"description":"How many days the PDF stays at its `url`. 1 by default; up to 90 for a link you hand to a client. Delete it sooner with `DELETE /v1/reports/files/{filename}`."},{"in":"query","name":"format","required":false,"schema":{"type":"string","enum":["pdf","html"],"default":"pdf"},"description":"`html` returns the rendered report as `text/html` instead of storing a PDF; nothing is kept."},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TarotReport"},"example":{"spread":"three-card","seed":1234,"name":"Sample Reading","allowReversed":true,"language":"uk"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/reports/tarot \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"spread\": \"three-card\", \"seed\": 1234, \"name\": \"Sample Reading\", \"allowReversed\": true, \"language\": \"uk\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/reports/tarot', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"spread\": \"three-card\",\n    \"seed\": 1234,\n    \"name\": \"Sample Reading\",\n    \"allowReversed\": true,\n    \"language\": \"uk\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/reports/tarot',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'spread': \"three-card\",\n      'seed': 1234,\n      'name': \"Sample Reading\",\n      'allowReversed': True,\n      'language': \"uk\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('reports/tarot', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'spread' => 'three-card',\n        'seed' => 1234,\n        'name' => 'Sample Reading',\n        'allowReversed' => true,\n        'language' => 'uk',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"url":{"type":"string","nullable":true},"storage_key":{"type":"string","nullable":true},"byte_length":{"type":"number","nullable":true},"page_count":{"type":"number","nullable":true},"duration_ms":{"type":"number","nullable":true},"expires_at":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"url":"https://api.astroway.info/reports/abc-tarot.pdf","storage_key":"reports/abc-tarot.pdf","byte_length":95000,"page_count":1,"duration_ms":2400,"expires_at":"2026-05-09T07:00:00Z"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}}}},"/reports/human-design":{"post":{"tags":["Reports"],"summary":"Generate Human Design Report (PDF or HTML)","description":"Bodygraph PDF: Type, Strategy, Authority, Profile, Definition, Not-Self theme, Incarnation Cross + 9 centers (defined/open) + activated channels with gate pairs.","operationId":"reports_human-design","x-quality":"yellow","x-source":"Ra Uru Hu Human Design (1987); Jovian Archive Inc trademarks. Math: Swiss Ephemeris 88° solar arc.","security":[{"ApiKeyAuth":[]}],"parameters":[{"in":"query","name":"retain_days","required":false,"schema":{"type":"integer","minimum":1,"maximum":90,"default":1},"description":"How many days the PDF stays at its `url`. 1 by default; up to 90 for a link you hand to a client. Delete it sooner with `DELETE /v1/reports/files/{filename}`."},{"in":"query","name":"format","required":false,"schema":{"type":"string","enum":["pdf","html"],"default":"pdf"},"description":"`html` returns the rendered report as `text/html` instead of storing a PDF; nothing is kept."},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VedicKundli"},"example":{"chart":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52},"language":"en"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/reports/human-design \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"chart\": { \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }, \"language\": \"en\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/reports/human-design', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"chart\": {\n      \"date\": \"1990-05-15\",\n      \"time\": \"15:30:00\",\n      \"timezone\": \"Europe/Kyiv\",\n      \"latitude\": 50.45,\n      \"longitude\": 30.52\n    },\n    \"language\": \"en\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/reports/human-design',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'chart': {\n        'date': \"1990-05-15\",\n        'time': \"15:30:00\",\n        'timezone': \"Europe/Kyiv\",\n        'latitude': 50.45,\n        'longitude': 30.52\n      },\n      'language': \"en\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('reports/human-design', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'chart' => [\n            'date' => '1990-05-15',\n            'time' => '15:30:00',\n            'timezone' => 'Europe/Kyiv',\n            'latitude' => 50.45,\n            'longitude' => 30.52,\n        ],\n        'language' => 'en',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"url":{"type":"string","nullable":true},"storage_key":{"type":"string","nullable":true},"byte_length":{"type":"number","nullable":true},"page_count":{"type":"number","nullable":true},"duration_ms":{"type":"number","nullable":true},"expires_at":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"url":"https://api.astroway.info/reports/0a38f6b7-b3bf-4394-adca-ff5571db999c-hd.pdf","storage_key":"reports/0a38f6b7-b3bf-4394-adca-ff5571db999c-hd.pdf","byte_length":69522,"page_count":2,"duration_ms":1527,"expires_at":"2026-09-18T20:02:23.404Z"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}}}},"/reports/lal-kitab":{"post":{"tags":["Reports"],"summary":"Generate Lal Kitab Report (PDF or HTML)","description":"Lal Kitab analysis: Teva (graha placements with Pakka-ghar match), Kismat & Prosperity scores, detected Rins (ancestral debts) with triggers, suggested Upayas (remedies). Sidereal compute (Lahiri ayanamsa) with sign-from-Lagna house numbering per Lal Kitab convention.","operationId":"reports_lal-kitab","x-quality":"yellow","x-source":"Pandit Roop Chand Joshi \"Lal Kitab\" 1939 (5 vols) + V.K. Choudhry, Krishan Ashant, U.C. Mahajan modern translations consensus.","security":[{"ApiKeyAuth":[]}],"parameters":[{"in":"query","name":"retain_days","required":false,"schema":{"type":"integer","minimum":1,"maximum":90,"default":1},"description":"How many days the PDF stays at its `url`. 1 by default; up to 90 for a link you hand to a client. Delete it sooner with `DELETE /v1/reports/files/{filename}`."},{"in":"query","name":"format","required":false,"schema":{"type":"string","enum":["pdf","html"],"default":"pdf"},"description":"`html` returns the rendered report as `text/html` instead of storing a PDF; nothing is kept."},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VedicKundli"},"example":{"chart":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52},"language":"en"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/reports/lal-kitab \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"chart\": { \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }, \"language\": \"en\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/reports/lal-kitab', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"chart\": {\n      \"date\": \"1990-05-15\",\n      \"time\": \"15:30:00\",\n      \"timezone\": \"Europe/Kyiv\",\n      \"latitude\": 50.45,\n      \"longitude\": 30.52\n    },\n    \"language\": \"en\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/reports/lal-kitab',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'chart': {\n        'date': \"1990-05-15\",\n        'time': \"15:30:00\",\n        'timezone': \"Europe/Kyiv\",\n        'latitude': 50.45,\n        'longitude': 30.52\n      },\n      'language': \"en\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('reports/lal-kitab', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'chart' => [\n            'date' => '1990-05-15',\n            'time' => '15:30:00',\n            'timezone' => 'Europe/Kyiv',\n            'latitude' => 50.45,\n            'longitude' => 30.52,\n        ],\n        'language' => 'en',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"url":{"type":"string","nullable":true},"storage_key":{"type":"string","nullable":true},"byte_length":{"type":"number","nullable":true},"page_count":{"type":"number","nullable":true},"duration_ms":{"type":"number","nullable":true},"expires_at":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"url":"https://api.astroway.info/reports/70d9f4f2-d074-4069-898f-4fb4b90adc20-lal-kitab.pdf","storage_key":"reports/70d9f4f2-d074-4069-898f-4fb4b90adc20-lal-kitab.pdf","byte_length":74169,"page_count":2,"duration_ms":1447,"expires_at":"2026-09-18T20:02:23.519Z"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}}}},"/reports/vedic-kundli":{"post":{"tags":["Reports"],"summary":"Generate Vedic Kundli (PDF or HTML)","description":"Sidereal Vedic chart (Lahiri ayanamsa): Lagna + Moon nakshatra/pada, all sidereal planet positions with nakshatra+pada+house, full 9-period Vimshottari Mahadasha tree with current period highlighted.","operationId":"reports_vedic-kundli","x-quality":"green","x-source":"BPHS Adhyaya 4-7 (nakshatras) + Adhyaya 46 (Vimshottari). Lahiri ayanamsa per Calcutta Institute of Astrology BPVRS.","security":[{"ApiKeyAuth":[]}],"parameters":[{"in":"query","name":"retain_days","required":false,"schema":{"type":"integer","minimum":1,"maximum":90,"default":1},"description":"How many days the PDF stays at its `url`. 1 by default; up to 90 for a link you hand to a client. Delete it sooner with `DELETE /v1/reports/files/{filename}`."},{"in":"query","name":"format","required":false,"schema":{"type":"string","enum":["pdf","html"],"default":"pdf"},"description":"`html` returns the rendered report as `text/html` instead of storing a PDF; nothing is kept."},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VedicKundli"},"example":{"chart":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52},"language":"en"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/reports/vedic-kundli \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"chart\": { \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }, \"language\": \"en\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/reports/vedic-kundli', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"chart\": {\n      \"date\": \"1990-05-15\",\n      \"time\": \"15:30:00\",\n      \"timezone\": \"Europe/Kyiv\",\n      \"latitude\": 50.45,\n      \"longitude\": 30.52\n    },\n    \"language\": \"en\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/reports/vedic-kundli',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'chart': {\n        'date': \"1990-05-15\",\n        'time': \"15:30:00\",\n        'timezone': \"Europe/Kyiv\",\n        'latitude': 50.45,\n        'longitude': 30.52\n      },\n      'language': \"en\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('reports/vedic-kundli', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'chart' => [\n            'date' => '1990-05-15',\n            'time' => '15:30:00',\n            'timezone' => 'Europe/Kyiv',\n            'latitude' => 50.45,\n            'longitude' => 30.52,\n        ],\n        'language' => 'en',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"url":{"type":"string","nullable":true},"storage_key":{"type":"string","nullable":true},"byte_length":{"type":"number","nullable":true},"page_count":{"type":"number","nullable":true},"duration_ms":{"type":"number","nullable":true},"expires_at":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"url":"https://api.astroway.info/reports/ccaec60d-1872-4744-826c-73d2dd64019c-vedic-kundli.pdf","storage_key":"reports/ccaec60d-1872-4744-826c-73d2dd64019c-vedic-kundli.pdf","byte_length":94267,"page_count":2,"duration_ms":1358,"expires_at":"2026-09-18T20:02:27.111Z"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}}}},"/reports/money":{"post":{"tags":["Reports"],"summary":"Generate Money Report (PDF or HTML)","description":"Financial natal: 2nd house (earned income), 8th house (shared resources), Jupiter (expansion), Saturn (discipline). Disclaimer: not investment advice.","operationId":"reports_money","x-quality":"yellow","x-source":"Robert Hand \"Horoscope Symbols\" 1981; classical 2nd/8th-house doctrine.","security":[{"ApiKeyAuth":[]}],"parameters":[{"in":"query","name":"retain_days","required":false,"schema":{"type":"integer","minimum":1,"maximum":90,"default":1},"description":"How many days the PDF stays at its `url`. 1 by default; up to 90 for a link you hand to a client. Delete it sooner with `DELETE /v1/reports/files/{filename}`."},{"in":"query","name":"format","required":false,"schema":{"type":"string","enum":["pdf","html"],"default":"pdf"},"description":"`html` returns the rendered report as `text/html` instead of storing a PDF; nothing is kept."},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ThemedReport"},"example":{"chart":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52},"language":"uk"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/reports/money \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"chart\": { \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }, \"language\": \"uk\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/reports/money', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"chart\": {\n      \"date\": \"1990-05-15\",\n      \"time\": \"15:30:00\",\n      \"timezone\": \"Europe/Kyiv\",\n      \"latitude\": 50.45,\n      \"longitude\": 30.52\n    },\n    \"language\": \"uk\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/reports/money',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'chart': {\n        'date': \"1990-05-15\",\n        'time': \"15:30:00\",\n        'timezone': \"Europe/Kyiv\",\n        'latitude': 50.45,\n        'longitude': 30.52\n      },\n      'language': \"uk\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('reports/money', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'chart' => [\n            'date' => '1990-05-15',\n            'time' => '15:30:00',\n            'timezone' => 'Europe/Kyiv',\n            'latitude' => 50.45,\n            'longitude' => 30.52,\n        ],\n        'language' => 'uk',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"url":{"type":"string","nullable":true},"storage_key":{"type":"string","nullable":true},"byte_length":{"type":"number","nullable":true},"page_count":{"type":"number","nullable":true},"duration_ms":{"type":"number","nullable":true},"expires_at":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"url":"https://api.astroway.info/reports/0278b192-f31a-4984-9b7d-b7391d62e6f7-money.pdf","storage_key":"reports/0278b192-f31a-4984-9b7d-b7391d62e6f7-money.pdf","byte_length":105279,"page_count":3,"duration_ms":1343,"expires_at":"2026-09-18T20:02:24.968Z"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}}}},"/reports/career":{"post":{"tags":["Reports"],"summary":"Generate Career Compass Report (PDF or HTML)","description":"Career-themed natal: MC, 10th-house cusp, Saturn placement, Mars motivation, aspects to Sun. Self-knowledge tool, not directive.","operationId":"reports_career","x-quality":"yellow","x-source":"Career-astrology marketing category: Liz Greene \"The Astrology of Fate\" 1984; Robert Hand \"Planets in Transit\". Highlights MC, 10th house, Saturn.","security":[{"ApiKeyAuth":[]}],"parameters":[{"in":"query","name":"retain_days","required":false,"schema":{"type":"integer","minimum":1,"maximum":90,"default":1},"description":"How many days the PDF stays at its `url`. 1 by default; up to 90 for a link you hand to a client. Delete it sooner with `DELETE /v1/reports/files/{filename}`."},{"in":"query","name":"format","required":false,"schema":{"type":"string","enum":["pdf","html"],"default":"pdf"},"description":"`html` returns the rendered report as `text/html` instead of storing a PDF; nothing is kept."},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ThemedReport"},"example":{"chart":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52},"language":"uk"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/reports/career \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"chart\": { \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }, \"language\": \"uk\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/reports/career', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"chart\": {\n      \"date\": \"1990-05-15\",\n      \"time\": \"15:30:00\",\n      \"timezone\": \"Europe/Kyiv\",\n      \"latitude\": 50.45,\n      \"longitude\": 30.52\n    },\n    \"language\": \"uk\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/reports/career',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'chart': {\n        'date': \"1990-05-15\",\n        'time': \"15:30:00\",\n        'timezone': \"Europe/Kyiv\",\n        'latitude': 50.45,\n        'longitude': 30.52\n      },\n      'language': \"uk\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('reports/career', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'chart' => [\n            'date' => '1990-05-15',\n            'time' => '15:30:00',\n            'timezone' => 'Europe/Kyiv',\n            'latitude' => 50.45,\n            'longitude' => 30.52,\n        ],\n        'language' => 'uk',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"url":{"type":"string","nullable":true},"storage_key":{"type":"string","nullable":true},"byte_length":{"type":"number","nullable":true},"page_count":{"type":"number","nullable":true},"duration_ms":{"type":"number","nullable":true},"expires_at":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"url":"https://api.astroway.info/reports/bb2d5c43-8d70-4d38-bd74-a47f2f43900f-career.pdf","storage_key":"reports/bb2d5c43-8d70-4d38-bd74-a47f2f43900f-career.pdf","byte_length":99721,"page_count":2,"duration_ms":1444,"expires_at":"2026-09-18T20:02:19.035Z"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}}}},"/reports/generate":{"post":{"tags":["Reports"],"summary":"Generate Report: Unified Dispatcher (V2)","description":"Single endpoint over the 12 type-specific renderers: pass report_type (\"natal\" | \"transit-yearly\" | \"synastry\" | \"business\" | \"career\" | \"love\" | \"money\" | \"child\" | \"lal-kitab\" | \"human-design\" | \"tarot\" | \"vedic-kundli\") plus the renderer-specific inputs. SDK ergonomics: one method instead of 12. Required fields vary by type: chart for most, chart1+chart2 for synastry, seed for tarot (chart optional).","operationId":"reports_generate","x-quality":"green","x-source":"Thin dispatcher over existing 12 renderers. Type-specific input validation in handler. Pricing forwarded per-renderer (TIER_4-TIER_8).","security":[{"ApiKeyAuth":[]}],"parameters":[{"in":"query","name":"retain_days","required":false,"schema":{"type":"integer","minimum":1,"maximum":90,"default":1},"description":"How many days the PDF stays at its `url`. 1 by default; up to 90 for a link you hand to a client. Delete it sooner with `DELETE /v1/reports/files/{filename}`."},{"in":"query","name":"format","required":false,"schema":{"type":"string","enum":["pdf","html"],"default":"pdf"},"description":"`html` returns the rendered report as `text/html` instead of storing a PDF; nothing is kept."},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateReport"},"example":{"report_type":"natal","chart":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52},"language":"uk","whitelabel":{"companyName":"Acme","themeColor":"#ff5500","reportName":"My Cosmic Map"}}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/reports/generate \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"report_type\": \"natal\", \"chart\": { \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }, \"language\": \"uk\", \"whitelabel\": { \"companyName\": \"Acme\", \"themeColor\": \"#ff5500\", \"reportName\": \"My Cosmic Map\" } }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/reports/generate', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"report_type\": \"natal\",\n    \"chart\": {\n      \"date\": \"1990-05-15\",\n      \"time\": \"15:30:00\",\n      \"timezone\": \"Europe/Kyiv\",\n      \"latitude\": 50.45,\n      \"longitude\": 30.52\n    },\n    \"language\": \"uk\",\n    \"whitelabel\": {\n      \"companyName\": \"Acme\",\n      \"themeColor\": \"#ff5500\",\n      \"reportName\": \"My Cosmic Map\"\n    }\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/reports/generate',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'report_type': \"natal\",\n      'chart': {\n        'date': \"1990-05-15\",\n        'time': \"15:30:00\",\n        'timezone': \"Europe/Kyiv\",\n        'latitude': 50.45,\n        'longitude': 30.52\n      },\n      'language': \"uk\",\n      'whitelabel': {\n        'companyName': \"Acme\",\n        'themeColor': \"#ff5500\",\n        'reportName': \"My Cosmic Map\"\n      }\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('reports/generate', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'report_type' => 'natal',\n        'chart' => [\n            'date' => '1990-05-15',\n            'time' => '15:30:00',\n            'timezone' => 'Europe/Kyiv',\n            'latitude' => 50.45,\n            'longitude' => 30.52,\n        ],\n        'language' => 'uk',\n        'whitelabel' => [\n            'companyName' => 'Acme',\n            'themeColor' => '#ff5500',\n            'reportName' => 'My Cosmic Map',\n        ],\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"url":{"type":"string","nullable":true},"storage_key":{"type":"string","nullable":true},"byte_length":{"type":"number","nullable":true},"page_count":{"type":"number","nullable":true},"duration_ms":{"type":"number","nullable":true},"expires_at":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"url":"https://api.astroway.info/reports/9edded79-0880-4147-8eb7-a33efdbf6158-natal.pdf","storage_key":"reports/9edded79-0880-4147-8eb7-a33efdbf6158-natal.pdf","byte_length":122645,"page_count":3,"duration_ms":1567,"expires_at":"2026-09-18T20:02:23.467Z"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}}}},"/reports/history":{"get":{"tags":["Reports"],"summary":"List Recent Report Exports","description":"List the calling key's most recently generated PDF reports: type, byte size, page count, language, created/expiry timestamps and a `url`. Re-fetch a report link while it lives (24 h, or the `retain_days` the report was made with), or surface recent exports in a dashboard. PDFs are purged after 24h, so older items return `expired: true` with a now-dead URL. Free to call. Query `?limit=` (1–50, default 10).","operationId":"reports_history_get","x-quality":"green","x-source":"Read-only log of the caller's generated reports (migration 039 report_exports).","security":[{"ApiKeyAuth":[]}],"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X GET https://api.astroway.info/v1/reports/history \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/reports/history', {\n  method: 'GET',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.get(\n    'https://api.astroway.info/v1/reports/history',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->get('reports/history', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number","nullable":true},"report_type":{"type":"string","nullable":true},"storage_key":{"type":"string","nullable":true},"url":{"type":"string","nullable":true},"byte_length":{"type":"number","nullable":true},"page_count":{"type":"number","nullable":true},"language":{"type":"string","nullable":true},"created_at":{"type":"string","nullable":true},"expires_at":{"type":"string","nullable":true},"expired":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true},"count":{"type":"number","nullable":true}}}}},"example":{"ok":true,"data":{"items":[{"id":42,"report_type":"natal","storage_key":"reports/abc-natal.pdf","url":"https://api.astroway.info/reports/abc-natal.pdf","byte_length":124350,"page_count":1,"language":"uk","created_at":"2026-06-10T16:00:00Z","expires_at":"2026-06-11T16:00:00Z","expired":false}],"count":1}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/reports/files/{filename}":{"delete":{"tags":["Reports"],"summary":"Delete a Report PDF","description":"Delete a PDF this account made before its retention runs out. `filename` is the last part of the report `url`. Any key of the same account may delete it; a file made by another account answers 404. Free, so an account with no credits left can still remove a client's report.","operationId":"reports_files_{filename}_delete","x-quality":"green","x-source":"Ownership from report_exports (same key or same account).","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"filename","in":"path","required":true,"description":"Last part of the report `url`, ending in `.pdf`.","schema":{"type":"string","pattern":"^[A-Za-z0-9._-]+\\.pdf$"},"example":"9edded79-0880-4147-8eb7-a33efdbf6158-natal-keep30.pdf"},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X DELETE https://api.astroway.info/v1/reports/files/{filename} \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/reports/files/{filename}', {\n  method: 'DELETE',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.delete(\n    'https://api.astroway.info/v1/reports/files/{filename}',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->delete('reports/files/{filename}', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"storage_key":{"type":"string","nullable":true},"deleted":{"type":"boolean","nullable":true}}}}},"example":{"ok":true,"data":{"storage_key":"reports/9edded79-0880-4147-8eb7-a33efdbf6158-natal-keep30.pdf","deleted":true}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}}}},"/reports/ai/natal-narrative":{"post":{"tags":["AI Reports"],"summary":"AI Natal Narrative","description":"Long-form natal-chart narrative (markdown). Inputs: chart, language (21 codes), tone (warm/professional/concise), length (short/medium/long; ≤3200 tokens). Returns the narrative text plus model and token usage. AI grounded on the computed natal chart: Sun/Moon/Asc, 13 bodies, 12 houses, ≤25 major aspects.","operationId":"reports_ai_natal-narrative","x-quality":"yellow","x-source":"Western astrology lineage (Robert Hand, Liz Greene, Stephen Arroyo). LLM guard-railed via natal-narrative-v1 system prompt with strict safety rules. Audit-trailed via ai_audit table.","security":[{"ApiKeyAuth":[]}],"parameters":[{"in":"header","name":"X-Provider","required":false,"schema":{"type":"string","enum":["openai","anthropic","google","groq","mistral","openrouter","deepseek","together"]},"description":"Bring your own model key: the LLM provider that should run this completion. Send together with X-Provider-Key or the request is refused: a key with no provider bills us for tokens you meant to pay for, and a provider with no key would look like it worked. The endpoint is fixed per provider on our side and is never taken from the request. There is no fallback to our own chain: if your key fails you get the provider's status and message.","example":"anthropic"},{"in":"header","name":"X-Provider-Key","required":false,"schema":{"type":"string"},"description":"Your own credential for X-Provider. Never logged, stored or cached: it travels in a header because the request body is hashed into two cache keys, and a BYOK turn bypasses both caches in each direction. A provider error that quotes the key back is redacted before it reaches our logs or your response. Such a turn costs 5 credits instead of the endpoint price, and only when a completion actually ran on your key.","example":"sk-ant-..."},{"in":"header","name":"X-Provider-Model","required":false,"schema":{"type":"string","maxLength":120},"description":"Optional model id, overriding the default for that provider. Defaults: openai → gpt-4o-mini, anthropic → claude-sonnet-4-5, google → gemini-2.5-flash, groq → openai/gpt-oss-120b, mistral → mistral-large-latest, openrouter → meta-llama/llama-3.3-70b-instruct, deepseek → deepseek-chat, together → meta-llama/Llama-3.3-70B-Instruct-Turbo.","example":"claude-sonnet-4-5"},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Natal"},"example":{"chart":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52},"language":"uk","tone":"warm","length":"medium"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/reports/ai/natal-narrative \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"chart\": { \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }, \"language\": \"uk\", \"tone\": \"warm\", \"length\": \"medium\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/reports/ai/natal-narrative', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"chart\": {\n      \"date\": \"1990-05-15\",\n      \"time\": \"15:30:00\",\n      \"timezone\": \"Europe/Kyiv\",\n      \"latitude\": 50.45,\n      \"longitude\": 30.52\n    },\n    \"language\": \"uk\",\n    \"tone\": \"warm\",\n    \"length\": \"medium\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/reports/ai/natal-narrative',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'chart': {\n        'date': \"1990-05-15\",\n        'time': \"15:30:00\",\n        'timezone': \"Europe/Kyiv\",\n        'latitude': 50.45,\n        'longitude': 30.52\n      },\n      'language': \"uk\",\n      'tone': \"warm\",\n      'length': \"medium\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('reports/ai/natal-narrative', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'chart' => [\n            'date' => '1990-05-15',\n            'time' => '15:30:00',\n            'timezone' => 'Europe/Kyiv',\n            'latitude' => 50.45,\n            'longitude' => 30.52,\n        ],\n        'language' => 'uk',\n        'tone' => 'warm',\n        'length' => 'medium',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"narrative":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true},"model":{"type":"string","nullable":true},"language":{"type":"string","nullable":true},"tone":{"type":"string","nullable":true},"length":{"type":"string","nullable":true},"tokens":{"type":"object","properties":{"input":{"type":"number","nullable":true},"output":{"type":"number","nullable":true}},"nullable":true},"duration_ms":{"type":"number","nullable":true}}}}},"example":{"ok":true,"data":{"narrative":"# Вступ\n\n...","disclaimer":"Цей наратив згенерований ШІ...","model":"groq/llama-3.3-70b","language":"uk","tone":"warm","length":"medium","tokens":{"input":542,"output":1623},"duration_ms":3500}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}}}},"/reports/ai/transit-narrative":{"post":{"tags":["AI Reports"],"summary":"AI Transit Narrative (single date)","description":"Snapshot transit interpretation for a specific date. Inputs: chart + transitDate (+optional transitTime/tzOffset), language, tone, length. Returns narrative grounded in transit-to-natal aspects (orb ≤1°).","operationId":"reports_ai_transit-narrative","x-quality":"yellow","x-source":"Robert Hand \"Planets in Transit\" 1976. Standard transit-aspect technique. LLM guard-railed via transit-narrative-v1 prompt.","security":[{"ApiKeyAuth":[]}],"parameters":[{"in":"header","name":"X-Provider","required":false,"schema":{"type":"string","enum":["openai","anthropic","google","groq","mistral","openrouter","deepseek","together"]},"description":"Bring your own model key: the LLM provider that should run this completion. Send together with X-Provider-Key or the request is refused: a key with no provider bills us for tokens you meant to pay for, and a provider with no key would look like it worked. The endpoint is fixed per provider on our side and is never taken from the request. There is no fallback to our own chain: if your key fails you get the provider's status and message.","example":"anthropic"},{"in":"header","name":"X-Provider-Key","required":false,"schema":{"type":"string"},"description":"Your own credential for X-Provider. Never logged, stored or cached: it travels in a header because the request body is hashed into two cache keys, and a BYOK turn bypasses both caches in each direction. A provider error that quotes the key back is redacted before it reaches our logs or your response. Such a turn costs 5 credits instead of the endpoint price, and only when a completion actually ran on your key.","example":"sk-ant-..."},{"in":"header","name":"X-Provider-Model","required":false,"schema":{"type":"string","maxLength":120},"description":"Optional model id, overriding the default for that provider. Defaults: openai → gpt-4o-mini, anthropic → claude-sonnet-4-5, google → gemini-2.5-flash, groq → openai/gpt-oss-120b, mistral → mistral-large-latest, openrouter → meta-llama/llama-3.3-70b-instruct, deepseek → deepseek-chat, together → meta-llama/Llama-3.3-70B-Instruct-Turbo.","example":"claude-sonnet-4-5"},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Transit"},"example":{"chart":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52},"transitDate":"2026-06-15","transitTime":"12:00","language":"en","length":"medium"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/reports/ai/transit-narrative \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"chart\": { \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }, \"transitDate\": \"2026-06-15\", \"transitTime\": \"12:00\", \"language\": \"en\", \"length\": \"medium\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/reports/ai/transit-narrative', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"chart\": {\n      \"date\": \"1990-05-15\",\n      \"time\": \"15:30:00\",\n      \"timezone\": \"Europe/Kyiv\",\n      \"latitude\": 50.45,\n      \"longitude\": 30.52\n    },\n    \"transitDate\": \"2026-06-15\",\n    \"transitTime\": \"12:00\",\n    \"language\": \"en\",\n    \"length\": \"medium\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/reports/ai/transit-narrative',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'chart': {\n        'date': \"1990-05-15\",\n        'time': \"15:30:00\",\n        'timezone': \"Europe/Kyiv\",\n        'latitude': 50.45,\n        'longitude': 30.52\n      },\n      'transitDate': \"2026-06-15\",\n      'transitTime': \"12:00\",\n      'language': \"en\",\n      'length': \"medium\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('reports/ai/transit-narrative', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'chart' => [\n            'date' => '1990-05-15',\n            'time' => '15:30:00',\n            'timezone' => 'Europe/Kyiv',\n            'latitude' => 50.45,\n            'longitude' => 30.52,\n        ],\n        'transitDate' => '2026-06-15',\n        'transitTime' => '12:00',\n        'language' => 'en',\n        'length' => 'medium',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"narrative":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true},"model":{"type":"string","nullable":true},"tokens":{"type":"object","properties":{"input":{"type":"number","nullable":true},"output":{"type":"number","nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"narrative":"...","disclaimer":"...","model":"...","tokens":{"input":481,"output":1500}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}}}},"/reports/ai/synastry-narrative":{"post":{"tags":["AI Reports"],"summary":"AI Synastry Narrative","description":"Long-form relationship narrative grounded in cross-chart aspects. Inputs: chart1, chart2, language, tone, length.","operationId":"reports_ai_synastry-narrative","x-quality":"yellow","x-source":"Robert Hand \"Planets in Composite\" 1975; Stephen Arroyo \"Relationships and Life Cycles\" 1979. LLM guard-railed via synastry-narrative-v1.","security":[{"ApiKeyAuth":[]}],"parameters":[{"in":"header","name":"X-Provider","required":false,"schema":{"type":"string","enum":["openai","anthropic","google","groq","mistral","openrouter","deepseek","together"]},"description":"Bring your own model key: the LLM provider that should run this completion. Send together with X-Provider-Key or the request is refused: a key with no provider bills us for tokens you meant to pay for, and a provider with no key would look like it worked. The endpoint is fixed per provider on our side and is never taken from the request. There is no fallback to our own chain: if your key fails you get the provider's status and message.","example":"anthropic"},{"in":"header","name":"X-Provider-Key","required":false,"schema":{"type":"string"},"description":"Your own credential for X-Provider. Never logged, stored or cached: it travels in a header because the request body is hashed into two cache keys, and a BYOK turn bypasses both caches in each direction. A provider error that quotes the key back is redacted before it reaches our logs or your response. Such a turn costs 5 credits instead of the endpoint price, and only when a completion actually ran on your key.","example":"sk-ant-..."},{"in":"header","name":"X-Provider-Model","required":false,"schema":{"type":"string","maxLength":120},"description":"Optional model id, overriding the default for that provider. Defaults: openai → gpt-4o-mini, anthropic → claude-sonnet-4-5, google → gemini-2.5-flash, groq → openai/gpt-oss-120b, mistral → mistral-large-latest, openrouter → meta-llama/llama-3.3-70b-instruct, deepseek → deepseek-chat, together → meta-llama/Llama-3.3-70B-Instruct-Turbo.","example":"claude-sonnet-4-5"},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Synastry"},"example":{"chart1":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52},"chart2":{"date":"1985-11-03","time":"09:15:00","timezone":"Europe/Kyiv","latitude":48.46,"longitude":35.04},"language":"uk"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/reports/ai/synastry-narrative \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"chart1\": { \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }, \"chart2\": { \"date\": \"1985-11-03\", \"time\": \"09:15:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 48.46, \"longitude\": 35.04 }, \"language\": \"uk\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/reports/ai/synastry-narrative', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"chart1\": {\n      \"date\": \"1990-05-15\",\n      \"time\": \"15:30:00\",\n      \"timezone\": \"Europe/Kyiv\",\n      \"latitude\": 50.45,\n      \"longitude\": 30.52\n    },\n    \"chart2\": {\n      \"date\": \"1985-11-03\",\n      \"time\": \"09:15:00\",\n      \"timezone\": \"Europe/Kyiv\",\n      \"latitude\": 48.46,\n      \"longitude\": 35.04\n    },\n    \"language\": \"uk\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/reports/ai/synastry-narrative',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'chart1': {\n        'date': \"1990-05-15\",\n        'time': \"15:30:00\",\n        'timezone': \"Europe/Kyiv\",\n        'latitude': 50.45,\n        'longitude': 30.52\n      },\n      'chart2': {\n        'date': \"1985-11-03\",\n        'time': \"09:15:00\",\n        'timezone': \"Europe/Kyiv\",\n        'latitude': 48.46,\n        'longitude': 35.04\n      },\n      'language': \"uk\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('reports/ai/synastry-narrative', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'chart1' => [\n            'date' => '1990-05-15',\n            'time' => '15:30:00',\n            'timezone' => 'Europe/Kyiv',\n            'latitude' => 50.45,\n            'longitude' => 30.52,\n        ],\n        'chart2' => [\n            'date' => '1985-11-03',\n            'time' => '09:15:00',\n            'timezone' => 'Europe/Kyiv',\n            'latitude' => 48.46,\n            'longitude' => 35.04,\n        ],\n        'language' => 'uk',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"narrative":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true},"model":{"type":"string","nullable":true},"tokens":{"type":"object","properties":{"input":{"type":"number","nullable":true},"output":{"type":"number","nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"narrative":"...","disclaimer":"...","model":"...","tokens":{"input":720,"output":1800}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}}}},"/reports/ai/year-ahead-narrative":{"post":{"tags":["AI Reports"],"summary":"AI Year-Ahead Narrative","description":"Long-form annual report. Combines natal context with the year's major outer-planet transits clustered by month. Inputs: chart, year (default = next year), language, tone, length (use long for full annual report).","operationId":"reports_ai_year-ahead-narrative","x-quality":"yellow","x-source":"Outer-planet transit lineage: Hand \"Planets in Transit\"; Steven Forrest predictive techniques. LLM guard-railed via year-ahead-narrative-v1.","security":[{"ApiKeyAuth":[]}],"parameters":[{"in":"header","name":"X-Provider","required":false,"schema":{"type":"string","enum":["openai","anthropic","google","groq","mistral","openrouter","deepseek","together"]},"description":"Bring your own model key: the LLM provider that should run this completion. Send together with X-Provider-Key or the request is refused: a key with no provider bills us for tokens you meant to pay for, and a provider with no key would look like it worked. The endpoint is fixed per provider on our side and is never taken from the request. There is no fallback to our own chain: if your key fails you get the provider's status and message.","example":"anthropic"},{"in":"header","name":"X-Provider-Key","required":false,"schema":{"type":"string"},"description":"Your own credential for X-Provider. Never logged, stored or cached: it travels in a header because the request body is hashed into two cache keys, and a BYOK turn bypasses both caches in each direction. A provider error that quotes the key back is redacted before it reaches our logs or your response. Such a turn costs 5 credits instead of the endpoint price, and only when a completion actually ran on your key.","example":"sk-ant-..."},{"in":"header","name":"X-Provider-Model","required":false,"schema":{"type":"string","maxLength":120},"description":"Optional model id, overriding the default for that provider. Defaults: openai → gpt-4o-mini, anthropic → claude-sonnet-4-5, google → gemini-2.5-flash, groq → openai/gpt-oss-120b, mistral → mistral-large-latest, openrouter → meta-llama/llama-3.3-70b-instruct, deepseek → deepseek-chat, together → meta-llama/Llama-3.3-70B-Instruct-Turbo.","example":"claude-sonnet-4-5"},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/YearAhead"},"example":{"chart":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52},"year":2027,"language":"uk","length":"long"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/reports/ai/year-ahead-narrative \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"chart\": { \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }, \"year\": 2027, \"language\": \"uk\", \"length\": \"long\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/reports/ai/year-ahead-narrative', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"chart\": {\n      \"date\": \"1990-05-15\",\n      \"time\": \"15:30:00\",\n      \"timezone\": \"Europe/Kyiv\",\n      \"latitude\": 50.45,\n      \"longitude\": 30.52\n    },\n    \"year\": 2027,\n    \"language\": \"uk\",\n    \"length\": \"long\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/reports/ai/year-ahead-narrative',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'chart': {\n        'date': \"1990-05-15\",\n        'time': \"15:30:00\",\n        'timezone': \"Europe/Kyiv\",\n        'latitude': 50.45,\n        'longitude': 30.52\n      },\n      'year': 2027,\n      'language': \"uk\",\n      'length': \"long\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('reports/ai/year-ahead-narrative', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'chart' => [\n            'date' => '1990-05-15',\n            'time' => '15:30:00',\n            'timezone' => 'Europe/Kyiv',\n            'latitude' => 50.45,\n            'longitude' => 30.52,\n        ],\n        'year' => 2027,\n        'language' => 'uk',\n        'length' => 'long',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"narrative":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true},"model":{"type":"string","nullable":true},"tokens":{"type":"object","properties":{"input":{"type":"number","nullable":true},"output":{"type":"number","nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"narrative":"# Тема року...","disclaimer":"...","model":"...","tokens":{"input":950,"output":3000}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}}}},"/reports/ai/monthly-narrative":{"post":{"tags":["AI Reports"],"summary":"AI Monthly Narrative","description":"Single-month forecast. Tighter scope than year-ahead: uses fast and slow planet transits within the month. Inputs: chart, year, month (1-12), language, tone, length.","operationId":"reports_ai_monthly-narrative","x-quality":"yellow","x-source":"Standard monthly-forecast technique combining fast (Sun/Mercury/Venus/Mars) and slow planet transits to natal placements. LLM guard-railed via monthly-narrative-v1.","security":[{"ApiKeyAuth":[]}],"parameters":[{"in":"header","name":"X-Provider","required":false,"schema":{"type":"string","enum":["openai","anthropic","google","groq","mistral","openrouter","deepseek","together"]},"description":"Bring your own model key: the LLM provider that should run this completion. Send together with X-Provider-Key or the request is refused: a key with no provider bills us for tokens you meant to pay for, and a provider with no key would look like it worked. The endpoint is fixed per provider on our side and is never taken from the request. There is no fallback to our own chain: if your key fails you get the provider's status and message.","example":"anthropic"},{"in":"header","name":"X-Provider-Key","required":false,"schema":{"type":"string"},"description":"Your own credential for X-Provider. Never logged, stored or cached: it travels in a header because the request body is hashed into two cache keys, and a BYOK turn bypasses both caches in each direction. A provider error that quotes the key back is redacted before it reaches our logs or your response. Such a turn costs 5 credits instead of the endpoint price, and only when a completion actually ran on your key.","example":"sk-ant-..."},{"in":"header","name":"X-Provider-Model","required":false,"schema":{"type":"string","maxLength":120},"description":"Optional model id, overriding the default for that provider. Defaults: openai → gpt-4o-mini, anthropic → claude-sonnet-4-5, google → gemini-2.5-flash, groq → openai/gpt-oss-120b, mistral → mistral-large-latest, openrouter → meta-llama/llama-3.3-70b-instruct, deepseek → deepseek-chat, together → meta-llama/Llama-3.3-70B-Instruct-Turbo.","example":"claude-sonnet-4-5"},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Monthly"},"example":{"chart":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52},"year":2026,"month":6,"language":"en","length":"medium"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/reports/ai/monthly-narrative \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"chart\": { \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }, \"year\": 2026, \"month\": 6, \"language\": \"en\", \"length\": \"medium\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/reports/ai/monthly-narrative', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"chart\": {\n      \"date\": \"1990-05-15\",\n      \"time\": \"15:30:00\",\n      \"timezone\": \"Europe/Kyiv\",\n      \"latitude\": 50.45,\n      \"longitude\": 30.52\n    },\n    \"year\": 2026,\n    \"month\": 6,\n    \"language\": \"en\",\n    \"length\": \"medium\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/reports/ai/monthly-narrative',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'chart': {\n        'date': \"1990-05-15\",\n        'time': \"15:30:00\",\n        'timezone': \"Europe/Kyiv\",\n        'latitude': 50.45,\n        'longitude': 30.52\n      },\n      'year': 2026,\n      'month': 6,\n      'language': \"en\",\n      'length': \"medium\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('reports/ai/monthly-narrative', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'chart' => [\n            'date' => '1990-05-15',\n            'time' => '15:30:00',\n            'timezone' => 'Europe/Kyiv',\n            'latitude' => 50.45,\n            'longitude' => 30.52,\n        ],\n        'year' => 2026,\n        'month' => 6,\n        'language' => 'en',\n        'length' => 'medium',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"narrative":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true},"model":{"type":"string","nullable":true},"tokens":{"type":"object","properties":{"input":{"type":"number","nullable":true},"output":{"type":"number","nullable":true}},"nullable":true}}}}},"example":{"ok":true,"data":{"narrative":"...","disclaimer":"...","model":"...","tokens":{"input":1209,"output":667}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}}}},"/webhooks/subscribe":{"post":{"tags":["Webhooks"],"summary":"Create Webhook Subscription","description":"Subscribe to outbound webhook deliveries. Events: report-ready, transit-alert, eclipse-alert. Returns a signing_secret used to verify the X-AstroWay-Signature HMAC-SHA256 header on each delivery.","operationId":"webhooks_subscribe","x-quality":"green","x-source":"Outbound webhook delivery with HMAC-SHA256 signature (RFC 2104, same pattern as Stripe / GitHub webhooks). Auto-disable after 5 consecutive failures. Per-event subscription model.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Subscribe"},"example":{"event":"report-ready","url":"https://example.com/webhooks/astroway"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/webhooks/subscribe \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"event\": \"report-ready\", \"url\": \"https://example.com/webhooks/astroway\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/webhooks/subscribe', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"event\": \"report-ready\",\n    \"url\": \"https://example.com/webhooks/astroway\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/webhooks/subscribe',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'event': \"report-ready\",\n      'url': \"https://example.com/webhooks/astroway\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('webhooks/subscribe', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'event' => 'report-ready',\n        'url' => 'https://example.com/webhooks/astroway',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"id":{"type":"number","nullable":true},"event":{"type":"string","nullable":true},"url":{"type":"string","nullable":true},"signing_secret":{"type":"string","nullable":true},"active":{"type":"boolean","nullable":true},"created_at":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"id":42,"event":"report-ready","url":"https://example.com/webhooks/astroway","signing_secret":"0a1b…","active":true,"created_at":"2026-05-08T12:00:00Z"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/webhooks":{"get":{"tags":["Webhooks"],"summary":"List Webhook Subscriptions","description":"List all active webhook subscriptions for the authenticated user.","operationId":"webhooks_get","x-quality":"green","x-source":"Outbound webhook delivery with HMAC-SHA256 signature (RFC 2104, same pattern as Stripe / GitHub webhooks). Auto-disable after 5 consecutive failures. Per-event subscription model.","security":[{"ApiKeyAuth":[]}],"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X GET https://api.astroway.info/v1/webhooks \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/webhooks', {\n  method: 'GET',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.get(\n    'https://api.astroway.info/v1/webhooks',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->get('webhooks', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"subscriptions":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number","nullable":true},"event":{"type":"string","nullable":true},"url":{"type":"string","nullable":true},"active":{"type":"boolean","nullable":true},"failure_count":{"type":"number","nullable":true},"last_delivery_at":{"nullable":true},"last_status_code":{"nullable":true},"created_at":{"type":"string","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"subscriptions":[{"id":42,"event":"report-ready","url":"...","active":true,"failure_count":0,"last_delivery_at":null,"last_status_code":null,"created_at":"..."}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/webhooks/{id}":{"get":{"tags":["Webhooks"],"summary":"Get Webhook Subscription","description":"Fetch a single webhook subscription owned by the authenticated user.","operationId":"webhooks_{id}_get","x-quality":"green","x-source":"Outbound webhook delivery with HMAC-SHA256 signature (RFC 2104, same pattern as Stripe / GitHub webhooks). Auto-disable after 5 consecutive failures. Per-event subscription model.","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Webhook id, as returned by `GET /v1/webhooks`.","schema":{"type":"integer","minimum":1},"example":42},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X GET https://api.astroway.info/v1/webhooks/{id} \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/webhooks/{id}', {\n  method: 'GET',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.get(\n    'https://api.astroway.info/v1/webhooks/{id}',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->get('webhooks/{id}', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"id":{"type":"number","nullable":true},"event":{"type":"string","nullable":true},"url":{"type":"string","nullable":true},"active":{"type":"boolean","nullable":true},"failure_count":{"type":"number","nullable":true},"last_delivery_at":{"type":"string","nullable":true},"last_status_code":{"type":"number","nullable":true},"created_at":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"id":42,"event":"report-ready","url":"...","active":true,"failure_count":0,"last_delivery_at":"2026-05-08T12:00:00Z","last_status_code":200,"created_at":"..."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}}},"delete":{"tags":["Webhooks"],"summary":"Delete Webhook Subscription","description":"Permanently delete a webhook subscription. No further deliveries are dispatched.","operationId":"webhooks_{id}_delete","x-quality":"green","x-source":"Outbound webhook delivery with HMAC-SHA256 signature (RFC 2104, same pattern as Stripe / GitHub webhooks). Auto-disable after 5 consecutive failures. Per-event subscription model.","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Webhook id, as returned by `GET /v1/webhooks`.","schema":{"type":"integer","minimum":1},"example":42},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X DELETE https://api.astroway.info/v1/webhooks/{id} \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/webhooks/{id}', {\n  method: 'DELETE',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.delete(\n    'https://api.astroway.info/v1/webhooks/{id}',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->delete('webhooks/{id}', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"id":{"type":"number","nullable":true},"deleted":{"type":"boolean","nullable":true}}}}},"example":{"ok":true,"data":{"id":42,"deleted":true}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}}}},"/webhooks/{id}/test":{"post":{"tags":["Webhooks"],"summary":"Test Webhook Delivery","description":"Fire a synthetic delivery to the registered URL with `{ \"test\": true }` payload. Useful when validating endpoint signature handling. Records the result in failure_count / last_status_code.","operationId":"webhooks_{id}_test","x-quality":"green","x-source":"Outbound webhook delivery with HMAC-SHA256 signature (RFC 2104, same pattern as Stripe / GitHub webhooks). Auto-disable after 5 consecutive failures. Per-event subscription model.","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Webhook id, as returned by `GET /v1/webhooks`.","schema":{"type":"integer","minimum":1},"example":42},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmptyBody"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/webhooks/{id}/test \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/webhooks/{id}/test', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/webhooks/{id}/test',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('webhooks/{id}/test', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"id":{"type":"number","nullable":true},"delivered":{"type":"boolean","nullable":true},"status_code":{"type":"number","nullable":true},"duration_ms":{"type":"number","nullable":true}}}}},"example":{"ok":true,"data":{"id":42,"delivered":true,"status_code":200,"duration_ms":124}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}}}},"/webhooks/transit-trigger":{"post":{"tags":["Webhooks"],"summary":"Register Transit-Trigger Webhook","description":"Subscribe to natal-transit aspect threshold-crossings.","operationId":"webhooks_transit-trigger","x-quality":"green","x-source":"Outbound webhook delivery with HMAC-SHA256 signature (RFC 2104, same pattern as Stripe / GitHub webhooks). Auto-disable after 5 consecutive failures. Per-event subscription model.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Register"},"example":{"url":"https://example.com/hook"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/webhooks/transit-trigger \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"url\": \"https://example.com/hook\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/webhooks/transit-trigger', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"url\": \"https://example.com/hook\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/webhooks/transit-trigger',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'url': \"https://example.com/hook\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('webhooks/transit-trigger', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'url' => 'https://example.com/hook',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"id":{"type":"number","nullable":true},"event":{"type":"string","nullable":true},"url":{"type":"string","nullable":true},"signing_secret":{"type":"string","nullable":true},"active":{"type":"boolean","nullable":true}}}}},"example":{"ok":true,"data":{"id":42,"event":"transit-trigger","url":"...","signing_secret":"...","active":true}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/webhooks/eclipse-alert":{"post":{"tags":["Webhooks"],"summary":"Register Eclipse-Alert Webhook","description":"Subscribe to upcoming eclipse alerts (default 7 days before).","operationId":"webhooks_eclipse-alert","x-quality":"green","x-source":"Outbound webhook delivery with HMAC-SHA256 signature (RFC 2104, same pattern as Stripe / GitHub webhooks). Auto-disable after 5 consecutive failures. Per-event subscription model.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Register"},"example":{"url":"https://example.com/hook"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/webhooks/eclipse-alert \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"url\": \"https://example.com/hook\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/webhooks/eclipse-alert', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"url\": \"https://example.com/hook\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/webhooks/eclipse-alert',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'url': \"https://example.com/hook\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('webhooks/eclipse-alert', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'url' => 'https://example.com/hook',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"id":{"type":"number","nullable":true},"event":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"id":43,"event":"eclipse-alert"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/webhooks/retrograde-start":{"post":{"tags":["Webhooks"],"summary":"Register Retrograde-Start Webhook","description":"Fires when any of Mercury–Pluto stations retrograde.","operationId":"webhooks_retrograde-start","x-quality":"green","x-source":"Outbound webhook delivery with HMAC-SHA256 signature (RFC 2104, same pattern as Stripe / GitHub webhooks). Auto-disable after 5 consecutive failures. Per-event subscription model.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Register"},"example":{"url":"https://example.com/hook"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/webhooks/retrograde-start \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"url\": \"https://example.com/hook\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/webhooks/retrograde-start', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"url\": \"https://example.com/hook\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/webhooks/retrograde-start',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'url': \"https://example.com/hook\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('webhooks/retrograde-start', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'url' => 'https://example.com/hook',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"id":{"type":"number","nullable":true},"event":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"id":44,"event":"retrograde-start"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/webhooks/retrograde-end":{"post":{"tags":["Webhooks"],"summary":"Register Retrograde-End Webhook","description":"Fires when any of Mercury–Pluto stations direct.","operationId":"webhooks_retrograde-end","x-quality":"green","x-source":"Outbound webhook delivery with HMAC-SHA256 signature (RFC 2104, same pattern as Stripe / GitHub webhooks). Auto-disable after 5 consecutive failures. Per-event subscription model.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Register"},"example":{"url":"https://example.com/hook"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/webhooks/retrograde-end \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"url\": \"https://example.com/hook\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/webhooks/retrograde-end', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"url\": \"https://example.com/hook\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/webhooks/retrograde-end',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'url': \"https://example.com/hook\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('webhooks/retrograde-end', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'url' => 'https://example.com/hook',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"id":{"type":"number","nullable":true},"event":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"id":45,"event":"retrograde-end"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/webhooks/return-due":{"post":{"tags":["Webhooks"],"summary":"Register Return-Due Webhook","description":"Fires N days before a solar/lunar/planetary return is exact.","operationId":"webhooks_return-due","x-quality":"green","x-source":"Outbound webhook delivery with HMAC-SHA256 signature (RFC 2104, same pattern as Stripe / GitHub webhooks). Auto-disable after 5 consecutive failures. Per-event subscription model.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Register"},"example":{"url":"https://example.com/hook"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/webhooks/return-due \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"url\": \"https://example.com/hook\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/webhooks/return-due', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"url\": \"https://example.com/hook\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/webhooks/return-due',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'url': \"https://example.com/hook\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('webhooks/return-due', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'url' => 'https://example.com/hook',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"id":{"type":"number","nullable":true},"event":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"id":46,"event":"return-due"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/webhooks/dasha-change":{"post":{"tags":["Webhooks"],"summary":"Register Dasha-Change Webhook","description":"Fires on Vedic Vimshottari dasha period transitions.","operationId":"webhooks_dasha-change","x-quality":"green","x-source":"Outbound webhook delivery with HMAC-SHA256 signature (RFC 2104, same pattern as Stripe / GitHub webhooks). Auto-disable after 5 consecutive failures. Per-event subscription model.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Register"},"example":{"url":"https://example.com/hook"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/webhooks/dasha-change \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"url\": \"https://example.com/hook\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/webhooks/dasha-change', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"url\": \"https://example.com/hook\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/webhooks/dasha-change',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'url': \"https://example.com/hook\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('webhooks/dasha-change', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'url' => 'https://example.com/hook',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"id":{"type":"number","nullable":true},"event":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"id":47,"event":"dasha-change"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/webhooks/mahadasha-end":{"post":{"tags":["Webhooks"],"summary":"Register Mahadasha-End Webhook","description":"Fires N days before a Vimshottari mahadasha ends.","operationId":"webhooks_mahadasha-end","x-quality":"green","x-source":"Outbound webhook delivery with HMAC-SHA256 signature (RFC 2104, same pattern as Stripe / GitHub webhooks). Auto-disable after 5 consecutive failures. Per-event subscription model.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Register"},"example":{"url":"https://example.com/hook"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/webhooks/mahadasha-end \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"url\": \"https://example.com/hook\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/webhooks/mahadasha-end', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"url\": \"https://example.com/hook\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/webhooks/mahadasha-end',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'url': \"https://example.com/hook\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('webhooks/mahadasha-end', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'url' => 'https://example.com/hook',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"id":{"type":"number","nullable":true},"event":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"id":48,"event":"mahadasha-end"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/webhooks/void-of-course-start":{"post":{"tags":["Webhooks"],"summary":"Register VOC-Start Webhook","description":"Fires at the start of every VOC Moon period.","operationId":"webhooks_void-of-course-start","x-quality":"green","x-source":"Outbound webhook delivery with HMAC-SHA256 signature (RFC 2104, same pattern as Stripe / GitHub webhooks). Auto-disable after 5 consecutive failures. Per-event subscription model.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Register"},"example":{"url":"https://example.com/hook"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/webhooks/void-of-course-start \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"url\": \"https://example.com/hook\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/webhooks/void-of-course-start', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"url\": \"https://example.com/hook\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/webhooks/void-of-course-start',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'url': \"https://example.com/hook\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('webhooks/void-of-course-start', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'url' => 'https://example.com/hook',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"id":{"type":"number","nullable":true},"event":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"id":49,"event":"void-of-course-start"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/webhooks/planetary-hour-tick":{"post":{"tags":["Webhooks"],"summary":"Register Planetary-Hour-Tick Webhook","description":"Fires at every planetary hour boundary (24/day).","operationId":"webhooks_planetary-hour-tick","x-quality":"green","x-source":"Outbound webhook delivery with HMAC-SHA256 signature (RFC 2104, same pattern as Stripe / GitHub webhooks). Auto-disable after 5 consecutive failures. Per-event subscription model.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Register"},"example":{"url":"https://example.com/hook"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/webhooks/planetary-hour-tick \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"url\": \"https://example.com/hook\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/webhooks/planetary-hour-tick', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"url\": \"https://example.com/hook\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/webhooks/planetary-hour-tick',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'url': \"https://example.com/hook\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('webhooks/planetary-hour-tick', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'url' => 'https://example.com/hook',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"id":{"type":"number","nullable":true},"event":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"id":50,"event":"planetary-hour-tick"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/webhooks/sign-ingress":{"post":{"tags":["Webhooks"],"summary":"Register Sign-Ingress Webhook","description":"Fires when any tracked planet ingresses a new sign.","operationId":"webhooks_sign-ingress","x-quality":"green","x-source":"Outbound webhook delivery with HMAC-SHA256 signature (RFC 2104, same pattern as Stripe / GitHub webhooks). Auto-disable after 5 consecutive failures. Per-event subscription model.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Register"},"example":{"url":"https://example.com/hook"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/webhooks/sign-ingress \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"url\": \"https://example.com/hook\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/webhooks/sign-ingress', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"url\": \"https://example.com/hook\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/webhooks/sign-ingress',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'url': \"https://example.com/hook\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('webhooks/sign-ingress', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'url' => 'https://example.com/hook',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"id":{"type":"number","nullable":true},"event":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"id":51,"event":"sign-ingress"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/ai/chat":{"post":{"tags":["AI & MCP"],"summary":"Chart-grounded AI chat","description":"Chat answered from the positions we computed for this birth moment, not from the model's memory of a sun sign. Carries up to 10 turns of history, replies in 21 languages, and takes four voices through `persona`. Send your own provider key and the turn costs 5 credits instead of the endpoint price.","operationId":"ai_chat","x-quality":"green","x-source":"Anthropic Model Context Protocol spec 2025-03 + chatCompletion gateway (multi-provider chain).","security":[{"ApiKeyAuth":[]}],"parameters":[{"in":"header","name":"X-Provider","required":false,"schema":{"type":"string","enum":["openai","anthropic","google","groq","mistral","openrouter","deepseek","together"]},"description":"Bring your own model key: the LLM provider that should run this completion. Send together with X-Provider-Key or the request is refused: a key with no provider bills us for tokens you meant to pay for, and a provider with no key would look like it worked. The endpoint is fixed per provider on our side and is never taken from the request. There is no fallback to our own chain: if your key fails you get the provider's status and message.","example":"anthropic"},{"in":"header","name":"X-Provider-Key","required":false,"schema":{"type":"string"},"description":"Your own credential for X-Provider. Never logged, stored or cached: it travels in a header because the request body is hashed into two cache keys, and a BYOK turn bypasses both caches in each direction. A provider error that quotes the key back is redacted before it reaches our logs or your response. Such a turn costs 5 credits instead of the endpoint price, and only when a completion actually ran on your key.","example":"sk-ant-..."},{"in":"header","name":"X-Provider-Model","required":false,"schema":{"type":"string","maxLength":120},"description":"Optional model id, overriding the default for that provider. Defaults: openai → gpt-4o-mini, anthropic → claude-sonnet-4-5, google → gemini-2.5-flash, groq → openai/gpt-oss-120b, mistral → mistral-large-latest, openrouter → meta-llama/llama-3.3-70b-instruct, deepseek → deepseek-chat, together → meta-llama/Llama-3.3-70B-Instruct-Turbo.","example":"claude-sonnet-4-5"},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Chat"},"example":{"message":"What does my Saturn placement mean?","chart":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52},"persona":"plain","language":"en"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/ai/chat \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"message\": \"What does my Saturn placement mean?\", \"chart\": { \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }, \"persona\": \"plain\", \"language\": \"en\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/ai/chat', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"message\": \"What does my Saturn placement mean?\",\n    \"chart\": {\n      \"date\": \"1990-05-15\",\n      \"time\": \"15:30:00\",\n      \"timezone\": \"Europe/Kyiv\",\n      \"latitude\": 50.45,\n      \"longitude\": 30.52\n    },\n    \"persona\": \"plain\",\n    \"language\": \"en\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/ai/chat',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'message': \"What does my Saturn placement mean?\",\n      'chart': {\n        'date': \"1990-05-15\",\n        'time': \"15:30:00\",\n        'timezone': \"Europe/Kyiv\",\n        'latitude': 50.45,\n        'longitude': 30.52\n      },\n      'persona': \"plain\",\n      'language': \"en\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('ai/chat', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'message' => 'What does my Saturn placement mean?',\n        'chart' => [\n            'date' => '1990-05-15',\n            'time' => '15:30:00',\n            'timezone' => 'Europe/Kyiv',\n            'latitude' => 50.45,\n            'longitude' => 30.52,\n        ],\n        'persona' => 'plain',\n        'language' => 'en',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"reply":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true},"model":{"type":"string","nullable":true},"language":{"type":"string","nullable":true},"tokens":{"type":"object","properties":{"input":{"type":"number","nullable":true},"output":{"type":"number","nullable":true}},"nullable":true},"duration_ms":{"type":"number","nullable":true},"persona":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"reply":"Saturn sits at 25° Capricorn, retrograde...","disclaimer":"AI-generated for entertainment and self-reflection only. Not medical, legal, or financial advice.","model":"glm-4.5-flash","language":"en","tokens":{"input":1606,"output":576},"duration_ms":100160,"persona":"plain"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}}}},"/ai/explain-aspect":{"post":{"tags":["AI & MCP"],"summary":"Explain Aspect","description":"Detailed explanation of an aspect between two planets.","operationId":"ai_explain-aspect","x-quality":"green","x-source":"Anthropic Model Context Protocol spec 2025-03 + chatCompletion gateway (multi-provider chain).","security":[{"ApiKeyAuth":[]}],"parameters":[{"in":"header","name":"X-Provider","required":false,"schema":{"type":"string","enum":["openai","anthropic","google","groq","mistral","openrouter","deepseek","together"]},"description":"Bring your own model key: the LLM provider that should run this completion. Send together with X-Provider-Key or the request is refused: a key with no provider bills us for tokens you meant to pay for, and a provider with no key would look like it worked. The endpoint is fixed per provider on our side and is never taken from the request. There is no fallback to our own chain: if your key fails you get the provider's status and message.","example":"anthropic"},{"in":"header","name":"X-Provider-Key","required":false,"schema":{"type":"string"},"description":"Your own credential for X-Provider. Never logged, stored or cached: it travels in a header because the request body is hashed into two cache keys, and a BYOK turn bypasses both caches in each direction. A provider error that quotes the key back is redacted before it reaches our logs or your response. Such a turn costs 5 credits instead of the endpoint price, and only when a completion actually ran on your key.","example":"sk-ant-..."},{"in":"header","name":"X-Provider-Model","required":false,"schema":{"type":"string","maxLength":120},"description":"Optional model id, overriding the default for that provider. Defaults: openai → gpt-4o-mini, anthropic → claude-sonnet-4-5, google → gemini-2.5-flash, groq → openai/gpt-oss-120b, mistral → mistral-large-latest, openrouter → meta-llama/llama-3.3-70b-instruct, deepseek → deepseek-chat, together → meta-llama/Llama-3.3-70B-Instruct-Turbo.","example":"claude-sonnet-4-5"},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExplainAspect"},"example":{"planet1":"Saturn","planet2":"Moon","aspectType":"Square"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/ai/explain-aspect \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"planet1\": \"Saturn\", \"planet2\": \"Moon\", \"aspectType\": \"Square\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/ai/explain-aspect', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"planet1\": \"Saturn\",\n    \"planet2\": \"Moon\",\n    \"aspectType\": \"Square\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/ai/explain-aspect',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'planet1': \"Saturn\",\n      'planet2': \"Moon\",\n      'aspectType': \"Square\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('ai/explain-aspect', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'planet1' => 'Saturn',\n        'planet2' => 'Moon',\n        'aspectType' => 'Square',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"explanation":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"explanation":"..."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}}}},"/ai/explain-transit":{"post":{"tags":["AI & MCP"],"summary":"Explain Transit","description":"Explain a current transit hitting your natal chart.","operationId":"ai_explain-transit","x-quality":"green","x-source":"Anthropic Model Context Protocol spec 2025-03 + chatCompletion gateway (multi-provider chain).","security":[{"ApiKeyAuth":[]}],"parameters":[{"in":"header","name":"X-Provider","required":false,"schema":{"type":"string","enum":["openai","anthropic","google","groq","mistral","openrouter","deepseek","together"]},"description":"Bring your own model key: the LLM provider that should run this completion. Send together with X-Provider-Key or the request is refused: a key with no provider bills us for tokens you meant to pay for, and a provider with no key would look like it worked. The endpoint is fixed per provider on our side and is never taken from the request. There is no fallback to our own chain: if your key fails you get the provider's status and message.","example":"anthropic"},{"in":"header","name":"X-Provider-Key","required":false,"schema":{"type":"string"},"description":"Your own credential for X-Provider. Never logged, stored or cached: it travels in a header because the request body is hashed into two cache keys, and a BYOK turn bypasses both caches in each direction. A provider error that quotes the key back is redacted before it reaches our logs or your response. Such a turn costs 5 credits instead of the endpoint price, and only when a completion actually ran on your key.","example":"sk-ant-..."},{"in":"header","name":"X-Provider-Model","required":false,"schema":{"type":"string","maxLength":120},"description":"Optional model id, overriding the default for that provider. Defaults: openai → gpt-4o-mini, anthropic → claude-sonnet-4-5, google → gemini-2.5-flash, groq → openai/gpt-oss-120b, mistral → mistral-large-latest, openrouter → meta-llama/llama-3.3-70b-instruct, deepseek → deepseek-chat, together → meta-llama/Llama-3.3-70B-Instruct-Turbo.","example":"claude-sonnet-4-5"},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExplainTransit"},"example":{"chart":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52},"transitDate":"2026-06-15","transitPlanet":"Saturn","natalPlanet":"Sun","aspectType":"Conjunction"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/ai/explain-transit \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"chart\": { \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }, \"transitDate\": \"2026-06-15\", \"transitPlanet\": \"Saturn\", \"natalPlanet\": \"Sun\", \"aspectType\": \"Conjunction\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/ai/explain-transit', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"chart\": {\n      \"date\": \"1990-05-15\",\n      \"time\": \"15:30:00\",\n      \"timezone\": \"Europe/Kyiv\",\n      \"latitude\": 50.45,\n      \"longitude\": 30.52\n    },\n    \"transitDate\": \"2026-06-15\",\n    \"transitPlanet\": \"Saturn\",\n    \"natalPlanet\": \"Sun\",\n    \"aspectType\": \"Conjunction\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/ai/explain-transit',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'chart': {\n        'date': \"1990-05-15\",\n        'time': \"15:30:00\",\n        'timezone': \"Europe/Kyiv\",\n        'latitude': 50.45,\n        'longitude': 30.52\n      },\n      'transitDate': \"2026-06-15\",\n      'transitPlanet': \"Saturn\",\n      'natalPlanet': \"Sun\",\n      'aspectType': \"Conjunction\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('ai/explain-transit', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'chart' => [\n            'date' => '1990-05-15',\n            'time' => '15:30:00',\n            'timezone' => 'Europe/Kyiv',\n            'latitude' => 50.45,\n            'longitude' => 30.52,\n        ],\n        'transitDate' => '2026-06-15',\n        'transitPlanet' => 'Saturn',\n        'natalPlanet' => 'Sun',\n        'aspectType' => 'Conjunction',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"explanation":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"explanation":"..."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}}}},"/ai/comparison-coach":{"post":{"tags":["AI & MCP"],"summary":"Comparison Coach","description":"Coach two charts on relationship dynamics.","operationId":"ai_comparison-coach","x-quality":"green","x-source":"Anthropic Model Context Protocol spec 2025-03 + chatCompletion gateway (multi-provider chain).","security":[{"ApiKeyAuth":[]}],"parameters":[{"in":"header","name":"X-Provider","required":false,"schema":{"type":"string","enum":["openai","anthropic","google","groq","mistral","openrouter","deepseek","together"]},"description":"Bring your own model key: the LLM provider that should run this completion. Send together with X-Provider-Key or the request is refused: a key with no provider bills us for tokens you meant to pay for, and a provider with no key would look like it worked. The endpoint is fixed per provider on our side and is never taken from the request. There is no fallback to our own chain: if your key fails you get the provider's status and message.","example":"anthropic"},{"in":"header","name":"X-Provider-Key","required":false,"schema":{"type":"string"},"description":"Your own credential for X-Provider. Never logged, stored or cached: it travels in a header because the request body is hashed into two cache keys, and a BYOK turn bypasses both caches in each direction. A provider error that quotes the key back is redacted before it reaches our logs or your response. Such a turn costs 5 credits instead of the endpoint price, and only when a completion actually ran on your key.","example":"sk-ant-..."},{"in":"header","name":"X-Provider-Model","required":false,"schema":{"type":"string","maxLength":120},"description":"Optional model id, overriding the default for that provider. Defaults: openai → gpt-4o-mini, anthropic → claude-sonnet-4-5, google → gemini-2.5-flash, groq → openai/gpt-oss-120b, mistral → mistral-large-latest, openrouter → meta-llama/llama-3.3-70b-instruct, deepseek → deepseek-chat, together → meta-llama/Llama-3.3-70B-Instruct-Turbo.","example":"claude-sonnet-4-5"},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ComparisonCoach"},"example":{"chart1":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52},"chart2":{"date":"1985-11-03","time":"09:15:00","timezone":"Europe/Kyiv","latitude":48.46,"longitude":35.04},"question":"How compatible are we long-term?"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/ai/comparison-coach \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"chart1\": { \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }, \"chart2\": { \"date\": \"1985-11-03\", \"time\": \"09:15:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 48.46, \"longitude\": 35.04 }, \"question\": \"How compatible are we long-term?\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/ai/comparison-coach', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"chart1\": {\n      \"date\": \"1990-05-15\",\n      \"time\": \"15:30:00\",\n      \"timezone\": \"Europe/Kyiv\",\n      \"latitude\": 50.45,\n      \"longitude\": 30.52\n    },\n    \"chart2\": {\n      \"date\": \"1985-11-03\",\n      \"time\": \"09:15:00\",\n      \"timezone\": \"Europe/Kyiv\",\n      \"latitude\": 48.46,\n      \"longitude\": 35.04\n    },\n    \"question\": \"How compatible are we long-term?\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/ai/comparison-coach',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'chart1': {\n        'date': \"1990-05-15\",\n        'time': \"15:30:00\",\n        'timezone': \"Europe/Kyiv\",\n        'latitude': 50.45,\n        'longitude': 30.52\n      },\n      'chart2': {\n        'date': \"1985-11-03\",\n        'time': \"09:15:00\",\n        'timezone': \"Europe/Kyiv\",\n        'latitude': 48.46,\n        'longitude': 35.04\n      },\n      'question': \"How compatible are we long-term?\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('ai/comparison-coach', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'chart1' => [\n            'date' => '1990-05-15',\n            'time' => '15:30:00',\n            'timezone' => 'Europe/Kyiv',\n            'latitude' => 50.45,\n            'longitude' => 30.52,\n        ],\n        'chart2' => [\n            'date' => '1985-11-03',\n            'time' => '09:15:00',\n            'timezone' => 'Europe/Kyiv',\n            'latitude' => 48.46,\n            'longitude' => 35.04,\n        ],\n        'question' => 'How compatible are we long-term?',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"coaching":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"coaching":"..."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}}}},"/mcp/tools-list":{"get":{"tags":["AI & MCP"],"summary":"MCP Tools List","description":"Auto-generated tool manifest for MCP clients (modelcontextprotocol/2025-03 spec).","operationId":"mcp_tools-list_get","x-quality":"green","x-source":"Anthropic Model Context Protocol spec 2025-03 + chatCompletion gateway (multi-provider chain).","security":[{"ApiKeyAuth":[]}],"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X GET https://api.astroway.info/v1/mcp/tools-list \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/mcp/tools-list', {\n  method: 'GET',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.get(\n    'https://api.astroway.info/v1/mcp/tools-list',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->get('mcp/tools-list', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"spec":{"type":"string","nullable":true},"server":{"type":"string","nullable":true},"toolCount":{"type":"number","nullable":true},"tools":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","nullable":true},"description":{"type":"string","nullable":true},"inputSchema":{"type":"object","properties":{"type":{"type":"string","nullable":true},"properties":{"type":"object","properties":{"body":{"type":"object","properties":{"type":{"type":"string","nullable":true},"description":{"type":"string","nullable":true}},"nullable":true}},"nullable":true}},"nullable":true}},"nullable":true},"nullable":true},"notes":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"spec":"modelcontextprotocol/2025-03","server":"astroway-mcp","toolCount":751,"tools":[{"name":"astroway_post_chart","description":"[Core] Natal Chart: Calculate a full natal chart: planets, house cusps, aspects, sect, and angular data for a given birth moment. When the birth time is unknown, send timeUnknown: true instead of time and the response ca","inputSchema":{"type":"object","properties":{"body":{"type":"string","description":"JSON body. Example: { \"date\": \"1990-05-15\", \"time\": \"14:30:00\", \"timezoneOffset\": 3, \"latitude\": 50.45, \"longitude\": 30.52 }"}}}}],"notes":["Auto-generated from ENDPOINT_GROUPS manifest. Each tool maps 1:1 to a /v1/ endpoint."]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/mcp/streaming":{"post":{"tags":["AI & MCP"],"summary":"MCP Streaming Chat","description":"Server-Sent Events streaming chat completion with optional chart context.","operationId":"mcp_streaming","x-quality":"green","x-source":"Anthropic Model Context Protocol spec 2025-03 + chatCompletion gateway (multi-provider chain).","security":[{"ApiKeyAuth":[]}],"parameters":[{"in":"header","name":"X-Provider","required":false,"schema":{"type":"string","enum":["openai","anthropic","google","groq","mistral","openrouter","deepseek","together"]},"description":"Bring your own model key: the LLM provider that should run this completion. Send together with X-Provider-Key or the request is refused: a key with no provider bills us for tokens you meant to pay for, and a provider with no key would look like it worked. The endpoint is fixed per provider on our side and is never taken from the request. There is no fallback to our own chain: if your key fails you get the provider's status and message.","example":"anthropic"},{"in":"header","name":"X-Provider-Key","required":false,"schema":{"type":"string"},"description":"Your own credential for X-Provider. Never logged, stored or cached: it travels in a header because the request body is hashed into two cache keys, and a BYOK turn bypasses both caches in each direction. A provider error that quotes the key back is redacted before it reaches our logs or your response. Such a turn costs 5 credits instead of the endpoint price, and only when a completion actually ran on your key.","example":"sk-ant-..."},{"in":"header","name":"X-Provider-Model","required":false,"schema":{"type":"string","maxLength":120},"description":"Optional model id, overriding the default for that provider. Defaults: openai → gpt-4o-mini, anthropic → claude-sonnet-4-5, google → gemini-2.5-flash, groq → openai/gpt-oss-120b, mistral → mistral-large-latest, openrouter → meta-llama/llama-3.3-70b-instruct, deepseek → deepseek-chat, together → meta-llama/Llama-3.3-70B-Instruct-Turbo.","example":"claude-sonnet-4-5"},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Streaming"},"example":{"message":"What does my Saturn placement mean?","chart":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/mcp/streaming \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"message\": \"What does my Saturn placement mean?\", \"chart\": { \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 } }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/mcp/streaming', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"message\": \"What does my Saturn placement mean?\",\n    \"chart\": {\n      \"date\": \"1990-05-15\",\n      \"time\": \"15:30:00\",\n      \"timezone\": \"Europe/Kyiv\",\n      \"latitude\": 50.45,\n      \"longitude\": 30.52\n    }\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/mcp/streaming',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'message': \"What does my Saturn placement mean?\",\n      'chart': {\n        'date': \"1990-05-15\",\n        'time': \"15:30:00\",\n        'timezone': \"Europe/Kyiv\",\n        'latitude': 50.45,\n        'longitude': 30.52\n      }\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('mcp/streaming', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'message' => 'What does my Saturn placement mean?',\n        'chart' => [\n            'date' => '1990-05-15',\n            'time' => '15:30:00',\n            'timezone' => 'Europe/Kyiv',\n            'latitude' => 50.45,\n            'longitude' => 30.52,\n        ],\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Server-sent events. Each frame is `data: ` followed by a JSON object: `{\"type\":\"token\",\"text\":\"...\"}` for each chunk of the answer, then one `{\"type\":\"done\",\"model\":\"...\",\"elapsed_ms\":n}`. Errors arrive as `{\"type\":\"error\",\"message\":\"...\"}`.","content":{"text/event-stream":{"schema":{"type":"string"}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}}}},"/mcp/multi-chart-context":{"post":{"tags":["AI & MCP"],"summary":"MCP Multi-Chart Context","description":"Compact context for MCP agents working across multiple charts.","operationId":"mcp_multi-chart-context","x-quality":"green","x-source":"Anthropic Model Context Protocol spec 2025-03 + chatCompletion gateway (multi-provider chain).","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpMultiChart"},"example":{"charts":[{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52},{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}]}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/mcp/multi-chart-context \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"charts\": [ { \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }, { \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 } ] }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/mcp/multi-chart-context', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"charts\": [\n      {\n        \"date\": \"1990-05-15\",\n        \"time\": \"15:30:00\",\n        \"timezone\": \"Europe/Kyiv\",\n        \"latitude\": 50.45,\n        \"longitude\": 30.52\n      },\n      {\n        \"date\": \"1990-05-15\",\n        \"time\": \"15:30:00\",\n        \"timezone\": \"Europe/Kyiv\",\n        \"latitude\": 50.45,\n        \"longitude\": 30.52\n      }\n    ]\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/mcp/multi-chart-context',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'charts': [\n        {\n          'date': \"1990-05-15\",\n          'time': \"15:30:00\",\n          'timezone': \"Europe/Kyiv\",\n          'latitude': 50.45,\n          'longitude': 30.52\n        },\n        {\n          'date': \"1990-05-15\",\n          'time': \"15:30:00\",\n          'timezone': \"Europe/Kyiv\",\n          'latitude': 50.45,\n          'longitude': 30.52\n        }\n      ]\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('mcp/multi-chart-context', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'charts' => [[\n            'date' => '1990-05-15',\n            'time' => '15:30:00',\n            'timezone' => 'Europe/Kyiv',\n            'latitude' => 50.45,\n            'longitude' => 30.52,\n        ], [\n            'date' => '1990-05-15',\n            'time' => '15:30:00',\n            'timezone' => 'Europe/Kyiv',\n            'latitude' => 50.45,\n            'longitude' => 30.52,\n        ]],\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"contextHash":{"type":"string","nullable":true},"chartCount":{"type":"number","nullable":true},"intent":{"type":"string","nullable":true},"summaries":{"type":"array","items":{"type":"object","properties":{"index":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"bigThree":{"type":"object","properties":{"sun":{"type":"string","nullable":true},"moon":{"type":"string","nullable":true},"ascendant":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"nullable":true},"summaryString":{"type":"string","nullable":true},"notes":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"contextHash":"awctx_58cb5623","chartCount":2,"intent":"general","summaries":[{"index":0,"name":"","bigThree":{"sun":"Taurus","moon":"Capricorn","ascendant":"Virgo"}}],"summaryString":": Taurus Sun · Capricorn Moon · Virgo ASC | : Taurus Sun · Capricorn Moon · Virgo ASC","notes":["contextHash is a stable djb2 of the chart datetimes/locations, pass into MCP system prompt."]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/family/saturn-return-cycles":{"post":{"tags":["Family Astrology"],"summary":"Saturn Return Cycles","description":"Saturn return timing across a family cohort.","operationId":"family_saturn-return-cycles","x-quality":"yellow","x-source":"Liz Greene \"Astrology of Fate\" 1985 + Howard Sasportas \"The Gods of Change\" 1989 + family-systems lineage.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Family"},"example":{"members":[{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52},{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}]}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/family/saturn-return-cycles \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"members\": [ { \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }, { \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 } ] }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/family/saturn-return-cycles', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"members\": [\n      {\n        \"date\": \"1990-05-15\",\n        \"time\": \"15:30:00\",\n        \"timezone\": \"Europe/Kyiv\",\n        \"latitude\": 50.45,\n        \"longitude\": 30.52\n      },\n      {\n        \"date\": \"1990-05-15\",\n        \"time\": \"15:30:00\",\n        \"timezone\": \"Europe/Kyiv\",\n        \"latitude\": 50.45,\n        \"longitude\": 30.52\n      }\n    ]\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/family/saturn-return-cycles',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'members': [\n        {\n          'date': \"1990-05-15\",\n          'time': \"15:30:00\",\n          'timezone': \"Europe/Kyiv\",\n          'latitude': 50.45,\n          'longitude': 30.52\n        },\n        {\n          'date': \"1990-05-15\",\n          'time': \"15:30:00\",\n          'timezone': \"Europe/Kyiv\",\n          'latitude': 50.45,\n          'longitude': 30.52\n        }\n      ]\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('family/saturn-return-cycles', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'members' => [[\n            'date' => '1990-05-15',\n            'time' => '15:30:00',\n            'timezone' => 'Europe/Kyiv',\n            'latitude' => 50.45,\n            'longitude' => 30.52,\n        ], [\n            'date' => '1990-05-15',\n            'time' => '15:30:00',\n            'timezone' => 'Europe/Kyiv',\n            'latitude' => 50.45,\n            'longitude' => 30.52,\n        ]],\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"members":{"type":"array","items":{"type":"object","properties":{"index":{"type":"number","nullable":true},"role":{"nullable":true},"name":{"type":"string","nullable":true},"saturnSign":{"type":"string","nullable":true},"saturnHouse":{"type":"number","nullable":true},"ageYears":{"type":"number","nullable":true},"returnsCompleted":{"type":"number","nullable":true},"yearsToNextReturn":{"type":"number","nullable":true},"lifePhase":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"concurrentTransits":{"type":"array","items":{},"nullable":true},"familyPhaseSummary":{"type":"string","nullable":true},"source":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"members":[{"index":0,"role":null,"name":"","saturnSign":"Capricorn","saturnHouse":5,"ageYears":36.3,"returnsCompleted":1,"yearsToNextReturn":22.65,"lifePhase":"between 1st and 2nd return (29-58)"}],"concurrentTransits":[],"familyPhaseSummary":"2 members tracked: 0 pair(s) currently in synchronized Saturn-return windows.","source":"Liz Greene \"Saturn\" 1976 + Sasportas \"The Twelve Houses\" 1985 (parental axes).","disclaimer":"Family-astrology models are interpretive overlays of natal/synastry data. Not psychological diagnosis. Methodology by AstroWay drawing from Greene, Sasportas, Sullivan, and modern systemic-family lineage."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/family/parent-child-deep":{"post":{"tags":["Family Astrology"],"summary":"Parent-Child Deep","description":"Deep parent-child synastry analysis.","operationId":"family_parent-child-deep","x-quality":"yellow","x-source":"Liz Greene \"Astrology of Fate\" 1985 + Howard Sasportas \"The Gods of Change\" 1989 + family-systems lineage.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ParentChild"},"example":{"parent":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52},"child":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/family/parent-child-deep \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"parent\": { \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }, \"child\": { \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 } }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/family/parent-child-deep', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"parent\": {\n      \"date\": \"1990-05-15\",\n      \"time\": \"15:30:00\",\n      \"timezone\": \"Europe/Kyiv\",\n      \"latitude\": 50.45,\n      \"longitude\": 30.52\n    },\n    \"child\": {\n      \"date\": \"1990-05-15\",\n      \"time\": \"15:30:00\",\n      \"timezone\": \"Europe/Kyiv\",\n      \"latitude\": 50.45,\n      \"longitude\": 30.52\n    }\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/family/parent-child-deep',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'parent': {\n        'date': \"1990-05-15\",\n        'time': \"15:30:00\",\n        'timezone': \"Europe/Kyiv\",\n        'latitude': 50.45,\n        'longitude': 30.52\n      },\n      'child': {\n        'date': \"1990-05-15\",\n        'time': \"15:30:00\",\n        'timezone': \"Europe/Kyiv\",\n        'latitude': 50.45,\n        'longitude': 30.52\n      }\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('family/parent-child-deep', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'parent' => [\n            'date' => '1990-05-15',\n            'time' => '15:30:00',\n            'timezone' => 'Europe/Kyiv',\n            'latitude' => 50.45,\n            'longitude' => 30.52,\n        ],\n        'child' => [\n            'date' => '1990-05-15',\n            'time' => '15:30:00',\n            'timezone' => 'Europe/Kyiv',\n            'latitude' => 50.45,\n            'longitude' => 30.52,\n        ],\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"luminaryAspects":{"type":"array","items":{"type":"object","properties":{"parent":{"type":"string","nullable":true},"child":{"type":"string","nullable":true},"type":{"type":"string","nullable":true},"orb":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"parentalAxisOverlay":{"type":"array","items":{"type":"object","properties":{"parent":{"type":"string","nullable":true},"in_child_house":{"type":"number","nullable":true},"axis":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"mcContact":{"nullable":true},"saturnCrossCount":{"type":"number","nullable":true},"inheritanceScore":{"type":"number","nullable":true},"interpretation":{"type":"string","nullable":true},"source":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"luminaryAspects":[{"parent":"Sun","child":"Sun","type":"Conjunction","orb":0}],"parentalAxisOverlay":[{"parent":"Jupiter","in_child_house":10,"axis":"public/career"}],"mcContact":null,"saturnCrossCount":7,"inheritanceScore":64,"interpretation":"Strong parental signature in child's chart: multiple themes echo.","source":"Sasportas \"The Twelve Houses\" 1985 (4th/10th = parents) + Greene \"Astrology of Family Patterns\" 1995.","disclaimer":"Family-astrology models are interpretive overlays of natal/synastry data. Not psychological diagnosis. Methodology by AstroWay drawing from Greene, Sasportas, Sullivan, and modern systemic-family lineage."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/family/genogram":{"post":{"tags":["Family Astrology"],"summary":"Genogram","description":"Multi-generational family pattern map.","operationId":"family_genogram","x-quality":"yellow","x-source":"Liz Greene \"Astrology of Fate\" 1985 + Howard Sasportas \"The Gods of Change\" 1989 + family-systems lineage.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Genogram"},"example":{"grandparent":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52},"parent":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52},"child":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/family/genogram \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"grandparent\": { \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }, \"parent\": { \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }, \"child\": { \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 } }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/family/genogram', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"grandparent\": {\n      \"date\": \"1990-05-15\",\n      \"time\": \"15:30:00\",\n      \"timezone\": \"Europe/Kyiv\",\n      \"latitude\": 50.45,\n      \"longitude\": 30.52\n    },\n    \"parent\": {\n      \"date\": \"1990-05-15\",\n      \"time\": \"15:30:00\",\n      \"timezone\": \"Europe/Kyiv\",\n      \"latitude\": 50.45,\n      \"longitude\": 30.52\n    },\n    \"child\": {\n      \"date\": \"1990-05-15\",\n      \"time\": \"15:30:00\",\n      \"timezone\": \"Europe/Kyiv\",\n      \"latitude\": 50.45,\n      \"longitude\": 30.52\n    }\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/family/genogram',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'grandparent': {\n        'date': \"1990-05-15\",\n        'time': \"15:30:00\",\n        'timezone': \"Europe/Kyiv\",\n        'latitude': 50.45,\n        'longitude': 30.52\n      },\n      'parent': {\n        'date': \"1990-05-15\",\n        'time': \"15:30:00\",\n        'timezone': \"Europe/Kyiv\",\n        'latitude': 50.45,\n        'longitude': 30.52\n      },\n      'child': {\n        'date': \"1990-05-15\",\n        'time': \"15:30:00\",\n        'timezone': \"Europe/Kyiv\",\n        'latitude': 50.45,\n        'longitude': 30.52\n      }\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('family/genogram', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'grandparent' => [\n            'date' => '1990-05-15',\n            'time' => '15:30:00',\n            'timezone' => 'Europe/Kyiv',\n            'latitude' => 50.45,\n            'longitude' => 30.52,\n        ],\n        'parent' => [\n            'date' => '1990-05-15',\n            'time' => '15:30:00',\n            'timezone' => 'Europe/Kyiv',\n            'latitude' => 50.45,\n            'longitude' => 30.52,\n        ],\n        'child' => [\n            'date' => '1990-05-15',\n            'time' => '15:30:00',\n            'timezone' => 'Europe/Kyiv',\n            'latitude' => 50.45,\n            'longitude' => 30.52,\n        ],\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"generations":{"type":"object","properties":{"grandparent":{"type":"object","properties":{"sun":{"type":"string","nullable":true},"moon":{"type":"string","nullable":true},"pluto":{"type":"string","nullable":true}},"nullable":true},"parent":{"type":"object","properties":{"sun":{"type":"string","nullable":true},"moon":{"type":"string","nullable":true},"pluto":{"type":"string","nullable":true}},"nullable":true},"child":{"type":"object","properties":{"sun":{"type":"string","nullable":true},"moon":{"type":"string","nullable":true},"pluto":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"karmicLine":{"type":"object","properties":{"carryoverEvents":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"gpSN":{"type":"string","nullable":true},"pSN":{"type":"string","nullable":true},"cSN":{"type":"string","nullable":true}},"nullable":true},"outerPlanetEcho":{"type":"array","items":{"type":"object","properties":{"planet":{"type":"string","nullable":true},"signs":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"repeating":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true},"moonInheritance":{"type":"object","properties":{"signs":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"sameAcrossGenerations":{"type":"boolean","nullable":true}},"nullable":true},"source":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"generations":{"grandparent":{"sun":"Taurus","moon":"Capricorn","pluto":"Scorpio"},"parent":{"sun":"Taurus","moon":"Capricorn","pluto":"Scorpio"},"child":{"sun":"Taurus","moon":"Capricorn","pluto":"Scorpio"}},"karmicLine":{"carryoverEvents":["Grandparent → parent SN within 6° (karmic theme transmitted)"],"gpSN":"Leo","pSN":"Leo","cSN":"Leo"},"outerPlanetEcho":[{"planet":"Saturn","signs":["Capricorn"],"repeating":true}],"moonInheritance":{"signs":["Capricorn"],"sameAcrossGenerations":true},"source":"Greene \"Astrology of Family Patterns\" 1995 (generational themes) + Steven Forrest \"Yesterday's Sky\" 2008 (karmic-line lineage).","disclaimer":"Family-astrology models are interpretive overlays of natal/synastry data. Not psychological diagnosis. Methodology by AstroWay drawing from Greene, Sasportas, Sullivan, and modern systemic-family lineage."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/family/sibling-dynamics":{"post":{"tags":["Family Astrology"],"summary":"Sibling Dynamics","description":"Inter-sibling synastry and dynamics.","operationId":"family_sibling-dynamics","x-quality":"yellow","x-source":"Liz Greene \"Astrology of Fate\" 1985 + Howard Sasportas \"The Gods of Change\" 1989 + family-systems lineage.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Siblings"},"example":{"sibling1":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52},"sibling2":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/family/sibling-dynamics \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"sibling1\": { \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }, \"sibling2\": { \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 } }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/family/sibling-dynamics', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"sibling1\": {\n      \"date\": \"1990-05-15\",\n      \"time\": \"15:30:00\",\n      \"timezone\": \"Europe/Kyiv\",\n      \"latitude\": 50.45,\n      \"longitude\": 30.52\n    },\n    \"sibling2\": {\n      \"date\": \"1990-05-15\",\n      \"time\": \"15:30:00\",\n      \"timezone\": \"Europe/Kyiv\",\n      \"latitude\": 50.45,\n      \"longitude\": 30.52\n    }\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/family/sibling-dynamics',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'sibling1': {\n        'date': \"1990-05-15\",\n        'time': \"15:30:00\",\n        'timezone': \"Europe/Kyiv\",\n        'latitude': 50.45,\n        'longitude': 30.52\n      },\n      'sibling2': {\n        'date': \"1990-05-15\",\n        'time': \"15:30:00\",\n        'timezone': \"Europe/Kyiv\",\n        'latitude': 50.45,\n        'longitude': 30.52\n      }\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('family/sibling-dynamics', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'sibling1' => [\n            'date' => '1990-05-15',\n            'time' => '15:30:00',\n            'timezone' => 'Europe/Kyiv',\n            'latitude' => 50.45,\n            'longitude' => 30.52,\n        ],\n        'sibling2' => [\n            'date' => '1990-05-15',\n            'time' => '15:30:00',\n            'timezone' => 'Europe/Kyiv',\n            'latitude' => 50.45,\n            'longitude' => 30.52,\n        ],\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"mercuryAspect":{"type":"object","properties":{"type":{"type":"string","nullable":true},"orb":{"type":"number","nullable":true}},"nullable":true},"moonAspect":{"type":"object","properties":{"type":{"type":"string","nullable":true},"orb":{"type":"number","nullable":true}},"nullable":true},"siblingHouseOverlay":{"type":"array","items":{},"nullable":true},"sharedParentImprint":{"nullable":true},"siblingScore":{"type":"number","nullable":true},"interpretation":{"type":"string","nullable":true},"source":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"mercuryAspect":{"type":"Conjunction","orb":0},"moonAspect":{"type":"Conjunction","orb":0},"siblingHouseOverlay":[],"sharedParentImprint":null,"siblingScore":66,"interpretation":"Strong sibling rapport: shared mind + emotional rhythm.","source":"Erin Sullivan \"The Astrology of Family Dynamics\" 2001 + Lilly 1647 PD (3rd/11th house = siblings).","disclaimer":"Family-astrology models are interpretive overlays of natal/synastry data. Not psychological diagnosis. Methodology by AstroWay drawing from Greene, Sasportas, Sullivan, and modern systemic-family lineage."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/family/system-pattern":{"post":{"tags":["Family Astrology"],"summary":"Family System Pattern","description":"System-level family astrological signatures.","operationId":"family_system-pattern","x-quality":"yellow","x-source":"Liz Greene \"Astrology of Fate\" 1985 + Howard Sasportas \"The Gods of Change\" 1989 + family-systems lineage.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Family"},"example":{"members":[{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52},{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}]}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/family/system-pattern \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"members\": [ { \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }, { \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 } ] }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/family/system-pattern', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"members\": [\n      {\n        \"date\": \"1990-05-15\",\n        \"time\": \"15:30:00\",\n        \"timezone\": \"Europe/Kyiv\",\n        \"latitude\": 50.45,\n        \"longitude\": 30.52\n      },\n      {\n        \"date\": \"1990-05-15\",\n        \"time\": \"15:30:00\",\n        \"timezone\": \"Europe/Kyiv\",\n        \"latitude\": 50.45,\n        \"longitude\": 30.52\n      }\n    ]\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/family/system-pattern',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'members': [\n        {\n          'date': \"1990-05-15\",\n          'time': \"15:30:00\",\n          'timezone': \"Europe/Kyiv\",\n          'latitude': 50.45,\n          'longitude': 30.52\n        },\n        {\n          'date': \"1990-05-15\",\n          'time': \"15:30:00\",\n          'timezone': \"Europe/Kyiv\",\n          'latitude': 50.45,\n          'longitude': 30.52\n        }\n      ]\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('family/system-pattern', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'members' => [[\n            'date' => '1990-05-15',\n            'time' => '15:30:00',\n            'timezone' => 'Europe/Kyiv',\n            'latitude' => 50.45,\n            'longitude' => 30.52,\n        ], [\n            'date' => '1990-05-15',\n            'time' => '15:30:00',\n            'timezone' => 'Europe/Kyiv',\n            'latitude' => 50.45,\n            'longitude' => 30.52,\n        ]],\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"members":{"type":"number","nullable":true},"excludedThemes":{"type":"array","items":{"type":"object","properties":{"memberIndex":{"type":"number","nullable":true},"role":{"nullable":true},"name":{"type":"string","nullable":true},"signatures":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}},"nullable":true},"nullable":true},"generationalShadow":{"type":"object","properties":{"dominantPlutoSign":{"type":"string","nullable":true},"summary":{"type":"string","nullable":true},"perMember":{"type":"array","items":{"type":"object","properties":{"idx":{"type":"number","nullable":true},"sign":{"type":"string","nullable":true}},"nullable":true},"nullable":true}},"nullable":true},"luminaryGhostContacts":{"type":"array","items":{"type":"object","properties":{"pair":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"signature":{"type":"string","nullable":true},"orb":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"systemSummary":{"type":"string","nullable":true},"source":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"members":2,"excludedThemes":[{"memberIndex":0,"role":null,"name":"","signatures":["Saturn hard-aspect natal Moon"]}],"generationalShadow":{"dominantPlutoSign":"Scorpio","summary":"2/2 members carry Pluto in Scorpio: shared generational shadow theme.","perMember":[{"idx":0,"sign":"Scorpio"}]},"luminaryGhostContacts":[{"pair":[0],"signature":"0.Moon conjunct 1.Saturn","orb":1.65}],"systemSummary":"2 member(s) carry \"excluded\" signatures, 1 luminary↔outer-planet ghost contact(s) across the system.","source":"Modern systemic-family lineage (Bert Hellinger 1995, interpretive overlay) + Greene \"Family Patterns\" 1995. Note: not endorsed by Hellinger Institut.","disclaimer":"Family-astrology models are interpretive overlays of natal/synastry data. Not psychological diagnosis. Methodology by AstroWay drawing from Greene, Sasportas, Sullivan, and modern systemic-family lineage."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/hellenistic/brennan/zodiacal-releasing-spirit":{"post":{"tags":["Hellenistic: Brennan tradition"],"summary":"ZR from Spirit","description":"Zodiacal Releasing from Lot of Spirit: career/action periods.","operationId":"hellenistic_brennan_zodiacal-releasing-spirit","x-quality":"green","x-source":"Vettius Valens \"Anthology\" Books I-IX (PD) + Chris Brennan \"Hellenistic Astrology: The Study of Fate and Fortune\" 2017 + Project Hindsight translations.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Zr"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/hellenistic/brennan/zodiacal-releasing-spirit \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/hellenistic/brennan/zodiacal-releasing-spirit', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/hellenistic/brennan/zodiacal-releasing-spirit',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('hellenistic/brennan/zodiacal-releasing-spirit', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"lotOfSpirit":{"type":"object","properties":{"sign":{"type":"string","nullable":true},"longitude":{"type":"number","nullable":true},"formula":{"type":"string","nullable":true}},"nullable":true},"l1Sequence":{"type":"array","items":{"type":"object","properties":{"level":{"type":"string","nullable":true},"signIdx":{"type":"number","nullable":true},"sign":{"type":"string","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true},"isLoosingOfBond":{"type":"boolean","nullable":true},"isPeak":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true},"summary":{"type":"object","properties":{"totalPeriods":{"type":"number","nullable":true},"loosingOfBondCount":{"type":"number","nullable":true},"peakCount":{"type":"number","nullable":true}},"nullable":true},"doctrine":{"type":"string","nullable":true},"source":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"lotOfSpirit":{"sign":"Capricorn","longitude":287.44,"formula":"ASC + Sun − Moon"},"l1Sequence":[{"level":"L1","signIdx":9,"sign":"Capricorn","startDate":"1990-05-15","endDate":"2017-05-14","durationYears":27,"isLoosingOfBond":false,"isPeak":true}],"summary":{"totalPeriods":4,"loosingOfBondCount":0,"peakCount":2},"doctrine":"ZR from Spirit governs career and voluntary life direction (καιρός / kairos). Peaks = career milestones; LB = chapter breaks.","source":"Vettius Valens Anthology IV-V (Greek PD) + Brennan 2017 §20.","disclaimer":"Hellenistic doctrine per Brennan 2017. Time-lord systems are interpretive frameworks for biographical reflection, not deterministic predictions."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/hellenistic/brennan/zodiacal-releasing-fortune":{"post":{"tags":["Hellenistic: Brennan tradition"],"summary":"ZR from Fortune","description":"Zodiacal Releasing from Lot of Fortune: body/livelihood periods.","operationId":"hellenistic_brennan_zodiacal-releasing-fortune","x-quality":"green","x-source":"Vettius Valens \"Anthology\" Books I-IX (PD) + Chris Brennan \"Hellenistic Astrology: The Study of Fate and Fortune\" 2017 + Project Hindsight translations.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Zr"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/hellenistic/brennan/zodiacal-releasing-fortune \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/hellenistic/brennan/zodiacal-releasing-fortune', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/hellenistic/brennan/zodiacal-releasing-fortune',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('hellenistic/brennan/zodiacal-releasing-fortune', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"lotOfFortune":{"type":"object","properties":{"sign":{"type":"string","nullable":true},"longitude":{"type":"number","nullable":true},"formula":{"type":"string","nullable":true}},"nullable":true},"l1Sequence":{"type":"array","items":{"type":"object","properties":{"level":{"type":"string","nullable":true},"signIdx":{"type":"number","nullable":true},"sign":{"type":"string","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true},"isLoosingOfBond":{"type":"boolean","nullable":true},"isPeak":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true},"summary":{"type":"object","properties":{"totalPeriods":{"type":"number","nullable":true},"loosingOfBondCount":{"type":"number","nullable":true},"peakCount":{"type":"number","nullable":true}},"nullable":true},"doctrine":{"type":"string","nullable":true},"source":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"lotOfFortune":{"sign":"Taurus","longitude":52.5,"formula":"ASC + Moon − Sun"},"l1Sequence":[{"level":"L1","signIdx":1,"sign":"Taurus","startDate":"1990-05-15","endDate":"1998-05-14","durationYears":8,"isLoosingOfBond":false,"isPeak":true}],"summary":{"totalPeriods":5,"loosingOfBondCount":0,"peakCount":2},"doctrine":"ZR from Fortune governs body, livelihood, and circumstantial well-being. Peaks = embodied achievements; LB = bodily / material breaks.","source":"Valens Anthology IV-V + Brennan 2017 §20.","disclaimer":"Hellenistic doctrine per Brennan 2017. Time-lord systems are interpretive frameworks for biographical reflection, not deterministic predictions."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/hellenistic/brennan/zr-loosing-of-bond":{"post":{"tags":["Hellenistic: Brennan tradition"],"summary":"ZR Loosing of Bond","description":"Loosing of Bond detection within ZR sequence.","operationId":"hellenistic_brennan_zr-loosing-of-bond","x-quality":"green","x-source":"Vettius Valens \"Anthology\" Books I-IX (PD) + Chris Brennan \"Hellenistic Astrology: The Study of Fate and Fortune\" 2017 + Project Hindsight translations.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Zr"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/hellenistic/brennan/zr-loosing-of-bond \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/hellenistic/brennan/zr-loosing-of-bond', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/hellenistic/brennan/zr-loosing-of-bond',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('hellenistic/brennan/zr-loosing-of-bond', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"fromLot":{"type":"string","nullable":true},"lotInfo":{"type":"object","properties":{"sign":{"type":"string","nullable":true},"longitude":{"type":"number","nullable":true}},"nullable":true},"loosingOfBondEvents":{"type":"array","items":{},"nullable":true},"count":{"type":"number","nullable":true},"doctrine":{"type":"string","nullable":true},"source":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"fromLot":"Spirit","lotInfo":{"sign":"Capricorn","longitude":287.44},"loosingOfBondEvents":[],"count":0,"doctrine":"Loosing of the bond (λύσις τοῦ δεσμοῦ): the cycle returns to a previously visited sign. Brennan §20.5: marks chapter-level transitions in the time-lord narrative.","source":"Valens Anthology V + Brennan 2017 §20.5.","disclaimer":"Hellenistic doctrine per Brennan 2017. Time-lord systems are interpretive frameworks for biographical reflection, not deterministic predictions."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/hellenistic/brennan/zr-peak-periods":{"post":{"tags":["Hellenistic: Brennan tradition"],"summary":"ZR Peak Periods","description":"Peak periods in ZR (angular signs from Lot).","operationId":"hellenistic_brennan_zr-peak-periods","x-quality":"green","x-source":"Vettius Valens \"Anthology\" Books I-IX (PD) + Chris Brennan \"Hellenistic Astrology: The Study of Fate and Fortune\" 2017 + Project Hindsight translations.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Zr"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/hellenistic/brennan/zr-peak-periods \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/hellenistic/brennan/zr-peak-periods', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/hellenistic/brennan/zr-peak-periods',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('hellenistic/brennan/zr-peak-periods', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"fromLot":{"type":"string","nullable":true},"peakPeriods":{"type":"array","items":{"type":"object","properties":{"sign":{"type":"string","nullable":true},"startDate":{"type":"string","nullable":true},"endDate":{"type":"string","nullable":true},"durationYears":{"type":"number","nullable":true},"relativeHouse":{"type":"number","nullable":true},"peakNature":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"count":{"type":"number","nullable":true},"doctrine":{"type":"string","nullable":true},"source":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"fromLot":"Spirit","peakPeriods":[{"sign":"Capricorn","startDate":"1990-05-15","endDate":"2017-05-14","durationYears":27,"relativeHouse":1,"peakNature":"identity / first principle"}],"count":2,"doctrine":"Peak periods = ZR L1 sign is angular (1H/4H/7H/10H) from the starting Lot sign. Brennan §20.4: career zeniths from Spirit, embodied milestones from Fortune.","source":"Valens Anthology IV + Brennan 2017 §20.4.","disclaimer":"Hellenistic doctrine per Brennan 2017. Time-lord systems are interpretive frameworks for biographical reflection, not deterministic predictions."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/hellenistic/brennan/lots-15":{"post":{"tags":["Hellenistic: Brennan tradition"],"summary":"15 Hermetic Lots","description":"All 15 Hermetic Lots per Brennan §11.","operationId":"hellenistic_brennan_lots-15","x-quality":"green","x-source":"Vettius Valens \"Anthology\" Books I-IX (PD) + Chris Brennan \"Hellenistic Astrology: The Study of Fate and Fortune\" 2017 + Project Hindsight translations.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/hellenistic/brennan/lots-15 \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/hellenistic/brennan/lots-15', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/hellenistic/brennan/lots-15',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('hellenistic/brennan/lots-15', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"sect":{"type":"string","nullable":true},"count":{"type":"number","nullable":true},"lots":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","nullable":true},"longitude":{"type":"number","nullable":true},"sign":{"type":"string","nullable":true},"formula":{"type":"string","nullable":true},"category":{"type":"string","nullable":true},"source":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"doctrine":{"type":"string","nullable":true},"source":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"sect":"day","count":15,"lots":[{"name":"Fortune","longitude":52.5,"sign":"Taurus","formula":"ASC + Moon − Sun","category":"core","source":"Valens Anthology II + Brennan §11.2"}],"doctrine":"Hermetic Lots: 15 calculated points combining planet/light/angle. Brennan §11: each lot has reversed formula for night charts. Use Spirit & Fortune as primary anchors.","source":"Valens Anthology II + Brennan 2017 §11.","disclaimer":"Hellenistic doctrine per Brennan 2017. Time-lord systems are interpretive frameworks for biographical reflection, not deterministic predictions."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/hellenistic/brennan/profections-detail":{"post":{"tags":["Hellenistic: Brennan tradition"],"summary":"Profections Detail","description":"Annual profection year-lord with full classical condition.","operationId":"hellenistic_brennan_profections-detail","x-quality":"green","x-source":"Vettius Valens \"Anthology\" Books I-IX (PD) + Chris Brennan \"Hellenistic Astrology: The Study of Fate and Fortune\" 2017 + Project Hindsight translations.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Profections"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52,"targetAge":35}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/hellenistic/brennan/profections-detail \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52, \"targetAge\": 35 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/hellenistic/brennan/profections-detail', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52,\n    \"targetAge\": 35\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/hellenistic/brennan/profections-detail',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52,\n      'targetAge': 35\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('hellenistic/brennan/profections-detail', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n        'targetAge' => 35,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"ageYear":{"type":"number","nullable":true},"yearStartDate":{"type":"string","nullable":true},"yearEndDate":{"type":"string","nullable":true},"profectedSign":{"type":"string","nullable":true},"profectedHouseFromAsc":{"type":"number","nullable":true},"yearLord":{"type":"string","nullable":true},"yearLordNatalContext":{"type":"object","properties":{"natalSign":{"type":"string","nullable":true},"natalHouse":{"type":"number","nullable":true},"retrograde":{"type":"boolean","nullable":true}},"nullable":true},"monthlyProfections":{"type":"array","items":{"type":"object","properties":{"monthIdx":{"type":"number","nullable":true},"profectedSign":{"type":"string","nullable":true},"monthLordPlanet":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"doctrine":{"type":"string","nullable":true},"source":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"ageYear":35,"yearStartDate":"2025-05-14","yearEndDate":"2026-05-14","profectedSign":"Leo","profectedHouseFromAsc":12,"yearLord":"Sun","yearLordNatalContext":{"natalSign":"Taurus","natalHouse":9,"retrograde":false},"monthlyProfections":[{"monthIdx":1,"profectedSign":"Leo","monthLordPlanet":"Sun"}],"doctrine":"Profection: each year of life advances 1 sign from the Ascendant. Year 35: Leo (H12) → year lord Sun. Brennan §17: year lord's natal placement + transits to year lord drive that year's themes.","source":"Paulus Alexandrinus + Brennan 2017 §17.","disclaimer":"Hellenistic doctrine per Brennan 2017. Time-lord systems are interpretive frameworks for biographical reflection, not deterministic predictions."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/hellenistic/brennan/time-lord-stack":{"post":{"tags":["Hellenistic: Brennan tradition"],"summary":"Time-Lord Stack","description":"Combined stack of profection + ZR + decennials for a date.","operationId":"hellenistic_brennan_time-lord-stack","x-quality":"green","x-source":"Vettius Valens \"Anthology\" Books I-IX (PD) + Chris Brennan \"Hellenistic Astrology: The Study of Fate and Fortune\" 2017 + Project Hindsight translations.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Profections"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52,"targetAge":35}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/hellenistic/brennan/time-lord-stack \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52, \"targetAge\": 35 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/hellenistic/brennan/time-lord-stack', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52,\n    \"targetAge\": 35\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/hellenistic/brennan/time-lord-stack',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52,\n      'targetAge': 35\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('hellenistic/brennan/time-lord-stack', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n        'targetAge' => 35,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"ageYear":{"type":"number","nullable":true},"yearStart":{"type":"string","nullable":true},"stack":{"type":"object","properties":{"annual":{"type":"object","properties":{"system":{"type":"string","nullable":true},"profectedSign":{"type":"string","nullable":true},"yearLord":{"type":"string","nullable":true},"house":{"type":"number","nullable":true}},"nullable":true},"majorChapter_spirit":{"type":"object","properties":{"system":{"type":"string","nullable":true},"sign":{"type":"string","nullable":true},"isPeak":{"type":"boolean","nullable":true},"isLoosingOfBond":{"type":"boolean","nullable":true}},"nullable":true},"majorChapter_fortune":{"type":"object","properties":{"system":{"type":"string","nullable":true},"sign":{"type":"string","nullable":true},"isPeak":{"type":"boolean","nullable":true},"isLoosingOfBond":{"type":"boolean","nullable":true}},"nullable":true}},"nullable":true},"doctrine":{"type":"string","nullable":true},"source":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"ageYear":35,"yearStart":"2025-05-14","stack":{"annual":{"system":"Profections","profectedSign":"Leo","yearLord":"Sun","house":12},"majorChapter_spirit":{"system":"ZR-Spirit L1","sign":"Aquarius","isPeak":false,"isLoosingOfBond":false},"majorChapter_fortune":{"system":"ZR-Fortune L1","sign":"Cancer","isPeak":false,"isLoosingOfBond":false}},"doctrine":"Time-lord stack: profections (annual sign-rotation) layered over ZR (multi-year chapters from Lots). Brennan §19: annual-stack identifies which planet \"rules\" each year and how it folds into the lifetime narrative.","source":"Brennan 2017 §17 + §20 synthesis.","disclaimer":"Hellenistic doctrine per Brennan 2017. Time-lord systems are interpretive frameworks for biographical reflection, not deterministic predictions."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/hellenistic/brennan/joys-of-planets":{"post":{"tags":["Hellenistic: Brennan tradition"],"summary":"Joys of Planets","description":"Classical planetary joys (Sun-Leo-9th, etc.).","operationId":"hellenistic_brennan_joys-of-planets","x-quality":"green","x-source":"Vettius Valens \"Anthology\" Books I-IX (PD) + Chris Brennan \"Hellenistic Astrology: The Study of Fate and Fortune\" 2017 + Project Hindsight translations.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/hellenistic/brennan/joys-of-planets \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/hellenistic/brennan/joys-of-planets', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/hellenistic/brennan/joys-of-planets',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('hellenistic/brennan/joys-of-planets', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"planetsInJoy":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"evaluations":{"type":"array","items":{"type":"object","properties":{"planet":{"type":"string","nullable":true},"joyHouse":{"type":"number","nullable":true},"actualHouse":{"type":"number","nullable":true},"isInJoy":{"type":"boolean","nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"doctrine":{"type":"string","nullable":true},"source":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"planetsInJoy":["Mars"],"evaluations":[{"planet":"Mercury","joyHouse":1,"actualHouse":8,"isInJoy":false,"meaning":"Mercury's joy in the 1H: natural seat of voice and self-presentation."}],"doctrine":"Each of the 7 traditional planets has a \"joy\": a house where its nature is most pleasing. Mercury 1H, Moon 3H, Venus 5H, Mars 6H, Sun 9H, Jupiter 11H, Saturn 12H. Brennan §8.","source":"Valens Anthology II + Manilius Astronomica II + Brennan 2017 §8.","disclaimer":"Hellenistic doctrine per Brennan 2017. Time-lord systems are interpretive frameworks for biographical reflection, not deterministic predictions."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/hellenistic/brennan/triplicity-rulers":{"post":{"tags":["Hellenistic: Brennan tradition"],"summary":"Triplicity Rulers","description":"Dorothean triplicity rulers (day/night/common).","operationId":"hellenistic_brennan_triplicity-rulers","x-quality":"green","x-source":"Vettius Valens \"Anthology\" Books I-IX (PD) + Chris Brennan \"Hellenistic Astrology: The Study of Fate and Fortune\" 2017 + Project Hindsight translations.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/hellenistic/brennan/triplicity-rulers \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/hellenistic/brennan/triplicity-rulers', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/hellenistic/brennan/triplicity-rulers',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('hellenistic/brennan/triplicity-rulers', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"sect":{"type":"string","nullable":true},"perPlanet":{"type":"array","items":{"type":"object","properties":{"planet":{"type":"string","nullable":true},"sign":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"triplicityRulers":{"type":"object","properties":{"day":{"type":"string","nullable":true},"night":{"type":"string","nullable":true},"participating":{"type":"string","nullable":true}},"nullable":true},"activeLord":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"doctrine":{"type":"string","nullable":true},"source":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"sect":"day","perPlanet":[{"planet":"Sun","sign":"Taurus","element":"Earth","triplicityRulers":{"day":"Venus","night":"Moon","participating":"Mars"},"activeLord":"Venus"}],"doctrine":"Each element has 3 triplicity rulers (day/night/participating). Active lord = day-ruler in day charts, night-ruler in night charts. Dorothean order. Brennan §10.","source":"Dorotheus of Sidon \"Carmen Astrologicum\" Book I (PD) + Brennan 2017 §10.","disclaimer":"Hellenistic doctrine per Brennan 2017. Time-lord systems are interpretive frameworks for biographical reflection, not deterministic predictions."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/hellenistic/brennan/bonifications-maltreatments":{"post":{"tags":["Hellenistic: Brennan tradition"],"summary":"Bonifications/Maltreatments","description":"Planet conditions per Valens: 9 categories.","operationId":"hellenistic_brennan_bonifications-maltreatments","x-quality":"green","x-source":"Vettius Valens \"Anthology\" Books I-IX (PD) + Chris Brennan \"Hellenistic Astrology: The Study of Fate and Fortune\" 2017 + Project Hindsight translations.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/hellenistic/brennan/bonifications-maltreatments \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/hellenistic/brennan/bonifications-maltreatments', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/hellenistic/brennan/bonifications-maltreatments',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('hellenistic/brennan/bonifications-maltreatments', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"sect":{"type":"string","nullable":true},"conditions":{"type":"array","items":{"type":"object","properties":{"planet":{"type":"string","nullable":true},"type":{"type":"string","nullable":true},"rule":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"perPlanetSummary":{"type":"array","items":{"type":"object","properties":{"planet":{"type":"string","nullable":true},"status":{"type":"string","nullable":true},"bonifications":{"type":"number","nullable":true},"maltreatments":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"doctrine":{"type":"string","nullable":true},"source":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"sect":"day","conditions":[{"planet":"Venus","type":"maltreatment","rule":"In detriment (Aries)"}],"perPlanetSummary":[{"planet":"Venus","status":"maltreated","bonifications":0,"maltreatments":1}],"doctrine":"A planet is \"bonified\" by being in own sign / exaltation / sect benefic / regarded by sect light. \"Maltreated\" by combustion (≤8.5° Sun), under-the-beams (≤15°), fall, detriment, hard aspects from out-of-sect malefic. Brennan §12.","source":"Valens Anthology II + Antiochus of Athens \"Thesaurus\" (PD) + Brennan 2017 §12.","disclaimer":"Hellenistic doctrine per Brennan 2017. Time-lord systems are interpretive frameworks for biographical reflection, not deterministic predictions."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/hellenistic/hand/lots-of-seven":{"post":{"tags":["Hellenistic: Hand tradition"],"summary":"Lots of Seven","description":"Seven primary Lots per Hand.","operationId":"hellenistic_hand_lots-of-seven","x-quality":"green","x-source":"Robert Hand lectures (NCGR/ISAR ongoing) + Project Hindsight translations + Tetrabiblos III.10 (PD) for hyleg method.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/hellenistic/hand/lots-of-seven \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/hellenistic/hand/lots-of-seven', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/hellenistic/hand/lots-of-seven',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('hellenistic/hand/lots-of-seven', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"sect":{"type":"string","nullable":true},"lotsOfSeven":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","nullable":true},"longitude":{"type":"number","nullable":true},"sign":{"type":"string","nullable":true},"formula":{"type":"string","nullable":true},"category":{"type":"string","nullable":true},"source":{"type":"string","nullable":true},"assignedPlanet":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"doctrine":{"type":"string","nullable":true},"source":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"sect":"day","lotsOfSeven":[{"name":"Fortune","longitude":52.5,"sign":"Taurus","formula":"ASC + Moon − Sun","category":"core","source":"Valens Anthology II + Brennan §11.2","assignedPlanet":"Moon"}],"doctrine":"The 7 Hermetic Lots, one per traditional planet, together encode the full inner symmetry of the chart. Hand emphasises Spirit (Sun → career) and Fortune (Moon → body) as primary anchors.","source":"Robert Hand lecture series at Project Hindsight + Brennan 2017 §11 cross-reference.","disclaimer":"Hellenistic doctrine per Hand 1981/1995 + Project Hindsight translations. Time-lord and longevity techniques are interpretive frameworks, not deterministic predictions."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/hellenistic/hand/decennials":{"post":{"tags":["Hellenistic: Hand tradition"],"summary":"Decennials","description":"Hand's decennial timing technique.","operationId":"hellenistic_hand_decennials","x-quality":"green","x-source":"Robert Hand lectures (NCGR/ISAR ongoing) + Project Hindsight translations + Tetrabiblos III.10 (PD) for hyleg method.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Decennials"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/hellenistic/hand/decennials \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/hellenistic/hand/decennials', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/hellenistic/hand/decennials',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('hellenistic/hand/decennials', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"sect":{"type":"string","nullable":true},"currentAge":{"type":"number","nullable":true},"currentRuler":{"type":"string","nullable":true},"decennials":{"type":"array","items":{"type":"object","properties":{"startYear":{"type":"number","nullable":true},"endYear":{"type":"number","nullable":true},"rulerYear":{"type":"string","nullable":true},"rulerMonth":{"type":"string","nullable":true},"monthOffset":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"doctrine":{"type":"string","nullable":true},"source":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"sect":"day","currentAge":36.28,"currentRuler":"Venus","decennials":[{"startYear":0,"endYear":1,"rulerYear":"Sun","rulerMonth":"Venus","monthOffset":0}],"doctrine":"10y9m periods. Each year is ruled by a different chronocrator; sequence depends on sect. Day chart starts with Sun, night chart with Moon. Valens Anthology IV.","source":"Vettius Valens \"Anthology\" Book IV (Greek PD) + Hand \"Night & Day\" 1995.","disclaimer":"Hellenistic doctrine per Hand 1981/1995 + Project Hindsight translations. Time-lord and longevity techniques are interpretive frameworks, not deterministic predictions."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/hellenistic/hand/perfections":{"post":{"tags":["Hellenistic: Hand tradition"],"summary":"Perfections","description":"Perfection-of-aspects timing.","operationId":"hellenistic_hand_perfections","x-quality":"green","x-source":"Robert Hand lectures (NCGR/ISAR ongoing) + Project Hindsight translations + Tetrabiblos III.10 (PD) for hyleg method.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Perfections"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52,"targetAge":35}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/hellenistic/hand/perfections \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52, \"targetAge\": 35 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/hellenistic/hand/perfections', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52,\n    \"targetAge\": 35\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/hellenistic/hand/perfections',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52,\n      'targetAge': 35\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('hellenistic/hand/perfections', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n        'targetAge' => 35,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"ageYear":{"type":"number","nullable":true},"yearStartDate":{"type":"string","nullable":true},"profectedSign":{"type":"string","nullable":true},"profectedHouse":{"type":"number","nullable":true},"yearLord":{"type":"string","nullable":true},"yearLordNatalSign":{"type":"string","nullable":true},"yearLordBoundRuler":{"type":"string","nullable":true},"perfectionChain":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"doctrine":{"type":"string","nullable":true},"source":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"ageYear":35,"yearStartDate":"2025-05-14","profectedSign":"Leo","profectedHouse":12,"yearLord":"Sun","yearLordNatalSign":"Taurus","yearLordBoundRuler":"Saturn","perfectionChain":["Profected sign: Leo"],"doctrine":"Roxana Muise method (Hand pupil): perfection chains the year-lord through its natal placement and bound-ruler. Each year is governed by this nested sequence of significators.","source":"Roxana Muise lecture series + Hand \"Horoscope Symbols\" 1981 §17.","disclaimer":"Hellenistic doctrine per Hand 1981/1995 + Project Hindsight translations. Time-lord and longevity techniques are interpretive frameworks, not deterministic predictions."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/hellenistic/hand/sect-strength":{"post":{"tags":["Hellenistic: Hand tradition"],"summary":"Sect Strength Score","description":"Numerical sect-light dignity scoring.","operationId":"hellenistic_hand_sect-strength","x-quality":"green","x-source":"Robert Hand lectures (NCGR/ISAR ongoing) + Project Hindsight translations + Tetrabiblos III.10 (PD) for hyleg method.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/hellenistic/hand/sect-strength \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/hellenistic/hand/sect-strength', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/hellenistic/hand/sect-strength',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('hellenistic/hand/sect-strength', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"score":{"type":"number","nullable":true}}}}},"example":{"ok":true,"data":{"score":8}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/hellenistic/hand/critical-degrees":{"post":{"tags":["Hellenistic: Hand tradition"],"summary":"Critical Degrees","description":"Critical degrees by modality.","operationId":"hellenistic_hand_critical-degrees","x-quality":"green","x-source":"Robert Hand lectures (NCGR/ISAR ongoing) + Project Hindsight translations + Tetrabiblos III.10 (PD) for hyleg method.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/hellenistic/hand/critical-degrees \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/hellenistic/hand/critical-degrees', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/hellenistic/hand/critical-degrees',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('hellenistic/hand/critical-degrees', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"onCritical":{"type":"array","items":{"type":"object","properties":{"planet":{"type":"string","nullable":true},"sign":{"type":"string","nullable":true},"degInSign":{"type":"number","nullable":true},"criticalDeg":{"type":"number","nullable":true},"modality":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"criticalDegreeMap":{"type":"object","properties":{"Cardinal":{"type":"string","nullable":true},"Fixed":{"type":"string","nullable":true},"Mutable":{"type":"string","nullable":true}},"nullable":true},"doctrine":{"type":"string","nullable":true},"source":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"onCritical":[{"planet":"Moon","sign":"Capricorn","degInSign":26.9,"criticalDeg":26,"modality":"Cardinal"}],"criticalDegreeMap":{"Cardinal":"0°, 13°, 26°","Fixed":"8.5°, 21.5°","Mutable":"4°, 17°"},"doctrine":"Critical degrees are angular pivots within each modality where planets express heightened intensity. Cardinal: 0/13/26; Fixed: 8.5/21.5; Mutable: 4/17. Hand 1981 §2.","source":"Robert Hand \"Horoscope Symbols\" 1981 §2 (modality + critical degrees).","disclaimer":"Hellenistic doctrine per Hand 1981/1995 + Project Hindsight translations. Time-lord and longevity techniques are interpretive frameworks, not deterministic predictions."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/hellenistic/hand/horoscopos-trine":{"post":{"tags":["Hellenistic: Hand tradition"],"summary":"Horoskopos Trine","description":"Bodies trining the rising sign.","operationId":"hellenistic_hand_horoscopos-trine","x-quality":"green","x-source":"Robert Hand lectures (NCGR/ISAR ongoing) + Project Hindsight translations + Tetrabiblos III.10 (PD) for hyleg method.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/hellenistic/hand/horoscopos-trine \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/hellenistic/hand/horoscopos-trine', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/hellenistic/hand/horoscopos-trine',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('hellenistic/hand/horoscopos-trine', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"horoscoposTrine":{"type":"array","items":{"type":"object","properties":{"house":{"type":"number","nullable":true},"cusp":{"type":"number","nullable":true},"sign":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"planetsInTrine":{"type":"array","items":{"type":"object","properties":{"planet":{"type":"string","nullable":true},"house":{"type":"number","nullable":true},"sign":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"doctrine":{"type":"string","nullable":true},"source":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"horoscoposTrine":[{"house":1,"cusp":169.9679500481848,"sign":"Virgo"}],"planetsInTrine":[{"planet":"Sun","house":9,"sign":"Taurus"}],"doctrine":"The trine of the horoscopos (1H/5H/9H) is the element trine of the rising sign, considered the \"good\" trine in Hellenistic doctrine. Planets here express benefit. Hand 1981 §6.","source":"Hephaistio of Thebes \"Apotelesmatica\" Book II + Hand 1981 §6.","disclaimer":"Hellenistic doctrine per Hand 1981/1995 + Project Hindsight translations. Time-lord and longevity techniques are interpretive frameworks, not deterministic predictions."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/hellenistic/hand/quarter-lord":{"post":{"tags":["Hellenistic: Hand tradition"],"summary":"Quarter Lord","description":"Lord of the chart's seasonal quarter.","operationId":"hellenistic_hand_quarter-lord","x-quality":"green","x-source":"Robert Hand lectures (NCGR/ISAR ongoing) + Project Hindsight translations + Tetrabiblos III.10 (PD) for hyleg method.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuarterLord"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52,"targetDate":"2026-06-15"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/hellenistic/hand/quarter-lord \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52, \"targetDate\": \"2026-06-15\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/hellenistic/hand/quarter-lord', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52,\n    \"targetDate\": \"2026-06-15\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/hellenistic/hand/quarter-lord',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52,\n      'targetDate': \"2026-06-15\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('hellenistic/hand/quarter-lord', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n        'targetDate' => '2026-06-15',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"lord":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"lord":"Mars"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/hellenistic/hand/decanic-rulers":{"post":{"tags":["Hellenistic: Hand tradition"],"summary":"Decanic Rulers","description":"Chaldean decan rulers per planet.","operationId":"hellenistic_hand_decanic-rulers","x-quality":"green","x-source":"Robert Hand lectures (NCGR/ISAR ongoing) + Project Hindsight translations + Tetrabiblos III.10 (PD) for hyleg method.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/hellenistic/hand/decanic-rulers \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/hellenistic/hand/decanic-rulers', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/hellenistic/hand/decanic-rulers',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('hellenistic/hand/decanic-rulers', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"perPlanet":{"type":"array","items":{"type":"object","properties":{"planet":{"type":"string","nullable":true},"longitude":{"type":"number","nullable":true},"sign":{"type":"string","nullable":true},"decan":{"type":"number","nullable":true},"decanRange":{"type":"string","nullable":true},"decanRuler":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"doctrine":{"type":"string","nullable":true},"source":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"perPlanet":[{"planet":"Sun","longitude":54.38,"sign":"Taurus","decan":3,"decanRange":"20°-30°","decanRuler":"Saturn"}],"doctrine":"3 decans per sign (10° each), rulers in Chaldean order. The decan ruler colours the planet's expression within its sign. Tetrabiblos I.21 + Hand 1981 §8.","source":"Claudius Ptolemy \"Tetrabiblos\" I.21 (PD) + Hand 1981 §8.","disclaimer":"Hellenistic doctrine per Hand 1981/1995 + Project Hindsight translations. Time-lord and longevity techniques are interpretive frameworks, not deterministic predictions."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/hellenistic/hand/bounds":{"post":{"tags":["Hellenistic: Hand tradition"],"summary":"Egyptian Bounds","description":"Ptolemaic Egyptian bounds rulers.","operationId":"hellenistic_hand_bounds","x-quality":"green","x-source":"Robert Hand lectures (NCGR/ISAR ongoing) + Project Hindsight translations + Tetrabiblos III.10 (PD) for hyleg method.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/hellenistic/hand/bounds \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/hellenistic/hand/bounds', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/hellenistic/hand/bounds',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('hellenistic/hand/bounds', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"perPlanet":{"type":"array","items":{"type":"object","properties":{"planet":{"type":"string","nullable":true},"longitude":{"type":"number","nullable":true},"sign":{"type":"string","nullable":true},"boundsRuler":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"egyptianBoundsTable":{"type":"object","properties":{"Aries":{"type":"array","items":{"type":"object","properties":{"start":{"type":"number","nullable":true},"end":{"type":"number","nullable":true},"ruler":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"Taurus":{"type":"array","items":{"type":"object","properties":{"start":{"type":"number","nullable":true},"end":{"type":"number","nullable":true},"ruler":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"Gemini":{"type":"array","items":{"type":"object","properties":{"start":{"type":"number","nullable":true},"end":{"type":"number","nullable":true},"ruler":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"Cancer":{"type":"array","items":{"type":"object","properties":{"start":{"type":"number","nullable":true},"end":{"type":"number","nullable":true},"ruler":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"Leo":{"type":"array","items":{"type":"object","properties":{"start":{"type":"number","nullable":true},"end":{"type":"number","nullable":true},"ruler":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"Virgo":{"type":"array","items":{"type":"object","properties":{"start":{"type":"number","nullable":true},"end":{"type":"number","nullable":true},"ruler":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"Libra":{"type":"array","items":{"type":"object","properties":{"start":{"type":"number","nullable":true},"end":{"type":"number","nullable":true},"ruler":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"Scorpio":{"type":"array","items":{"type":"object","properties":{"start":{"type":"number","nullable":true},"end":{"type":"number","nullable":true},"ruler":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"Sagittarius":{"type":"array","items":{"type":"object","properties":{"start":{"type":"number","nullable":true},"end":{"type":"number","nullable":true},"ruler":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"Capricorn":{"type":"array","items":{"type":"object","properties":{"start":{"type":"number","nullable":true},"end":{"type":"number","nullable":true},"ruler":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"Aquarius":{"type":"array","items":{"type":"object","properties":{"start":{"type":"number","nullable":true},"end":{"type":"number","nullable":true},"ruler":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"Pisces":{"type":"array","items":{"type":"object","properties":{"start":{"type":"number","nullable":true},"end":{"type":"number","nullable":true},"ruler":{"type":"string","nullable":true}},"nullable":true},"nullable":true}},"nullable":true},"doctrine":{"type":"string","nullable":true},"source":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"perPlanet":[{"planet":"Sun","longitude":54.38,"sign":"Taurus","boundsRuler":"Saturn"}],"egyptianBoundsTable":{"Aries":[{"start":0,"end":6,"ruler":"Jupiter"}],"Taurus":[{"start":0,"end":8,"ruler":"Venus"}],"Gemini":[{"start":0,"end":7,"ruler":"Mercury"}],"Cancer":[{"start":0,"end":6,"ruler":"Mars"}],"Leo":[{"start":0,"end":6,"ruler":"Jupiter"}],"Virgo":[{"start":0,"end":7,"ruler":"Mercury"}],"Libra":[{"start":0,"end":6,"ruler":"Saturn"}],"Scorpio":[{"start":0,"end":7,"ruler":"Mars"}],"Sagittarius":[{"start":0,"end":12,"ruler":"Jupiter"}],"Capricorn":[{"start":0,"end":7,"ruler":"Mercury"}],"Aquarius":[{"start":0,"end":7,"ruler":"Mercury"}],"Pisces":[{"start":0,"end":12,"ruler":"Venus"}]},"doctrine":"Egyptian bounds (Ptolemaic version): each sign has 5 unequal segments ruled by Mercury/Venus/Mars/Jupiter/Saturn (no luminaries). Bound ruler is one of the 5 \"essential dignities\". Tetrabiblos I.20.","source":"Claudius Ptolemy \"Tetrabiblos\" I.20 (PD).","disclaimer":"Hellenistic doctrine per Hand 1981/1995 + Project Hindsight translations. Time-lord and longevity techniques are interpretive frameworks, not deterministic predictions."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/hellenistic/hand/longevity-hyleg":{"post":{"tags":["Hellenistic: Hand tradition"],"summary":"Hyleg Longevity","description":"Tetrabiblos III.10 hyleg + alcocoden.","operationId":"hellenistic_hand_longevity-hyleg","x-quality":"green","x-source":"Robert Hand lectures (NCGR/ISAR ongoing) + Project Hindsight translations + Tetrabiblos III.10 (PD) for hyleg method.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/hellenistic/hand/longevity-hyleg \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/hellenistic/hand/longevity-hyleg', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/hellenistic/hand/longevity-hyleg',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('hellenistic/hand/longevity-hyleg', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"hyleg":{"type":"string","nullable":true},"hylegLongitude":{"type":"number","nullable":true},"hylegSign":{"type":"string","nullable":true},"alcocoden":{"type":"string","nullable":true},"alcocodenSign":{"type":"string","nullable":true},"lifespanEstimate":{"type":"object","properties":{"minor":{"type":"number","nullable":true},"mean":{"type":"number","nullable":true},"greater":{"type":"number","nullable":true},"useTier":{"type":"string","nullable":true},"estimateYears":{"type":"number","nullable":true}},"nullable":true},"notes":{"type":"array","items":{},"nullable":true},"planetYearsTable":{"type":"object","properties":{"Saturn":{"type":"object","properties":{"minor":{"type":"number","nullable":true},"mean":{"type":"number","nullable":true},"greater":{"type":"number","nullable":true}},"nullable":true},"Jupiter":{"type":"object","properties":{"minor":{"type":"number","nullable":true},"mean":{"type":"number","nullable":true},"greater":{"type":"number","nullable":true}},"nullable":true},"Mars":{"type":"object","properties":{"minor":{"type":"number","nullable":true},"mean":{"type":"number","nullable":true},"greater":{"type":"number","nullable":true}},"nullable":true},"Sun":{"type":"object","properties":{"minor":{"type":"number","nullable":true},"mean":{"type":"number","nullable":true},"greater":{"type":"number","nullable":true}},"nullable":true},"Venus":{"type":"object","properties":{"minor":{"type":"number","nullable":true},"mean":{"type":"number","nullable":true},"greater":{"type":"number","nullable":true}},"nullable":true},"Mercury":{"type":"object","properties":{"minor":{"type":"number","nullable":true},"mean":{"type":"number","nullable":true},"greater":{"type":"number","nullable":true}},"nullable":true},"Moon":{"type":"object","properties":{"minor":{"type":"number","nullable":true},"mean":{"type":"number","nullable":true},"greater":{"type":"number","nullable":true}},"nullable":true}},"nullable":true},"doctrine":{"type":"string","nullable":true},"caveats":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"source":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"hyleg":"Sun","hylegLongitude":54.38,"hylegSign":"Taurus","alcocoden":"Saturn","alcocodenSign":"Capricorn","lifespanEstimate":{"minor":30,"mean":43.5,"greater":57,"useTier":"minor","estimateYears":30},"notes":[],"planetYearsTable":{"Saturn":{"minor":30,"mean":43.5,"greater":57},"Jupiter":{"minor":12,"mean":45,"greater":79},"Mars":{"minor":15,"mean":40.5,"greater":66},"Sun":{"minor":19,"mean":69.5,"greater":120},"Venus":{"minor":8,"mean":45,"greater":82},"Mercury":{"minor":20,"mean":48,"greater":76},"Moon":{"minor":25,"mean":66,"greater":108}},"doctrine":"Tetrabiblos III.10: hyleg (apheta) = primary life-significator. Alcocoden = ruler of the bound containing the hyleg. Lifespan ≈ alcocoden's minor years (default), upgraded to mean if angular, greater if angular AND in own sign AND in sect.","caveats":["INTERPRETIVE technique: never report as a determined lifespan."],"source":"Claudius Ptolemy \"Tetrabiblos\" Book III chapter 10 (PD) + Hand 1981 §15 (modern restatement).","disclaimer":"Hellenistic doctrine per Hand 1981/1995 + Project Hindsight translations. Time-lord and longevity techniques are interpretive frameworks, not deterministic predictions."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/hellenistic/greenbaum/daimon-tyche-axis":{"post":{"tags":["Hellenistic: Greenbaum tradition"],"summary":"Daimon-Tyche Axis","description":"Spirit-Fortune axis as primary chart spine.","operationId":"hellenistic_greenbaum_daimon-tyche-axis","x-quality":"green","x-source":"Dorian Gieseler Greenbaum \"The Daimon in Hellenistic Astrology\" 2016 + Project Hindsight Lot tractates.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/hellenistic/greenbaum/daimon-tyche-axis \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/hellenistic/greenbaum/daimon-tyche-axis', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/hellenistic/greenbaum/daimon-tyche-axis',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('hellenistic/greenbaum/daimon-tyche-axis', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"spirit":{"type":"object","properties":{"sign":{"type":"string","nullable":true},"longitude":{"type":"number","nullable":true},"formula":{"type":"string","nullable":true}},"nullable":true},"fortune":{"type":"object","properties":{"sign":{"type":"string","nullable":true},"longitude":{"type":"number","nullable":true},"formula":{"type":"string","nullable":true}},"nullable":true},"axis":{"type":"object","properties":{"lengthDeg":{"type":"number","nullable":true},"type":{"type":"string","nullable":true}},"nullable":true},"basis":{"type":"object","properties":{"longitude":{"type":"number","nullable":true},"sign":{"type":"string","nullable":true},"house":{"type":"number","nullable":true},"role":{"type":"string","nullable":true}},"nullable":true},"doctrine":{"type":"string","nullable":true},"source":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"spirit":{"sign":"Capricorn","longitude":287.44,"formula":"ASC + Sun − Moon"},"fortune":{"sign":"Taurus","longitude":52.5,"formula":"ASC + Moon − Sun"},"axis":{"lengthDeg":125.06,"type":"125.1° apart (sidereal axis)"},"basis":{"longitude":169.97,"sign":"Virgo","house":1,"role":"midpoint of Daimon and Tyche: ground where will meets fate"},"doctrine":"Greenbaum 2016: the Spirit-Fortune axis encodes the dialogue between voluntary action (Daimon) and circumstantial necessity (Tyche). Basis is the midpoint where they meet.","source":"D.G. Greenbaum \"The Daimon in Hellenistic Astrology\" 2016 (Brill).","disclaimer":"Hellenistic doctrine per Greenbaum 2016 + Hephaistio of Thebes (PD Greek). Interpretive framework for daimon/tyche analysis, not deterministic."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/hellenistic/greenbaum/lot-of-eros-detail":{"post":{"tags":["Hellenistic: Greenbaum tradition"],"summary":"Lot of Eros Detail","description":"Eros calculation with conditions analysis.","operationId":"hellenistic_greenbaum_lot-of-eros-detail","x-quality":"green","x-source":"Dorian Gieseler Greenbaum \"The Daimon in Hellenistic Astrology\" 2016 + Project Hindsight Lot tractates.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/hellenistic/greenbaum/lot-of-eros-detail \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/hellenistic/greenbaum/lot-of-eros-detail', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/hellenistic/greenbaum/lot-of-eros-detail',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('hellenistic/greenbaum/lot-of-eros-detail', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"eros":{"type":"object","properties":{"longitude":{"type":"number","nullable":true},"sign":{"type":"string","nullable":true},"house":{"type":"number","nullable":true},"formula":{"type":"string","nullable":true},"boundsRuler":{"type":"string","nullable":true},"decan":{"type":"object","properties":{"sign":{"type":"string","nullable":true},"decanIdx":{"type":"number","nullable":true},"ruler":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"venusContact":{"type":"object","properties":{"venusLongitude":{"type":"number","nullable":true},"distanceFromErosDeg":{"type":"number","nullable":true},"isConjunctEros":{"type":"boolean","nullable":true}},"nullable":true},"doctrine":{"type":"string","nullable":true},"source":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"eros":{"longitude":130.27,"sign":"Leo","house":11,"formula":"Spirit + Venus − ASC","boundsRuler":"Venus","decan":{"sign":"Leo","decanIdx":1,"ruler":"Jupiter"}},"venusContact":{"venusLongitude":12.79,"distanceFromErosDeg":117.48,"isConjunctEros":false},"doctrine":"Greenbaum 2016 §6: Eros encodes the soul's desire-pattern, where will meets attraction. Bound and decan rulers refine the lot's expression. Venus contact intensifies the desire.","source":"Greenbaum 2016 §6 + Hephaistio Apotelesmatica III (PD).","disclaimer":"Hellenistic doctrine per Greenbaum 2016 + Hephaistio of Thebes (PD Greek). Interpretive framework for daimon/tyche analysis, not deterministic."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/hellenistic/greenbaum/temple-doctrine":{"post":{"tags":["Hellenistic: Greenbaum tradition"],"summary":"Temple Doctrine","description":"Temple-house assignments per Greenbaum.","operationId":"hellenistic_greenbaum_temple-doctrine","x-quality":"green","x-source":"Dorian Gieseler Greenbaum \"The Daimon in Hellenistic Astrology\" 2016 + Project Hindsight Lot tractates.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/hellenistic/greenbaum/temple-doctrine \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/hellenistic/greenbaum/temple-doctrine', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/hellenistic/greenbaum/temple-doctrine',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('hellenistic/greenbaum/temple-doctrine', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"temples":{"type":"array","items":{"type":"object","properties":{"house":{"type":"number","nullable":true},"templeName":{"type":"string","nullable":true},"topos":{"type":"string","nullable":true},"cuspSign":{"type":"string","nullable":true},"cuspRuler":{"type":"string","nullable":true},"occupants":{"type":"array","items":{},"nullable":true}},"nullable":true},"nullable":true},"doctrine":{"type":"string","nullable":true},"source":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"temples":[{"house":1,"templeName":"Helios","topos":"Life / Vitality","cuspSign":"Virgo","cuspRuler":"Mercury","occupants":[]}],"doctrine":"Hellenistic \"temples\" (topoi) map houses to Greek divinity-realms. The 5/11/3/9 axis is benefic (joys); 6/12 is malefic. Greenbaum: each temple has a daimon-tyche flavor reflecting its location relative to ASC and luminaries.","source":"Greenbaum 2016 §3 (temple/topos doctrine) + Hephaistio II.5 (PD).","disclaimer":"Hellenistic doctrine per Greenbaum 2016 + Hephaistio of Thebes (PD Greek). Interpretive framework for daimon/tyche analysis, not deterministic."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/hellenistic/greenbaum/dodekatemoria":{"post":{"tags":["Hellenistic: Greenbaum tradition"],"summary":"Dodekatemoria","description":"Dodecatemoria sub-divisions of zodiac.","operationId":"hellenistic_greenbaum_dodekatemoria","x-quality":"green","x-source":"Dorian Gieseler Greenbaum \"The Daimon in Hellenistic Astrology\" 2016 + Project Hindsight Lot tractates.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/hellenistic/greenbaum/dodekatemoria \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/hellenistic/greenbaum/dodekatemoria', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/hellenistic/greenbaum/dodekatemoria',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('hellenistic/greenbaum/dodekatemoria', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"perPlanet":{"type":"array","items":{"type":"object","properties":{"planet":{"type":"string","nullable":true},"longitude":{"type":"number","nullable":true},"sign":{"type":"string","nullable":true},"degInSign":{"type":"number","nullable":true},"dodekatemorionIdx":{"type":"number","nullable":true},"dodekatemorionSign":{"type":"string","nullable":true},"dodekatemorionRuler":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"doctrine":{"type":"string","nullable":true},"source":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"perPlanet":[{"planet":"Sun","longitude":54.38,"sign":"Taurus","degInSign":24.38,"dodekatemorionIdx":10,"dodekatemorionSign":"Aquarius","dodekatemorionRuler":"Saturn"}],"doctrine":"Dodekatemoria (12-parts): each 30° sign divides into 12 sub-segments of 2.5°, each sub-ruled by a sign in zodiacal sequence starting from the parent sign. Refines a planet's essential dignity.","source":"Manilius \"Astronomica\" Book III (PD Latin) + Greenbaum 2016 §4.","disclaimer":"Hellenistic doctrine per Greenbaum 2016 + Hephaistio of Thebes (PD Greek). Interpretive framework for daimon/tyche analysis, not deterministic."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/hellenistic/greenbaum/duodecima":{"post":{"tags":["Hellenistic: Greenbaum tradition"],"summary":"Duodecima","description":"Duodecima: 2.5° micro-sign per planet.","operationId":"hellenistic_greenbaum_duodecima","x-quality":"green","x-source":"Dorian Gieseler Greenbaum \"The Daimon in Hellenistic Astrology\" 2016 + Project Hindsight Lot tractates.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/hellenistic/greenbaum/duodecima \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/hellenistic/greenbaum/duodecima', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/hellenistic/greenbaum/duodecima',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('hellenistic/greenbaum/duodecima', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"perPlanet":{"type":"array","items":{"type":"object","properties":{"planet":{"type":"string","nullable":true},"longitude":{"type":"number","nullable":true},"sign":{"type":"string","nullable":true},"degInSign":{"type":"number","nullable":true},"duodecimaMicroSegment":{"type":"number","nullable":true},"duodecimaSegmentRange":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"doctrine":{"type":"string","nullable":true},"source":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"perPlanet":[{"planet":"Sun","longitude":54.38,"sign":"Taurus","degInSign":24.38,"duodecimaMicroSegment":10,"duodecimaSegmentRange":"22.50°-25.00° within the dodekatemorion"}],"doctrine":"Duodecima (Manilius): a sub-layer of dodekatemoria. Within each 2.5° dodekatemorion segment, a further 12-fold micro-division gives the most refined essential dignity. Used for pinpoint timing.","source":"Manilius \"Astronomica\" Book III + Schmidt commentary in Project Hindsight.","disclaimer":"Hellenistic doctrine per Greenbaum 2016 + Hephaistio of Thebes (PD Greek). Interpretive framework for daimon/tyche analysis, not deterministic."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/hellenistic/greenbaum/antiscia-hellenistic":{"post":{"tags":["Hellenistic: Greenbaum tradition"],"summary":"Antiscia (Hellenistic)","description":"Solstitial antiscia per Hellenistic conventions.","operationId":"hellenistic_greenbaum_antiscia-hellenistic","x-quality":"green","x-source":"Dorian Gieseler Greenbaum \"The Daimon in Hellenistic Astrology\" 2016 + Project Hindsight Lot tractates.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/hellenistic/greenbaum/antiscia-hellenistic \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/hellenistic/greenbaum/antiscia-hellenistic', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/hellenistic/greenbaum/antiscia-hellenistic',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('hellenistic/greenbaum/antiscia-hellenistic', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"perPlanet":{"type":"array","items":{"type":"object","properties":{"planet":{"type":"string","nullable":true},"longitude":{"type":"number","nullable":true},"sign":{"type":"string","nullable":true},"antiscion":{"type":"number","nullable":true},"antiscionSign":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"antiscionContacts":{"type":"array","items":{"type":"object","properties":{"planet1":{"type":"string","nullable":true},"planet2":{"type":"string","nullable":true},"type":{"type":"string","nullable":true},"orb":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"doctrine":{"type":"string","nullable":true},"source":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"perPlanet":[{"planet":"Sun","longitude":54.38,"sign":"Taurus","antiscion":125.62,"antiscionSign":"Leo"}],"antiscionContacts":[{"planet1":"true Node","planet2":"mean Apogee","type":"antiscion contact","orb":1.74}],"doctrine":"Hellenistic antiscia: planets reflect across the Cancer-Capricorn solstitial axis (longitude 90°/270°). Contacts function like hidden conjunctions, Hellenistic technique pre-dating modern antiscia.","source":"Firmicus Maternus \"Mathesis\" Book II (PD Latin, ~334 CE) + Greenbaum lectures.","disclaimer":"Hellenistic doctrine per Greenbaum 2016 + Hephaistio of Thebes (PD Greek). Interpretive framework for daimon/tyche analysis, not deterministic."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/hellenistic/greenbaum/contra-antiscia":{"post":{"tags":["Hellenistic: Greenbaum tradition"],"summary":"Contra-Antiscia","description":"Equinoctial contra-antiscia.","operationId":"hellenistic_greenbaum_contra-antiscia","x-quality":"green","x-source":"Dorian Gieseler Greenbaum \"The Daimon in Hellenistic Astrology\" 2016 + Project Hindsight Lot tractates.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/hellenistic/greenbaum/contra-antiscia \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/hellenistic/greenbaum/contra-antiscia', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/hellenistic/greenbaum/contra-antiscia',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('hellenistic/greenbaum/contra-antiscia', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"perPlanet":{"type":"array","items":{"type":"object","properties":{"planet":{"type":"string","nullable":true},"longitude":{"type":"number","nullable":true},"sign":{"type":"string","nullable":true},"contraAntiscion":{"type":"number","nullable":true},"contraAntiscionSign":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"contraAntiscionContacts":{"type":"array","items":{"type":"object","properties":{"planet1":{"type":"string","nullable":true},"planet2":{"type":"string","nullable":true},"type":{"type":"string","nullable":true},"orb":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"doctrine":{"type":"string","nullable":true},"source":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"perPlanet":[{"planet":"Sun","longitude":54.38,"sign":"Taurus","contraAntiscion":305.62,"contraAntiscionSign":"Aquarius"}],"contraAntiscionContacts":[{"planet1":"Venus","planet2":"Mars","type":"contra-antiscion contact (hidden opposition)","orb":1.11}],"doctrine":"Contra-antiscia: shadows across the Aries-Libra equinoctial axis. Contacts function as hidden oppositions, paired conflict pattern complementary to antiscia's hidden conjunctions.","source":"Firmicus Maternus \"Mathesis\" Book II (PD) + Greenbaum lectures.","disclaimer":"Hellenistic doctrine per Greenbaum 2016 + Hephaistio of Thebes (PD Greek). Interpretive framework for daimon/tyche analysis, not deterministic."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/hellenistic/greenbaum/zodiacal-decans":{"post":{"tags":["Hellenistic: Greenbaum tradition"],"summary":"Zodiacal Decans","description":"Zodiacal decans with attributions.","operationId":"hellenistic_greenbaum_zodiacal-decans","x-quality":"green","x-source":"Dorian Gieseler Greenbaum \"The Daimon in Hellenistic Astrology\" 2016 + Project Hindsight Lot tractates.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/hellenistic/greenbaum/zodiacal-decans \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/hellenistic/greenbaum/zodiacal-decans', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/hellenistic/greenbaum/zodiacal-decans',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('hellenistic/greenbaum/zodiacal-decans', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"perPlanet":{"type":"array","items":{"type":"object","properties":{"planet":{"type":"string","nullable":true},"sign":{"type":"string","nullable":true},"decanIdx":{"type":"number","nullable":true},"decanRuler":{"type":"string","nullable":true},"paranatellonta":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}},"nullable":true},"nullable":true},"doctrine":{"type":"string","nullable":true},"source":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"perPlanet":[{"planet":"Sun","sign":"Taurus","decanIdx":3,"decanRuler":"Saturn","paranatellonta":["Bellatrix"]}],"doctrine":"Zodiacal decans (36 = 12 signs × 3) carry rich symbolic content beyond ruler. Each decan is associated with 3 paranatellonta, stars/asterisms rising co-temporally. Greenbaum + Hephaistio II.","source":"Greenbaum 2016 + Hephaistio of Thebes \"Apotelesmatica\" Book II (Greenbaum translation, PD original Greek).","disclaimer":"Hellenistic doctrine per Greenbaum 2016 + Hephaistio of Thebes (PD Greek). Interpretive framework for daimon/tyche analysis, not deterministic."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/hellenistic/greenbaum/quality-of-time":{"post":{"tags":["Hellenistic: Greenbaum tradition"],"summary":"Quality of Time","description":"Synchronistic quality of a moment.","operationId":"hellenistic_greenbaum_quality-of-time","x-quality":"green","x-source":"Dorian Gieseler Greenbaum \"The Daimon in Hellenistic Astrology\" 2016 + Project Hindsight Lot tractates.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/hellenistic/greenbaum/quality-of-time \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/hellenistic/greenbaum/quality-of-time', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/hellenistic/greenbaum/quality-of-time',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('hellenistic/greenbaum/quality-of-time', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"qualityOfTime":{"type":"object","properties":{"sect":{"type":"string","nullable":true},"moonPhase":{"type":"string","nullable":true},"ascendantSign":{"type":"string","nullable":true},"sunSign":{"type":"string","nullable":true},"moonSign":{"type":"string","nullable":true},"elementalTone":{"type":"object","properties":{"counts":{"type":"object","properties":{"Fire":{"type":"number","nullable":true},"Earth":{"type":"number","nullable":true},"Air":{"type":"number","nullable":true},"Water":{"type":"number","nullable":true}},"nullable":true},"dominant":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"doctrine":{"type":"string","nullable":true},"source":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"qualityOfTime":{"sect":"day","moonPhase":"waning","ascendantSign":"Virgo","sunSign":"Taurus","moonSign":"Capricorn","elementalTone":{"counts":{"Fire":0,"Earth":3,"Air":0,"Water":0},"dominant":"Earth"}},"doctrine":"Quality of time (kairos) per Hephaistio Apotelesmatica III: a moment's \"tone\" emerges from the combination of sect, lunar phase, and the elemental signatures of ASC + Sun + Moon. Use for electional and biographical reflection.","source":"Hephaistio of Thebes \"Apotelesmatica\" Book III (Greenbaum translation, PD original Greek).","disclaimer":"Hellenistic doctrine per Greenbaum 2016 + Hephaistio of Thebes (PD Greek). Interpretive framework for daimon/tyche analysis, not deterministic."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/hellenistic/greenbaum/sphaera-barbarica":{"post":{"tags":["Hellenistic: Greenbaum tradition"],"summary":"Sphaera Barbarica","description":"Constellations beyond the zodiac.","operationId":"hellenistic_greenbaum_sphaera-barbarica","x-quality":"green","x-source":"Dorian Gieseler Greenbaum \"The Daimon in Hellenistic Astrology\" 2016 + Project Hindsight Lot tractates.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/hellenistic/greenbaum/sphaera-barbarica \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/hellenistic/greenbaum/sphaera-barbarica', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/hellenistic/greenbaum/sphaera-barbarica',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('hellenistic/greenbaum/sphaera-barbarica', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"angles":{"type":"object","properties":{"asc":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"longitude":{"type":"number","nullable":true},"decan":{"type":"string","nullable":true},"decanRuler":{"type":"string","nullable":true}},"nullable":true},"mc":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"longitude":{"type":"number","nullable":true},"decan":{"type":"string","nullable":true},"decanRuler":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"doctrine":{"type":"string","nullable":true},"source":{"type":"string","nullable":true},"notes":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"angles":{"asc":{"angle":"Ascendant","longitude":169.97,"decan":"Virgo-2","decanRuler":"Venus"},"mc":{"angle":"Midheaven","longitude":77.07,"decan":"Gemini-2","decanRuler":"Mars"}},"doctrine":"Sphaera Barbarica: non-Greek star tradition mapped onto the 36 decans. Each decan rises with 3 paranatellonta (co-rising stars). Hellenistic synthesis of Egyptian + Babylonian + Persian astrology. Greenbaum specialty.","source":"Hephaistio II + Teucer of Babylon (Greek text frgs PD) + Greenbaum 2016 §5.","notes":["Pair with /hellenistic/greenbaum/zodiacal-decans for full per-planet decan + star list."],"disclaimer":"Hellenistic doctrine per Greenbaum 2016 + Hephaistio of Thebes (PD Greek). Interpretive framework for daimon/tyche analysis, not deterministic."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/hellenistic/schmidt/stoic-elementhood":{"post":{"tags":["Hellenistic: Schmidt tradition"],"summary":"Stoic Elementhood","description":"Stoic doctrine of elemental natures.","operationId":"hellenistic_schmidt_stoic-elementhood","x-quality":"green","x-source":"Robert Schmidt Project Hindsight 1990s-2010s: full Hellenistic translation series + Stoic philosophy frame.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/hellenistic/schmidt/stoic-elementhood \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/hellenistic/schmidt/stoic-elementhood', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/hellenistic/schmidt/stoic-elementhood',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('hellenistic/schmidt/stoic-elementhood', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"elements":{"type":"object","properties":{"Fire":{"type":"number","nullable":true},"Earth":{"type":"number","nullable":true},"Air":{"type":"number","nullable":true},"Water":{"type":"number","nullable":true}},"nullable":true},"qualities":{"type":"object","properties":{"Hot":{"type":"number","nullable":true},"Cold":{"type":"number","nullable":true},"Wet":{"type":"number","nullable":true},"Dry":{"type":"number","nullable":true}},"nullable":true},"dominantElement":{"type":"string","nullable":true},"dominantQuality":{"type":"string","nullable":true},"doctrine":{"type":"string","nullable":true},"source":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"elements":{"Fire":1,"Earth":4,"Air":0,"Water":2},"qualities":{"Hot":1,"Cold":6,"Wet":2,"Dry":5},"dominantElement":"Earth","dominantQuality":"Cold","doctrine":"Stoic elemental philosophy (Chrysippus, Posidonius): each element = pair of qualities. Schmidt recovered this layer as Hellenistic astrology's philosophical foundation. Personality coloured by the dominant quality, not just element.","source":"Robert Schmidt \"Definitions and Foundations\" + Project Hindsight conclave 1995-2008.","disclaimer":"Hellenistic doctrine per Schmidt + Project Hindsight translations. Schmidt's Stoic-philosophical recovery of original technical method."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/hellenistic/schmidt/qualities-and-quantities":{"post":{"tags":["Hellenistic: Schmidt tradition"],"summary":"Qualities & Quantities","description":"Qualitative + quantitative analysis.","operationId":"hellenistic_schmidt_qualities-and-quantities","x-quality":"green","x-source":"Robert Schmidt Project Hindsight 1990s-2010s: full Hellenistic translation series + Stoic philosophy frame.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/hellenistic/schmidt/qualities-and-quantities \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/hellenistic/schmidt/qualities-and-quantities', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/hellenistic/schmidt/qualities-and-quantities',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('hellenistic/schmidt/qualities-and-quantities', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"perPlanet":{"type":"array","items":{"type":"object","properties":{"planet":{"type":"string","nullable":true},"quality":{"type":"string","nullable":true},"sign":{"type":"string","nullable":true},"quantityScore":{"type":"number","nullable":true},"dignities":{"type":"array","items":{},"nullable":true}},"nullable":true},"nullable":true},"doctrine":{"type":"string","nullable":true},"source":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"perPlanet":[{"planet":"Sun","quality":"Hot+Dry","sign":"Taurus","quantityScore":0,"dignities":[]}],"doctrine":"Schmidt: a planet has QUALITY (its intrinsic nature) and QUANTITY (essential-dignity strength in its current sign). Quantity = sum: domicile +5, exalt +4, triplicity +3, bound +2, decan +1.","source":"Schmidt + Project Hindsight 1995-2008.","disclaimer":"Hellenistic doctrine per Schmidt + Project Hindsight translations. Schmidt's Stoic-philosophical recovery of original technical method."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/hellenistic/schmidt/levels-of-causation":{"post":{"tags":["Hellenistic: Schmidt tradition"],"summary":"Levels of Causation","description":"Schmidt's causation tiers.","operationId":"hellenistic_schmidt_levels-of-causation","x-quality":"green","x-source":"Robert Schmidt Project Hindsight 1990s-2010s: full Hellenistic translation series + Stoic philosophy frame.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/hellenistic/schmidt/levels-of-causation \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/hellenistic/schmidt/levels-of-causation', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/hellenistic/schmidt/levels-of-causation',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('hellenistic/schmidt/levels-of-causation', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"heimarmene_fate":{"type":"object","properties":{"rulers":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"pronoia_providence":{"type":"object","properties":{"rulers":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"sectLight":{"type":"string","nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"sympatheia_resonance":{"type":"object","properties":{"rulers":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"oikeiosis_familiarity":{"type":"object","properties":{"anchors":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"doctrine":{"type":"string","nullable":true},"source":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"heimarmene_fate":{"rulers":["Saturn"],"meaning":"The objective fated unfolding: outer-planet placements signify themes one cannot avoid."},"pronoia_providence":{"rulers":["Sun"],"sectLight":"Sun (day chart)","meaning":"Divine providence working through the luminaries: the chart's sect light is the primary providence-vector."},"sympatheia_resonance":{"rulers":["Mercury"],"meaning":"How parts of the cosmos resonate with the native: inner-planet placements signify the soul's sympathetic colouring."},"oikeiosis_familiarity":{"anchors":["Ascendant"],"meaning":"The native's \"appropriate place\" in the cosmos: angles and lots define which fate / providence / sympathy is one's own."},"doctrine":"Schmidt mapped the 4 Stoic levels of causation onto chart elements. Each level has a different astrological signature; reading a chart means weaving all 4 levels into one biography.","source":"Robert Schmidt \"Definitions and Foundations\" + Stoic philosophy (Chrysippus, Posidonius).","disclaimer":"Hellenistic doctrine per Schmidt + Project Hindsight translations. Schmidt's Stoic-philosophical recovery of original technical method."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/hellenistic/schmidt/lord-of-prediction":{"post":{"tags":["Hellenistic: Schmidt tradition"],"summary":"Lord of Prediction","description":"Predictive significator selection.","operationId":"hellenistic_schmidt_lord-of-prediction","x-quality":"green","x-source":"Robert Schmidt Project Hindsight 1990s-2010s: full Hellenistic translation series + Stoic philosophy frame.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LordOfPrediction"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52,"targetAge":35}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/hellenistic/schmidt/lord-of-prediction \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52, \"targetAge\": 35 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/hellenistic/schmidt/lord-of-prediction', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52,\n    \"targetAge\": 35\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/hellenistic/schmidt/lord-of-prediction',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52,\n      'targetAge': 35\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('hellenistic/schmidt/lord-of-prediction', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n        'targetAge' => 35,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"lord":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"lord":"Saturn"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/hellenistic/schmidt/stations-and-phases":{"post":{"tags":["Hellenistic: Schmidt tradition"],"summary":"Stations & Phases","description":"Heliacal phases and stations.","operationId":"hellenistic_schmidt_stations-and-phases","x-quality":"green","x-source":"Robert Schmidt Project Hindsight 1990s-2010s: full Hellenistic translation series + Stoic philosophy frame.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/hellenistic/schmidt/stations-and-phases \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/hellenistic/schmidt/stations-and-phases', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/hellenistic/schmidt/stations-and-phases',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('hellenistic/schmidt/stations-and-phases', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"perPlanet":{"type":"array","items":{"type":"object","properties":{"planet":{"type":"string","nullable":true},"elongationFromSun":{"type":"number","nullable":true},"phase":{"type":"string","nullable":true},"direction":{"type":"string","nullable":true},"retrograde":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true},"doctrine":{"type":"string","nullable":true},"source":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"perPlanet":[{"planet":"Mercury","elongationFromSun":-16.36,"phase":"free of beams","direction":"occidental (evening star, rises after Sun)","retrograde":true}],"doctrine":"Schmidt recovered Greek heliacal-phase typology: each non-luminary planet's relationship to the Sun (combust / under-the-beams / free / morning / evening) carries strong hermetic significance independent of zodiacal position.","source":"Schmidt Project Hindsight + Antiochus of Athens \"Thesaurus\" (PD).","disclaimer":"Hellenistic doctrine per Schmidt + Project Hindsight translations. Schmidt's Stoic-philosophical recovery of original technical method."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/hellenistic/schmidt/morning-evening-stars":{"post":{"tags":["Hellenistic: Schmidt tradition"],"summary":"Morning/Evening Stars","description":"Morning vs evening star classification.","operationId":"hellenistic_schmidt_morning-evening-stars","x-quality":"green","x-source":"Robert Schmidt Project Hindsight 1990s-2010s: full Hellenistic translation series + Stoic philosophy frame.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/hellenistic/schmidt/morning-evening-stars \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/hellenistic/schmidt/morning-evening-stars', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/hellenistic/schmidt/morning-evening-stars',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('hellenistic/schmidt/morning-evening-stars', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"venus":{"type":"object","properties":{"elongationFromSun":{"type":"number","nullable":true},"phase":{"type":"string","nullable":true}},"nullable":true},"mercury":{"type":"object","properties":{"elongationFromSun":{"type":"number","nullable":true},"phase":{"type":"string","nullable":true}},"nullable":true},"doctrine":{"type":"string","nullable":true},"source":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"venus":{"elongationFromSun":-41.58,"phase":"Venus evening star (Hesperos: sets after Sun)"},"mercury":{"elongationFromSun":-16.36,"phase":"Mercury evening star (Hesperos: sets after Sun)"},"doctrine":"Synodic phase of inner planets: morning-star Venus = Phosphoros (life-bringer); evening-star Venus = Hesperos (sets after Sun). Schmidt emphasises this distinction as personality-shaping. Mercury splits similarly.","source":"Schmidt + Hesiod-tradition references in Greek astrology + Project Hindsight.","disclaimer":"Hellenistic doctrine per Schmidt + Project Hindsight translations. Schmidt's Stoic-philosophical recovery of original technical method."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/hellenistic/schmidt/sect-classes":{"post":{"tags":["Hellenistic: Schmidt tradition"],"summary":"Sect Classes","description":"Sect classifications per Schmidt.","operationId":"hellenistic_schmidt_sect-classes","x-quality":"green","x-source":"Robert Schmidt Project Hindsight 1990s-2010s: full Hellenistic translation series + Stoic philosophy frame.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/hellenistic/schmidt/sect-classes \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/hellenistic/schmidt/sect-classes', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/hellenistic/schmidt/sect-classes',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('hellenistic/schmidt/sect-classes', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"sect":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"sect":"day"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/hellenistic/schmidt/derivative-houses-method":{"post":{"tags":["Hellenistic: Schmidt tradition"],"summary":"Derivative Houses","description":"Derived-house technique.","operationId":"hellenistic_schmidt_derivative-houses-method","x-quality":"green","x-source":"Robert Schmidt Project Hindsight 1990s-2010s: full Hellenistic translation series + Stoic philosophy frame.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/hellenistic/schmidt/derivative-houses-method \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/hellenistic/schmidt/derivative-houses-method', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/hellenistic/schmidt/derivative-houses-method',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('hellenistic/schmidt/derivative-houses-method', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"derivativeMap":{"type":"array","items":{"type":"object","properties":{"baseHouse":{"type":"number","nullable":true},"baseLabel":{"type":"string","nullable":true},"derivativeView":{"type":"array","items":{"type":"object","properties":{"derivativeHouse":{"type":"number","nullable":true},"natalHouse":{"type":"number","nullable":true},"sign":{"type":"string","nullable":true}},"nullable":true},"nullable":true}},"nullable":true},"nullable":true},"examples":{"type":"array","items":{"type":"object","properties":{"question":{"type":"string","nullable":true},"answer":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"doctrine":{"type":"string","nullable":true},"source":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"derivativeMap":[{"baseHouse":1,"baseLabel":"self","derivativeView":[{"derivativeHouse":1,"natalHouse":1,"sign":"Virgo"}]}],"examples":[{"question":"What does the spouse's career look like?","answer":"Look at natal 10th-from-7th = natal 4th house."}],"doctrine":"Derivative houses: any of the 12 natal houses can become a new \"1st\", rotating all 12 houses around it. Schmidt: this is how Hellenistic astrologers asked questions about people OTHER than the native: spouse (from 7H), parent (from 4H or 10H), etc.","source":"Project Hindsight derivative-houses lectures + Lilly \"Christian Astrology\" 1647 PD (modern restatement).","disclaimer":"Hellenistic doctrine per Schmidt + Project Hindsight translations. Schmidt's Stoic-philosophical recovery of original technical method."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/hellenistic/schmidt/aspectual-typology":{"post":{"tags":["Hellenistic: Schmidt tradition"],"summary":"Aspectual Typology","description":"Aspect classes per Schmidt.","operationId":"hellenistic_schmidt_aspectual-typology","x-quality":"green","x-source":"Robert Schmidt Project Hindsight 1990s-2010s: full Hellenistic translation series + Stoic philosophy frame.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/hellenistic/schmidt/aspectual-typology \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/hellenistic/schmidt/aspectual-typology', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/hellenistic/schmidt/aspectual-typology',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('hellenistic/schmidt/aspectual-typology', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"typology":{"type":"object","properties":{"testimony":{"type":"object","properties":{"count":{"type":"number","nullable":true},"examples":{"type":"array","items":{"type":"object","properties":{"planet1":{"type":"string","nullable":true},"planet2":{"type":"string","nullable":true},"aspect":{"type":"string","nullable":true},"orb":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"description":{"type":"string","nullable":true}},"nullable":true},"regard":{"type":"object","properties":{"description":{"type":"string","nullable":true}},"nullable":true},"application":{"type":"object","properties":{"count":{"type":"number","nullable":true},"examples":{"type":"array","items":{},"nullable":true},"description":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"doctrine":{"type":"string","nullable":true},"source":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"typology":{"testimony":{"count":23,"examples":[{"planet1":"Sun","planet2":"Moon","aspect":"Trine","orb":"2.5"}],"description":"sign-based aspectual relationship (whole-sign Hellenistic frame)"},"regard":{"description":"aspect within ±10° orb: looser but still active"},"application":{"count":0,"examples":[],"description":"exact applying aspect (within 1-3° and approaching): most active"}},"doctrine":"Schmidt: \"aspect\" in Hellenistic doctrine is layered. TESTIMONY is the broadest (whole-sign angularity). REGARD adds orb (≤10°). APPLICATION is the active causal layer (exact + approaching). Treating all three as the same \"aspect\" loses precision.","source":"Robert Schmidt \"Definitions and Foundations\" §8 + Antiochus \"Thesaurus\" §2 (PD).","disclaimer":"Hellenistic doctrine per Schmidt + Project Hindsight translations. Schmidt's Stoic-philosophical recovery of original technical method."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/hellenistic/schmidt/ennea-mooirai":{"post":{"tags":["Hellenistic: Schmidt tradition"],"summary":"Ennea Mooirai","description":"Nine fates classification.","operationId":"hellenistic_schmidt_ennea-mooirai","x-quality":"green","x-source":"Robert Schmidt Project Hindsight 1990s-2010s: full Hellenistic translation series + Stoic philosophy frame.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/hellenistic/schmidt/ennea-mooirai \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/hellenistic/schmidt/ennea-mooirai', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/hellenistic/schmidt/ennea-mooirai',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('hellenistic/schmidt/ennea-mooirai', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"perPlanet":{"type":"array","items":{"type":"object","properties":{"planet":{"type":"string","nullable":true},"longitude":{"type":"number","nullable":true},"sign":{"type":"string","nullable":true},"degInSign":{"type":"number","nullable":true},"enneaIdx":{"type":"number","nullable":true},"enneaRange":{"type":"string","nullable":true},"enneaRuler":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"doctrine":{"type":"string","nullable":true},"source":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"perPlanet":[{"planet":"Sun","longitude":54.38,"sign":"Taurus","degInSign":24.38,"enneaIdx":8,"enneaRange":"23.33°-26.67°","enneaRuler":"Sun"}],"doctrine":"Ennea-mooirai (9-parts): each 30° sign divides into 9 sub-segments of ~3°20'. Each sub-ruled by a planet in a 7-planet cycle (with luminaries doubled to fit 9). Schmidt linked this to Stoic time-quanta, finer-grained essential dignity.","source":"Manilius \"Astronomica\" Book III (PD Latin) + Schmidt commentary in Project Hindsight.","disclaimer":"Hellenistic doctrine per Schmidt + Project Hindsight translations. Schmidt's Stoic-philosophical recovery of original technical method."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/modern/greene/archetypal-figures":{"post":{"tags":["Modern Psychological"],"summary":"Greene: Archetypal Figures","description":"Archetypal patterns in the chart per Liz Greene.","operationId":"modern_greene_archetypal-figures","x-quality":"green","x-source":"Liz Greene (Greene endpoints) + Stephen Arroyo \"Astrology, Psychology & the Four Elements\" 1975 (Arroyo) + Dane Rudhyar \"The Astrological Houses\" 1972 + Lunation Cycle 1967 (Rudhyar).","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/modern/greene/archetypal-figures \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/modern/greene/archetypal-figures', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/modern/greene/archetypal-figures',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('modern/greene/archetypal-figures', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"figures":{"type":"array","items":{"type":"object","properties":{"planet":{"type":"string","nullable":true},"archetype":{"type":"string","nullable":true},"sign":{"type":"string","nullable":true},"signElement":{"type":"string","nullable":true},"signModality":{"type":"string","nullable":true},"flavour":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"doctrine":{"type":"string","nullable":true},"source":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"figures":[{"planet":"Sun","archetype":"Hero / Self: the conscious centre","sign":"Taurus","signElement":"Earth","signModality":"Fixed","flavour":"Hero / Self expressed through Taurus"}],"doctrine":"Greene mapped Jungian archetypes onto natal planets. The sign each planet sits in colours how that archetype expresses. Activations (transits/progressions) mobilise the corresponding archetype.","source":"Liz Greene \"Apollo's Chariot\" CPA Press lectures + Carl Jung \"The Archetypes and the Collective Unconscious\" 1959.","disclaimer":"Psychological-astrology models are interpretive lenses, not clinical or diagnostic tools."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/modern/greene/parental-imagos":{"post":{"tags":["Modern Psychological"],"summary":"Greene: Parental Imagos","description":"Parental imagos analysis.","operationId":"modern_greene_parental-imagos","x-quality":"green","x-source":"Liz Greene (Greene endpoints) + Stephen Arroyo \"Astrology, Psychology & the Four Elements\" 1975 (Arroyo) + Dane Rudhyar \"The Astrological Houses\" 1972 + Lunation Cycle 1967 (Rudhyar).","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/modern/greene/parental-imagos \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/modern/greene/parental-imagos', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/modern/greene/parental-imagos',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('modern/greene/parental-imagos', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"interiorParent":{"type":"object","properties":{"house":{"type":"number","nullable":true},"cuspSign":{"type":"string","nullable":true},"cuspRuler":{"type":"string","nullable":true},"planetsIn":{"type":"array","items":{},"nullable":true}},"nullable":true},"exteriorParent":{"type":"object","properties":{"house":{"type":"number","nullable":true},"cuspSign":{"type":"string","nullable":true},"cuspRuler":{"type":"string","nullable":true},"planetsIn":{"type":"array","items":{"type":"object","properties":{"planet":{"type":"string","nullable":true},"sign":{"type":"string","nullable":true}},"nullable":true},"nullable":true}},"nullable":true},"shadowMarkers":{"type":"object","properties":{"fatherImago":{"nullable":true},"motherImago":{"type":"string","nullable":true}},"nullable":true},"doctrine":{"type":"string","nullable":true},"source":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"interiorParent":{"house":4,"cuspSign":"Sagittarius","cuspRuler":"Jupiter","planetsIn":[]},"exteriorParent":{"house":10,"cuspSign":"Gemini","cuspRuler":"Mercury","planetsIn":[{"planet":"Jupiter","sign":"Cancer"}]},"shadowMarkers":{"fatherImago":null,"motherImago":"Saturn-Moon contact (orb 1.7°): controlling/withholding mother imago"},"doctrine":"Greene 1985: 4H/10H reveal \"imagos\", internalised parental archetypes that shape the native's relational pattern. Saturn contacts to luminaries colour the imago with discipline / restriction / authority.","source":"Liz Greene \"The Astrology of Family Patterns\" 1995 + \"Saturn\" 1976.","disclaimer":"Psychological-astrology models are interpretive lenses, not clinical or diagnostic tools."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/modern/greene/saturn-shadow":{"post":{"tags":["Modern Psychological"],"summary":"Greene: Saturn Shadow","description":"Saturn-as-shadow integration work.","operationId":"modern_greene_saturn-shadow","x-quality":"green","x-source":"Liz Greene (Greene endpoints) + Stephen Arroyo \"Astrology, Psychology & the Four Elements\" 1975 (Arroyo) + Dane Rudhyar \"The Astrological Houses\" 1972 + Lunation Cycle 1967 (Rudhyar).","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/modern/greene/saturn-shadow \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/modern/greene/saturn-shadow', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/modern/greene/saturn-shadow',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('modern/greene/saturn-shadow', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"saturn":{"type":"object","properties":{"sign":{"type":"string","nullable":true},"house":{"type":"number","nullable":true},"retrograde":{"type":"boolean","nullable":true}},"nullable":true},"shadowTheme":{"type":"string","nullable":true},"integrationPrompt":{"type":"string","nullable":true},"doctrine":{"type":"string","nullable":true},"source":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"saturn":{"sign":"Capricorn","house":5,"retrograde":true},"shadowTheme":"fear of authority / responsibility → workaholism or rebellion","integrationPrompt":"Build authority from within, not by inheriting external structure.","doctrine":"Greene 1976: Saturn marks the \"frontier of consciousness\", where ego meets fear and limitation. Integration of Saturn's shadow is core developmental work; rejection produces compulsive opposite expression.","source":"Liz Greene \"Saturn: A New Look at an Old Devil\" 1976.","disclaimer":"Psychological-astrology models are interpretive lenses, not clinical or diagnostic tools."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/modern/greene/lunar-myth":{"post":{"tags":["Modern Psychological"],"summary":"Greene: Lunar Myth","description":"Lunar archetypes by sign and house.","operationId":"modern_greene_lunar-myth","x-quality":"green","x-source":"Liz Greene (Greene endpoints) + Stephen Arroyo \"Astrology, Psychology & the Four Elements\" 1975 (Arroyo) + Dane Rudhyar \"The Astrological Houses\" 1972 + Lunation Cycle 1967 (Rudhyar).","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/modern/greene/lunar-myth \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/modern/greene/lunar-myth', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/modern/greene/lunar-myth',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('modern/greene/lunar-myth', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"moon":{"type":"object","properties":{"sign":{"type":"string","nullable":true},"longitude":{"type":"number","nullable":true}},"nullable":true},"mythicFigure":{"type":"string","nullable":true},"theme":{"type":"string","nullable":true},"shadow":{"type":"string","nullable":true},"doctrine":{"type":"string","nullable":true},"source":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"moon":{"sign":"Capricorn","longitude":296.9},"mythicFigure":"Kybele / Black Madonna","theme":"severe/structured emotion","shadow":"emotional self-denial","doctrine":"Greene mapped the Moon by sign to mythic mother / feminine figures. The Moon's sign is more than emotional style: it's a mythic narrative the native lives.","source":"Liz Greene \"The Mythic Moon\" CPA Press lectures + Greene & Sasportas \"The Inner Planets\" 1993.","disclaimer":"Psychological-astrology models are interpretive lenses, not clinical or diagnostic tools."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/modern/greene/individuation-path":{"post":{"tags":["Modern Psychological"],"summary":"Greene: Individuation Path","description":"Individuation arc per natal chart.","operationId":"modern_greene_individuation-path","x-quality":"green","x-source":"Liz Greene (Greene endpoints) + Stephen Arroyo \"Astrology, Psychology & the Four Elements\" 1975 (Arroyo) + Dane Rudhyar \"The Astrological Houses\" 1972 + Lunation Cycle 1967 (Rudhyar).","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/modern/greene/individuation-path \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/modern/greene/individuation-path', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/modern/greene/individuation-path',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('modern/greene/individuation-path', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"individuationMarkers":{"type":"array","items":{},"nullable":true},"keyAges":{"type":"array","items":{"type":"object","properties":{"age":{"type":"string","nullable":true},"event":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"doctrine":{"type":"string","nullable":true},"source":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"individuationMarkers":[],"keyAges":[{"age":"27-30","event":"First Saturn return: emergence of authentic self"}],"doctrine":"Greene framed the chart as a map of individuation, the Jungian process of becoming whole. Outer-planet contacts to luminaries + nodes + Chiron mark the most active individuation themes; mid-life transits trigger the deepest re-organisation.","source":"Liz Greene \"The Outer Planets and Their Cycles\" 1983 + Carl Jung \"Memories, Dreams, Reflections\" 1962.","disclaimer":"Psychological-astrology models are interpretive lenses, not clinical or diagnostic tools."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/modern/arroyo/element-balance":{"post":{"tags":["Modern Psychological"],"summary":"Arroyo: Element Balance","description":"Element distribution and integration.","operationId":"modern_arroyo_element-balance","x-quality":"green","x-source":"Liz Greene (Greene endpoints) + Stephen Arroyo \"Astrology, Psychology & the Four Elements\" 1975 (Arroyo) + Dane Rudhyar \"The Astrological Houses\" 1972 + Lunation Cycle 1967 (Rudhyar).","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/modern/arroyo/element-balance \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/modern/arroyo/element-balance', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/modern/arroyo/element-balance',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('modern/arroyo/element-balance', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"counts":{"type":"object","properties":{"Fire":{"type":"number","nullable":true},"Earth":{"type":"number","nullable":true},"Air":{"type":"number","nullable":true},"Water":{"type":"number","nullable":true},"total":{"type":"number","nullable":true}},"nullable":true},"dominantElement":{"type":"string","nullable":true},"deficientElement":{"type":"object","properties":{"element":{"type":"string","nullable":true},"count":{"type":"number","nullable":true}},"nullable":true},"doctrine":{"type":"string","nullable":true},"source":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"counts":{"Fire":1,"Earth":4,"Air":0,"Water":2,"total":7},"dominantElement":"Earth","deficientElement":{"element":"Air","count":0},"doctrine":"Arroyo 1975: the elemental balance is the chart's primary psychological signature. Dominant element = how the native is built; deficient element = where growth is needed.","source":"Stephen Arroyo \"Astrology, Psychology, and the Four Elements\" 1975.","disclaimer":"Psychological-astrology models are interpretive lenses, not clinical or diagnostic tools."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/modern/arroyo/element-integration":{"post":{"tags":["Modern Psychological"],"summary":"Arroyo: Element Integration","description":"Strategies for integrating weak elements.","operationId":"modern_arroyo_element-integration","x-quality":"green","x-source":"Liz Greene (Greene endpoints) + Stephen Arroyo \"Astrology, Psychology & the Four Elements\" 1975 (Arroyo) + Dane Rudhyar \"The Astrological Houses\" 1972 + Lunation Cycle 1967 (Rudhyar).","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/modern/arroyo/element-integration \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/modern/arroyo/element-integration', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/modern/arroyo/element-integration',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('modern/arroyo/element-integration', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"counts":{"type":"object","properties":{"Fire":{"type":"number","nullable":true},"Earth":{"type":"number","nullable":true},"Air":{"type":"number","nullable":true},"Water":{"type":"number","nullable":true},"total":{"type":"number","nullable":true}},"nullable":true},"recommendations":{"type":"array","items":{"type":"object","properties":{"element":{"type":"string","nullable":true},"status":{"type":"string","nullable":true},"temptation":{"type":"string","nullable":true},"counterbalance":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"doctrine":{"type":"string","nullable":true},"source":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"counts":{"Fire":1,"Earth":4,"Air":0,"Water":2,"total":7},"recommendations":[{"element":"Earth","status":"over-emphasised","temptation":"Earth dominance can over-saturate. Risk: imbalanced reliance on security.","counterbalance":"Practice the deficient element to integrate."}],"doctrine":"Arroyo 1989: integration = balancing the elements through deliberate practice. Deficiency in an element marks the developmental edge; over-emphasis marks compensatory over-reliance.","source":"Stephen Arroyo \"Chart Interpretation Handbook\" 1989.","disclaimer":"Psychological-astrology models are interpretive lenses, not clinical or diagnostic tools."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/modern/arroyo/cycle-of-becoming":{"post":{"tags":["Modern Psychological"],"summary":"Arroyo: Cycle of Becoming","description":"Arroyo's evolutionary cycle.","operationId":"modern_arroyo_cycle-of-becoming","x-quality":"green","x-source":"Liz Greene (Greene endpoints) + Stephen Arroyo \"Astrology, Psychology & the Four Elements\" 1975 (Arroyo) + Dane Rudhyar \"The Astrological Houses\" 1972 + Lunation Cycle 1967 (Rudhyar).","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/modern/arroyo/cycle-of-becoming \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/modern/arroyo/cycle-of-becoming', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/modern/arroyo/cycle-of-becoming',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('modern/arroyo/cycle-of-becoming', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"currentAge":{"type":"number","nullable":true},"currentPhase":{"type":"object","properties":{"phase":{"type":"string","nullable":true},"ageRange":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"task":{"type":"string","nullable":true}},"nullable":true},"fullCycle":{"type":"array","items":{"type":"object","properties":{"phase":{"type":"string","nullable":true},"ageRange":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"task":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"doctrine":{"type":"string","nullable":true},"source":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"currentAge":36.3,"currentPhase":{"phase":"Mid-life","ageRange":"35-55","element":"Air","task":"integration, reflection, communication of accumulated experience"},"fullCycle":[{"phase":"Childhood","ageRange":"0-13","element":"Water","task":"emotional formation, attachment, primary nurturing"}],"doctrine":"Arroyo 1979: development unfolds through 5 elemental phases. Each phase has a primary task; transition friction often shows up at phase boundaries (~13, 21, 35, 55).","source":"Stephen Arroyo \"Relationships and Life Cycles\" 1979.","disclaimer":"Psychological-astrology models are interpretive lenses, not clinical or diagnostic tools."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/modern/arroyo/water-houses-trauma":{"post":{"tags":["Modern Psychological"],"summary":"Arroyo: Water Houses Trauma","description":"Water-house trauma patterns.","operationId":"modern_arroyo_water-houses-trauma","x-quality":"green","x-source":"Liz Greene (Greene endpoints) + Stephen Arroyo \"Astrology, Psychology & the Four Elements\" 1975 (Arroyo) + Dane Rudhyar \"The Astrological Houses\" 1972 + Lunation Cycle 1967 (Rudhyar).","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/modern/arroyo/water-houses-trauma \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/modern/arroyo/water-houses-trauma', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/modern/arroyo/water-houses-trauma',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('modern/arroyo/water-houses-trauma', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"h4_roots":{"type":"object","properties":{"sign":{"type":"string","nullable":true},"planets":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"theme":{"type":"string","nullable":true}},"nullable":true},"h8_shared":{"type":"object","properties":{"sign":{"type":"string","nullable":true},"planets":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"theme":{"type":"string","nullable":true}},"nullable":true},"h12_unconscious":{"type":"object","properties":{"sign":{"type":"string","nullable":true},"planets":{"type":"array","items":{},"nullable":true},"theme":{"type":"string","nullable":true}},"nullable":true},"totalPlanetsInWater":{"type":"number","nullable":true},"doctrine":{"type":"string","nullable":true},"source":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"h4_roots":{"sign":"Sagittarius","planets":["Neptune"],"theme":"family imprint, emotional foundations, ancestral material"},"h8_shared":{"sign":"Aries","planets":["Mercury"],"theme":"shared resources, intimacy, transformation, death-themes"},"h12_unconscious":{"sign":"Leo","planets":[],"theme":"unconscious, suffering, dissolution, hidden patterns"},"totalPlanetsInWater":2,"doctrine":"Arroyo: the water-house trine (4/8/12) holds the chart's emotional + ancestral landscape. Heavy water-house tenancy → emotionally laden biography; outer planets here = generational trauma signatures.","source":"Stephen Arroyo \"Chart Interpretation Handbook\" 1989 §6 + \"Astrology, Karma & Transformation\" 1978.","disclaimer":"Psychological-astrology models are interpretive lenses, not clinical or diagnostic tools."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/modern/arroyo/relational-element-map":{"post":{"tags":["Modern Psychological"],"summary":"Arroyo: Relational Map","description":"Relational element compatibility map.","operationId":"modern_arroyo_relational-element-map","x-quality":"green","x-source":"Liz Greene (Greene endpoints) + Stephen Arroyo \"Astrology, Psychology & the Four Elements\" 1975 (Arroyo) + Dane Rudhyar \"The Astrological Houses\" 1972 + Lunation Cycle 1967 (Rudhyar).","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/modern/arroyo/relational-element-map \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/modern/arroyo/relational-element-map', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/modern/arroyo/relational-element-map',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('modern/arroyo/relational-element-map', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"yourDominant":{"type":"string","nullable":true},"synergyWith":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"tensionWith":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"partnerSeeking":{"type":"string","nullable":true},"doctrine":{"type":"string","nullable":true},"source":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"yourDominant":"Earth","synergyWith":["Earth"],"tensionWith":["Fire"],"partnerSeeking":"Look for partners whose chart emphasises Water (nurturing) or Earth (resonant) for natural rhythm.","doctrine":"Arroyo 1979: element compatibility is the deepest layer of relational fit. Fire+Air and Earth+Water are mutually supportive pairs; cross-pair contact requires conscious bridge-building.","source":"Stephen Arroyo \"Relationships and Life Cycles\" 1979 §4.","disclaimer":"Psychological-astrology models are interpretive lenses, not clinical or diagnostic tools."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/modern/rudhyar/lunation-phase":{"post":{"tags":["Modern Psychological"],"summary":"Rudhyar: Lunation Phase","description":"8-phase lunation classification.","operationId":"modern_rudhyar_lunation-phase","x-quality":"green","x-source":"Liz Greene (Greene endpoints) + Stephen Arroyo \"Astrology, Psychology & the Four Elements\" 1975 (Arroyo) + Dane Rudhyar \"The Astrological Houses\" 1972 + Lunation Cycle 1967 (Rudhyar).","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/modern/rudhyar/lunation-phase \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/modern/rudhyar/lunation-phase', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/modern/rudhyar/lunation-phase',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('modern/rudhyar/lunation-phase', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"phase":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"phase":"Crescent"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/modern/rudhyar/symbolic-degrees":{"post":{"tags":["Modern Psychological"],"summary":"Rudhyar: Symbolic Degrees","description":"Symbolic-degree analysis.","operationId":"modern_rudhyar_symbolic-degrees","x-quality":"green","x-source":"Liz Greene (Greene endpoints) + Stephen Arroyo \"Astrology, Psychology & the Four Elements\" 1975 (Arroyo) + Dane Rudhyar \"The Astrological Houses\" 1972 + Lunation Cycle 1967 (Rudhyar).","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/modern/rudhyar/symbolic-degrees \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/modern/rudhyar/symbolic-degrees', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/modern/rudhyar/symbolic-degrees',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('modern/rudhyar/symbolic-degrees', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"perPlanet":{"type":"array","items":{"type":"object","properties":{"planet":{"type":"string","nullable":true},"longitude":{"type":"number","nullable":true},"sabianSymbolIdx":{"type":"number","nullable":true},"sabianSignAndDegree":{"type":"string","nullable":true},"ref":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"doctrine":{"type":"string","nullable":true},"ackNote":{"type":"string","nullable":true},"source":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"perPlanet":[{"planet":"Sun","longitude":54.38,"sabianSymbolIdx":55,"sabianSignAndDegree":"Taurus 25°","ref":"Rudhyar 1973 \"An Astrological Mandala\" §55"}],"doctrine":"Rudhyar 1973: each of the 360 zodiacal degrees has a unique symbol. A natal placement carries its symbol's archetype as a \"keynote\" of expression.","ackNote":"Sabian Symbol full text not bundled in API output to respect copyright. Use the symbolIdx (1-360) to look up the symbol in any Sabian reference.","source":"Dane Rudhyar \"An Astrological Mandala: The Cycle of Transformations and its 360 Symbolic Phases\" 1973 (Random House).","disclaimer":"Psychological-astrology models are interpretive lenses, not clinical or diagnostic tools."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/modern/rudhyar/cycles-of-becoming":{"post":{"tags":["Modern Psychological"],"summary":"Rudhyar: Cycles of Becoming","description":"Outer-planet cycles as becoming.","operationId":"modern_rudhyar_cycles-of-becoming","x-quality":"green","x-source":"Liz Greene (Greene endpoints) + Stephen Arroyo \"Astrology, Psychology & the Four Elements\" 1975 (Arroyo) + Dane Rudhyar \"The Astrological Houses\" 1972 + Lunation Cycle 1967 (Rudhyar).","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/modern/rudhyar/cycles-of-becoming \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/modern/rudhyar/cycles-of-becoming', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/modern/rudhyar/cycles-of-becoming',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('modern/rudhyar/cycles-of-becoming', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"currentAge":{"type":"number","nullable":true},"cycles":{"type":"array","items":{"type":"object","properties":{"planet":{"type":"string","nullable":true},"period":{"type":"number","nullable":true},"cyclesCompleted":{"type":"number","nullable":true},"currentPhaseDegree":{"type":"number","nullable":true},"currentPhase":{"type":"string","nullable":true},"theme":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"doctrine":{"type":"string","nullable":true},"source":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"currentAge":36.3,"cycles":[{"planet":"Saturn","period":29.5,"cyclesCompleted":1,"currentPhaseDegree":82.7,"currentPhase":"first quarter (build)","theme":"structure-building, responsibility"}],"doctrine":"Rudhyar 1936: life is a multi-layered fabric of cycles. Each planetary cycle has a quaternary structure (build/refine/challenge/release). Position within each cycle marks the phase of that cycle's task.","source":"Dane Rudhyar \"The Astrology of Personality\" 1936 + \"Cycles of Becoming\" 1969.","disclaimer":"Psychological-astrology models are interpretive lenses, not clinical or diagnostic tools."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/modern/rudhyar/personality-keynote":{"post":{"tags":["Modern Psychological"],"summary":"Rudhyar: Personality Keynote","description":"Single-keynote signature for the chart.","operationId":"modern_rudhyar_personality-keynote","x-quality":"green","x-source":"Liz Greene (Greene endpoints) + Stephen Arroyo \"Astrology, Psychology & the Four Elements\" 1975 (Arroyo) + Dane Rudhyar \"The Astrological Houses\" 1972 + Lunation Cycle 1967 (Rudhyar).","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/modern/rudhyar/personality-keynote \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/modern/rudhyar/personality-keynote', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/modern/rudhyar/personality-keynote',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('modern/rudhyar/personality-keynote', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"keynote":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"keynote":"..."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/modern/rudhyar/transits-as-rebirth":{"post":{"tags":["Modern Psychological"],"summary":"Rudhyar: Transits as Rebirth","description":"Reframe major transits as rebirth.","operationId":"modern_rudhyar_transits-as-rebirth","x-quality":"green","x-source":"Liz Greene (Greene endpoints) + Stephen Arroyo \"Astrology, Psychology & the Four Elements\" 1975 (Arroyo) + Dane Rudhyar \"The Astrological Houses\" 1972 + Lunation Cycle 1967 (Rudhyar).","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/modern/rudhyar/transits-as-rebirth \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/modern/rudhyar/transits-as-rebirth', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/modern/rudhyar/transits-as-rebirth',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('modern/rudhyar/transits-as-rebirth', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"rebirthThemes":{"type":"array","items":{"type":"object","properties":{"transitPlanet":{"type":"string","nullable":true},"period":{"type":"number","nullable":true},"frequencies":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"rebirthTheme":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"natalRebirthSignatures":{"type":"array","items":{"type":"object","properties":{"contact":{"type":"string","nullable":true},"orb":{"type":"number","nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"doctrine":{"type":"string","nullable":true},"source":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"rebirthThemes":[{"transitPlanet":"Saturn","period":29.5,"frequencies":["Saturn return ~29 / ~58 / ~87"],"rebirthTheme":"crystallisation of self-authority: re-birth through discipline + chosen limits"}],"natalRebirthSignatures":[{"contact":"Moon ↔ Saturn","orb":1.65,"meaning":"built-in re-birth signature in emotional arena via Saturn"}],"doctrine":"Rudhyar reframed transits from \"fate\" to \"evolutionary opportunity\". Each major transit = an invitation to re-birth into a more whole expression. Natal outer-planet contacts to luminaries indicate built-in re-birth signatures.","source":"Dane Rudhyar \"The Astrology of Personality\" 1936 + \"Astrological Aspects\" 1980.","disclaimer":"Psychological-astrology models are interpretive lenses, not clinical or diagnostic tools."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/evolutionary/pluto-natal-condition":{"post":{"tags":["Evolutionary Astrology"],"summary":"Pluto Natal Condition","description":"JWG: Pluto sign+house+ruler+hard aspects.","operationId":"evolutionary_pluto-natal-condition","x-quality":"green","x-source":"Jeffrey Wolf Green \"Pluto Vol I/II\" 1985/1997 + Steven Forrest \"Yesterday's Sky\" 2008 + School of Evolutionary Astrology lectures.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/evolutionary/pluto-natal-condition \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/evolutionary/pluto-natal-condition', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/evolutionary/pluto-natal-condition',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('evolutionary/pluto-natal-condition', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"pluto":{"type":"object","properties":{"longitude":{"type":"number","nullable":true},"sign":{"type":"string","nullable":true},"house":{"type":"number","nullable":true},"retrograde":{"type":"boolean","nullable":true},"signTheme":{"type":"string","nullable":true},"houseTheme":{"type":"string","nullable":true}},"nullable":true},"ruler":{"type":"object","properties":{"planet":{"type":"string","nullable":true},"sign":{"type":"string","nullable":true},"house":{"type":"number","nullable":true}},"nullable":true},"hardAspects":{"type":"array","items":{},"nullable":true},"pastLifeSignificance":{"type":"string","nullable":true},"doctrine":{"type":"string","nullable":true},"source":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"pluto":{"longitude":226.17,"sign":"Scorpio","house":3,"retrograde":true,"signTheme":"depth / transformation","houseTheme":"communication"},"ruler":{"planet":"Pluto","sign":"Scorpio","house":3},"hardAspects":[],"pastLifeSignificance":"Past-life imprint coloured by Scorpio (depth / transformation) expressed in communication. Hard aspects (0) mark active karmic frontiers.","doctrine":"JWG 1985: Pluto's natal sign + house = the SOUL'S past-life signature. The Pluto-ruler placement shows where the soul brings unfinished work; hard aspects mark karmic frontiers requiring active integration.","source":"Jeffrey Wolf Green \"Pluto: The Evolutionary Journey of the Soul\" Vol I 1985.","disclaimer":"Evolutionary astrology is interpretive: past-life and karmic readings are reflective frameworks, not historical claims. Methodology per Jeffrey Wolf Green + Steven Forrest."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/evolutionary/skipped-steps":{"post":{"tags":["Evolutionary Astrology"],"summary":"Skipped Steps","description":"Planets squaring nodal axis = unfinished karma.","operationId":"evolutionary_skipped-steps","x-quality":"green","x-source":"Jeffrey Wolf Green \"Pluto Vol I/II\" 1985/1997 + Steven Forrest \"Yesterday's Sky\" 2008 + School of Evolutionary Astrology lectures.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/evolutionary/skipped-steps \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/evolutionary/skipped-steps', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/evolutionary/skipped-steps',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('evolutionary/skipped-steps', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"nodalAxis":{"type":"object","properties":{"northNode":{"type":"object","properties":{"longitude":{"type":"number","nullable":true},"sign":{"type":"string","nullable":true}},"nullable":true},"southNode":{"type":"object","properties":{"longitude":{"type":"number","nullable":true},"sign":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"skippedSteps":{"type":"array","items":{"type":"object","properties":{"planet":{"type":"string","nullable":true},"sign":{"type":"string","nullable":true},"house":{"type":"number","nullable":true},"squareTo":{"type":"string","nullable":true},"orb":{"type":"number","nullable":true},"unfinishedTheme":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"count":{"type":"number","nullable":true},"doctrine":{"type":"string","nullable":true},"source":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"nodalAxis":{"northNode":{"longitude":310.26,"sign":"Aquarius"},"southNode":{"longitude":130.26,"sign":"Leo"}},"skippedSteps":[{"planet":"Mercury","sign":"Taurus","house":8,"squareTo":"SN","orb":2.24,"unfinishedTheme":"Mercury in Taurus: work begun in past-life patterns (SN) requires re-engagement."}],"count":1,"doctrine":"JWG \"skipped steps\": planets squaring the nodal axis (within ±5°) mark karmic work begun in past lives but not completed. The current life requires re-engaging these themes: square = friction = \"the skip\".","source":"Jeffrey Wolf Green Lectures (School of Evolutionary Astrology) + JWG 1985 §6.","disclaimer":"Evolutionary astrology is interpretive: past-life and karmic readings are reflective frameworks, not historical claims. Methodology per Jeffrey Wolf Green + Steven Forrest."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/evolutionary/nodal-axis-detail":{"post":{"tags":["Evolutionary Astrology"],"summary":"Nodal Axis Detail","description":"Full NN/SN with rulers + conjuncts.","operationId":"evolutionary_nodal-axis-detail","x-quality":"green","x-source":"Jeffrey Wolf Green \"Pluto Vol I/II\" 1985/1997 + Steven Forrest \"Yesterday's Sky\" 2008 + School of Evolutionary Astrology lectures.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/evolutionary/nodal-axis-detail \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/evolutionary/nodal-axis-detail', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/evolutionary/nodal-axis-detail',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('evolutionary/nodal-axis-detail', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"northNode":{"type":"object","properties":{"sign":{"type":"string","nullable":true},"house":{"type":"number","nullable":true},"longitude":{"type":"number","nullable":true},"ruler":{"type":"string","nullable":true},"rulerSign":{"type":"string","nullable":true},"rulerHouse":{"type":"number","nullable":true},"evolutionaryDirection":{"type":"string","nullable":true},"conjunctPlanets":{"type":"array","items":{},"nullable":true}},"nullable":true},"southNode":{"type":"object","properties":{"sign":{"type":"string","nullable":true},"house":{"type":"number","nullable":true},"longitude":{"type":"number","nullable":true},"ruler":{"type":"string","nullable":true},"rulerSign":{"type":"string","nullable":true},"rulerHouse":{"type":"number","nullable":true},"pastLifeImprint":{"type":"string","nullable":true},"conjunctPlanets":{"type":"array","items":{},"nullable":true}},"nullable":true},"doctrine":{"type":"string","nullable":true},"source":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"northNode":{"sign":"Aquarius","house":5,"longitude":310.26,"ruler":"Uranus","rulerSign":"Capricorn","rulerHouse":4,"evolutionaryDirection":"Soul intent: develop community / innovation in the area of creativity. Ruler Uranus placement carries the biographical anchor.","conjunctPlanets":[]},"southNode":{"sign":"Leo","house":11,"longitude":130.26,"ruler":"Sun","rulerSign":"Taurus","rulerHouse":9,"pastLifeImprint":"Past-life pattern: visibility / creative authority in the area of community. Ruler Sun placement carries unintegrated karmic mass.","conjunctPlanets":[]},"doctrine":"JWG: the lunar nodal axis encodes evolutionary direction (NN) and past-life imprint (SN). Each node's RULER placement carries the biographical anchor for that pole. Planets conjunct either node carry the nodal energy actively into the life.","source":"JWG 1985 + 1997 + Forrest 2008 nodal-axis lineage.","disclaimer":"Evolutionary astrology is interpretive: past-life and karmic readings are reflective frameworks, not historical claims. Methodology per Jeffrey Wolf Green + Steven Forrest."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/evolutionary/soul-types":{"post":{"tags":["Evolutionary Astrology"],"summary":"Soul Types","description":"JWG's 4-type by Pluto house quadrant.","operationId":"evolutionary_soul-types","x-quality":"green","x-source":"Jeffrey Wolf Green \"Pluto Vol I/II\" 1985/1997 + Steven Forrest \"Yesterday's Sky\" 2008 + School of Evolutionary Astrology lectures.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/evolutionary/soul-types \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/evolutionary/soul-types', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/evolutionary/soul-types',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('evolutionary/soul-types', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"type":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"type":"Egocentric"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/evolutionary/yesterday-sky":{"post":{"tags":["Evolutionary Astrology"],"summary":"Yesterday's Sky","description":"Forrest 2008 past-life method.","operationId":"evolutionary_yesterday-sky","x-quality":"green","x-source":"Jeffrey Wolf Green \"Pluto Vol I/II\" 1985/1997 + Steven Forrest \"Yesterday's Sky\" 2008 + School of Evolutionary Astrology lectures.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/evolutionary/yesterday-sky \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/evolutionary/yesterday-sky', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/evolutionary/yesterday-sky',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('evolutionary/yesterday-sky', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"pastLifeImprint":{"type":"object","properties":{"southNode":{"type":"object","properties":{"sign":{"type":"string","nullable":true},"house":{"type":"number","nullable":true},"ruler":{"type":"string","nullable":true},"rulerSign":{"type":"string","nullable":true}},"nullable":true},"saturnAsKarmicTeacher":{"type":"object","properties":{"sign":{"type":"string","nullable":true},"house":{"type":"number","nullable":true},"theme":{"type":"string","nullable":true}},"nullable":true},"chironAsWound":{"type":"object","properties":{"sign":{"type":"string","nullable":true},"house":{"type":"number","nullable":true},"theme":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"luminaryContacts":{"type":"array","items":{"type":"object","properties":{"contact":{"type":"string","nullable":true},"orb":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"narrative":{"type":"string","nullable":true},"doctrine":{"type":"string","nullable":true},"source":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"pastLifeImprint":{"southNode":{"sign":"Leo","house":11,"ruler":"Sun","rulerSign":"Taurus"},"saturnAsKarmicTeacher":{"sign":"Capricorn","house":5,"theme":"Saturn in Capricorn H5: the discipline brought from before."},"chironAsWound":{"sign":"Cancer","house":10,"theme":"Chiron in Cancer H10: the wound brought from before."}},"luminaryContacts":[{"contact":"Moon ↔ Saturn","orb":1.65}],"narrative":"Past-life pattern: visibility / creative authority expressed through community; karmic teacher Saturn anchors the discipline in structure / mastery. Chiron carries the wound through Cancer. 1 outer-planet contacts to luminaries amplify the karmic load.","doctrine":"Forrest 2008 \"Yesterday's Sky\" method: synthesise SN + Saturn + Chiron + outer-planet luminary contacts into a unified past-life narrative. Forrest's lineage: humanistic-evolutionary, lighter than JWG, more biographically focused.","source":"Steven Forrest \"Yesterday's Sky\" 2008 + Forrest \"The Inner Sky\" 1989.","disclaimer":"Evolutionary astrology is interpretive: past-life and karmic readings are reflective frameworks, not historical claims. Methodology per Jeffrey Wolf Green + Steven Forrest."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/cosmobiology/dial-90":{"post":{"tags":["Cosmobiology / Hamburg School"],"summary":"90° Dial","description":"All chart points in 90° cardinal modulus.","operationId":"cosmobiology_dial-90","x-quality":"green","x-source":"Reinhold Ebertin \"Combination of Stellar Influences\" 1940 / English ed. AFA 1972 (ISBN 0-86690-087-6) + Alfred Witte \"Regelwerk für Planetenbilder\" 1928 + Ludwig Rudolph \"Werkbuch der Hamburger Schule\" 1956 + Ebertin Institut publications.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartWithTnp"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52,"withTnp":true}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/cosmobiology/dial-90 \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52, \"withTnp\": true }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/cosmobiology/dial-90', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52,\n    \"withTnp\": true\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/cosmobiology/dial-90',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52,\n      'withTnp': True\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('cosmobiology/dial-90', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n        'withTnp' => true,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"points":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","nullable":true},"id":{"type":"number","nullable":true},"longitude":{"type":"number","nullable":true},"longitude90":{"type":"number","nullable":true},"category":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"modulus":{"type":"number","nullable":true},"methodology":{"type":"string","nullable":true},"source":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"points":[{"name":"Sun","id":0,"longitude":54.376019801671816,"longitude90":54.376019801671816,"category":"planet"}],"modulus":90,"methodology":"Cardinal compression: longitudes mod 90° (Ebertin 1940 §1). 8th-harmonic aspects (45°/22.5°) become conjunctions on the 90° dial.","source":"Ebertin \"Combination of Stellar Influences\" 1940/1972 (AFA English ed., ISBN 0-86690-087-6) + Witte \"Regelwerk\" 1928 + Ebertin Institut current publications"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/cosmobiology/midpoint-pictures":{"post":{"tags":["Cosmobiology / Hamburg School"],"summary":"Midpoint Pictures","description":"A=B/C structures with sentence form.","operationId":"cosmobiology_midpoint-pictures","x-quality":"green","x-source":"Reinhold Ebertin \"Combination of Stellar Influences\" 1940 / English ed. AFA 1972 (ISBN 0-86690-087-6) + Alfred Witte \"Regelwerk für Planetenbilder\" 1928 + Ludwig Rudolph \"Werkbuch der Hamburger Schule\" 1956 + Ebertin Institut publications.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartWithTnp"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52,"orb":1.5}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/cosmobiology/midpoint-pictures \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52, \"orb\": 1.5 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/cosmobiology/midpoint-pictures', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52,\n    \"orb\": 1.5\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/cosmobiology/midpoint-pictures',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52,\n      'orb': 1.5\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('cosmobiology/midpoint-pictures', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n        'orb' => 1.5,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"orb":{"type":"number","nullable":true},"count":{"type":"number","nullable":true},"pictures":{"type":"array","items":{"type":"object","properties":{"formula":{"type":"string","nullable":true},"pointA":{"type":"string","nullable":true},"pointB":{"type":"string","nullable":true},"pointC":{"type":"string","nullable":true},"midpointLongitude":{"type":"number","nullable":true},"midpointLongitude90":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true},"sentence":{"type":"string","nullable":true},"keywords":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"notation":{"type":"string","nullable":true},"source":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"orb":1.5,"count":59,"pictures":[{"formula":"Pluto = Sun/Mercury","pointA":"Pluto","pointB":"Sun","pointC":"Mercury","midpointLongitude":46.19550314429239,"midpointLongitude90":46.19550314429239,"orb":0.0275,"sentence":"Pluto stands on the midpoint of Sun and Mercury.","keywords":"transformation, power via will, vitality & thought, exchange"}],"notation":"A = B/C: A stands on midpoint of B and C in 90° dial.","source":"Ebertin \"Combination of Stellar Influences\" 1940/1972 (AFA English ed., ISBN 0-86690-087-6) + Witte \"Regelwerk\" 1928 + Ebertin Institut current publications"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/cosmobiology/sensitive-points":{"post":{"tags":["Cosmobiology / Hamburg School"],"summary":"Sensitive Points","description":"Ebertin's personal points midpoint hits.","operationId":"cosmobiology_sensitive-points","x-quality":"green","x-source":"Reinhold Ebertin \"Combination of Stellar Influences\" 1940 / English ed. AFA 1972 (ISBN 0-86690-087-6) + Alfred Witte \"Regelwerk für Planetenbilder\" 1928 + Ludwig Rudolph \"Werkbuch der Hamburger Schule\" 1956 + Ebertin Institut publications.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartWithTnp"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/cosmobiology/sensitive-points \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/cosmobiology/sensitive-points', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/cosmobiology/sensitive-points',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('cosmobiology/sensitive-points', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"orb":{"type":"number","nullable":true},"personalPoints":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","nullable":true},"longitude":{"type":"number","nullable":true},"longitude90":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"pictures":{"type":"array","items":{"type":"object","properties":{"formula":{"type":"string","nullable":true},"pointA":{"type":"string","nullable":true},"pointB":{"type":"string","nullable":true},"pointC":{"type":"string","nullable":true},"midpointLongitude":{"type":"number","nullable":true},"midpointLongitude90":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true},"sentence":{"type":"string","nullable":true},"keywords":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"methodology":{"type":"string","nullable":true},"source":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"orb":1.5,"personalPoints":[{"name":"Sun","longitude":54.376019801671816,"longitude90":54.376019801671816}],"pictures":[{"formula":"Pluto = Sun/Mercury","pointA":"Pluto","pointB":"Sun","pointC":"Mercury","midpointLongitude":46.19550314429239,"midpointLongitude90":46.19550314429239,"orb":0.0275,"sentence":"Pluto stands on the midpoint of Sun and Mercury.","keywords":"transformation, power via will, vitality & thought, exchange"}],"methodology":"Ebertin §2: personal points (ASC/MC/Sun/Moon/Node) carry biographical relevance; midpoint structures involving them are first-priority.","source":"Ebertin \"Combination of Stellar Influences\" 1940/1972 (AFA English ed., ISBN 0-86690-087-6) + Witte \"Regelwerk\" 1928 + Ebertin Institut current publications"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/cosmobiology/eight-harmonic-aspects":{"post":{"tags":["Cosmobiology / Hamburg School"],"summary":"8H Aspect Grid","description":"22.5° / 45° / 67.5° / 90° / 135° aspects.","operationId":"cosmobiology_eight-harmonic-aspects","x-quality":"green","x-source":"Reinhold Ebertin \"Combination of Stellar Influences\" 1940 / English ed. AFA 1972 (ISBN 0-86690-087-6) + Alfred Witte \"Regelwerk für Planetenbilder\" 1928 + Ludwig Rudolph \"Werkbuch der Hamburger Schule\" 1956 + Ebertin Institut publications.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartWithTnp"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/cosmobiology/eight-harmonic-aspects \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/cosmobiology/eight-harmonic-aspects', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/cosmobiology/eight-harmonic-aspects',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('cosmobiology/eight-harmonic-aspects', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"orb":{"type":"number","nullable":true},"angles":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"aspectNames":{"type":"object","properties":{"0":{"type":"string","nullable":true},"45":{"type":"string","nullable":true},"90":{"type":"string","nullable":true},"135":{"type":"string","nullable":true},"180":{"type":"string","nullable":true},"22.5":{"type":"string","nullable":true},"67.5":{"type":"string","nullable":true},"112.5":{"type":"string","nullable":true},"157.5":{"type":"string","nullable":true}},"nullable":true},"count":{"type":"number","nullable":true},"aspects":{"type":"array","items":{"type":"object","properties":{"body1":{"type":"string","nullable":true},"body2":{"type":"string","nullable":true},"angle":{"type":"number","nullable":true},"exactAngle":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true},"aspectName":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"methodology":{"type":"string","nullable":true},"source":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"orb":1.5,"angles":[0],"aspectNames":{"0":"conjunction","45":"semi-square","90":"square","135":"sesqui-square","180":"opposition","22.5":"semi-octile","67.5":"sesqui-octile","112.5":"sesqui-octile","157.5":"semi-octile"},"count":22,"aspects":[{"body1":"ASC","body2":"DSC","angle":180,"exactAngle":180,"orb":0,"aspectName":"opposition"}],"methodology":"Ebertin worked exclusively with 8th-harmonic series: 0/22.5/45/67.5/90/112.5/135/157.5/180.","source":"Ebertin \"Combination of Stellar Influences\" 1940/1972 (AFA English ed., ISBN 0-86690-087-6) + Witte \"Regelwerk\" 1928 + Ebertin Institut current publications"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/cosmobiology/transit-midpoints":{"post":{"tags":["Cosmobiology / Hamburg School"],"summary":"Transit Midpoints","description":"Transits hitting natal midpoints in 90° dial.","operationId":"cosmobiology_transit-midpoints","x-quality":"green","x-source":"Reinhold Ebertin \"Combination of Stellar Influences\" 1940 / English ed. AFA 1972 (ISBN 0-86690-087-6) + Alfred Witte \"Regelwerk für Planetenbilder\" 1928 + Ludwig Rudolph \"Werkbuch der Hamburger Schule\" 1956 + Ebertin Institut publications.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NatalTargetTnp"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52,"targetDate":"2026-06-15"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/cosmobiology/transit-midpoints \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52, \"targetDate\": \"2026-06-15\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/cosmobiology/transit-midpoints', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52,\n    \"targetDate\": \"2026-06-15\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/cosmobiology/transit-midpoints',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52,\n      'targetDate': \"2026-06-15\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('cosmobiology/transit-midpoints', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n        'targetDate' => '2026-06-15',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"targetDate":{"type":"string","nullable":true},"orb":{"type":"number","nullable":true},"count":{"type":"number","nullable":true},"hits":{"type":"array","items":{"type":"object","properties":{"transit":{"type":"string","nullable":true},"natalMidpointOf":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"midpointLongitude":{"type":"number","nullable":true},"midpointLongitude90":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"methodology":{"type":"string","nullable":true},"source":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"targetDate":"2026-06-15","orb":1,"count":55,"hits":[{"transit":"true Node","natalMidpointOf":["Mars"],"midpointLongitude":287.24317474848135,"midpointLongitude90":62.24317474848135,"orb":0.0292}],"methodology":"Transit body activates a natal midpoint axis when within 1° in 90° dial (Ebertin §1, transit orb).","source":"Ebertin \"Combination of Stellar Influences\" 1940/1972 (AFA English ed., ISBN 0-86690-087-6) + Witte \"Regelwerk\" 1928 + Ebertin Institut current publications"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/cosmobiology/uranian-tnps":{"post":{"tags":["Cosmobiology / Hamburg School"],"summary":"Uranian TNPs","description":"8 Hamburg trans-Neptunian bodies.","operationId":"cosmobiology_uranian-tnps","x-quality":"green","x-source":"Reinhold Ebertin \"Combination of Stellar Influences\" 1940 / English ed. AFA 1972 (ISBN 0-86690-087-6) + Alfred Witte \"Regelwerk für Planetenbilder\" 1928 + Ludwig Rudolph \"Werkbuch der Hamburger Schule\" 1956 + Ebertin Institut publications.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/cosmobiology/uranian-tnps \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/cosmobiology/uranian-tnps', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/cosmobiology/uranian-tnps',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('cosmobiology/uranian-tnps', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"count":{"type":"number","nullable":true},"tnps":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","nullable":true},"id":{"type":"number","nullable":true},"longitude":{"type":"number","nullable":true},"longitude90":{"type":"number","nullable":true},"latitude":{"type":"number","nullable":true},"sign":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"methodology":{"type":"string","nullable":true},"source":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"count":8,"tnps":[{"name":"Cupido","id":40,"longitude":229.58202320525834,"longitude90":49.58202320525834,"latitude":1.0882802986837847,"sign":"Scorpio"}],"methodology":"Eight Hamburg School TNPs from seorbel.txt (Witte 1925-1929 + Sieggrün 1934). Cupido(40), Hades(41), Zeus(42), Kronos(43), Apollon(44), Admetos(45), Vulcanus(46), Poseidon(47).","source":"Witte \"Regelwerk\" 1928 + Sieggrün additions 1934 + Swiss Ephemeris seorbel.txt"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/cosmobiology/cosmogram":{"post":{"tags":["Cosmobiology / Hamburg School"],"summary":"Cosmogram (90° Render Data)","description":"Ebertin cosmogram render data.","operationId":"cosmobiology_cosmogram","x-quality":"green","x-source":"Reinhold Ebertin \"Combination of Stellar Influences\" 1940 / English ed. AFA 1972 (ISBN 0-86690-087-6) + Alfred Witte \"Regelwerk für Planetenbilder\" 1928 + Ludwig Rudolph \"Werkbuch der Hamburger Schule\" 1956 + Ebertin Institut publications.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartWithTnp"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/cosmobiology/cosmogram \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/cosmobiology/cosmogram', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/cosmobiology/cosmogram',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('cosmobiology/cosmogram', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"modulus":{"type":"number","nullable":true},"ringDegrees":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"points":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","nullable":true},"category":{"type":"string","nullable":true},"position90":{"type":"number","nullable":true},"position360":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"aspects":{"type":"array","items":{"type":"object","properties":{"body1":{"type":"string","nullable":true},"body2":{"type":"string","nullable":true},"angle":{"type":"number","nullable":true},"exactAngle":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true},"aspectName":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"topPictures":{"type":"array","items":{"type":"object","properties":{"formula":{"type":"string","nullable":true},"pointA":{"type":"string","nullable":true},"pointB":{"type":"string","nullable":true},"pointC":{"type":"string","nullable":true},"midpointLongitude":{"type":"number","nullable":true},"midpointLongitude90":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true},"sentence":{"type":"string","nullable":true},"keywords":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"methodology":{"type":"string","nullable":true},"source":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"modulus":90,"ringDegrees":[0],"points":[{"name":"Sun","category":"planet","position90":54.376019801671816,"position360":54.376019801671816}],"aspects":[{"body1":"ASC","body2":"DSC","angle":180,"exactAngle":180,"orb":0,"aspectName":"opposition"}],"topPictures":[{"formula":"Pluto = Sun/Mercury","pointA":"Pluto","pointB":"Sun","pointC":"Mercury","midpointLongitude":46.19550314429239,"midpointLongitude90":46.19550314429239,"orb":0.0275,"sentence":"Pluto stands on the midpoint of Sun and Mercury.","keywords":"transformation, power via will, vitality & thought, exchange"}],"methodology":"Ebertin cosmogram: 90° wheel divided into 4 cardinal sectors of 22.5°. Hard aspects collapse to conjunctions, exposing structure invisible on 360° wheel.","source":"Ebertin \"Combination of Stellar Influences\" 1940/1972 (AFA English ed., ISBN 0-86690-087-6) + Witte \"Regelwerk\" 1928 + Ebertin Institut current publications"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/cosmobiology/witte-formulas":{"post":{"tags":["Cosmobiology / Hamburg School"],"summary":"Witte Formulas","description":"Witte planetary pictures A+B−C=D.","operationId":"cosmobiology_witte-formulas","x-quality":"green","x-source":"Reinhold Ebertin \"Combination of Stellar Influences\" 1940 / English ed. AFA 1972 (ISBN 0-86690-087-6) + Alfred Witte \"Regelwerk für Planetenbilder\" 1928 + Ludwig Rudolph \"Werkbuch der Hamburger Schule\" 1956 + Ebertin Institut publications.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartWithTnp"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/cosmobiology/witte-formulas \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/cosmobiology/witte-formulas', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/cosmobiology/witte-formulas',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('cosmobiology/witte-formulas', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"orb":{"type":"number","nullable":true},"count":{"type":"number","nullable":true},"pictures":{"type":"array","items":{"type":"object","properties":{"formula":{"type":"string","nullable":true},"bodyA":{"type":"string","nullable":true},"bodyB":{"type":"string","nullable":true},"bodyC":{"type":"string","nullable":true},"bodyD":{"type":"string","nullable":true},"sensitiveLongitude":{"type":"number","nullable":true},"sensitiveLongitude90":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"notation":{"type":"string","nullable":true},"methodology":{"type":"string","nullable":true},"source":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"orb":1.5,"count":200,"pictures":[{"formula":"Moon + Mars − Saturn = ASC","bodyA":"Moon","bodyB":"Mars","bodyC":"Saturn","bodyD":"ASC","sensitiveLongitude":349.97330359581633,"sensitiveLongitude90":79.97330359581633,"orb":0.0054}],"notation":"A + B − C = D: sum of two longitudes minus third equals position of fourth (90° dial).","methodology":"Witte \"Regelwerk\" 1928 §III: base of Hamburg School practice. Each formula is read as a sentence: e.g. Mars + Saturn − Mercury = Sun → \"destructive thought turning against vitality\".","source":"Witte 1928 + Rudolph \"Werkbuch\" 1956"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/cosmobiology/lefeldt-extensions":{"post":{"tags":["Cosmobiology / Hamburg School"],"summary":"Lefeldt Extensions","description":"Lefeldt-Brummund 22.5° subdivisions.","operationId":"cosmobiology_lefeldt-extensions","x-quality":"green","x-source":"Reinhold Ebertin \"Combination of Stellar Influences\" 1940 / English ed. AFA 1972 (ISBN 0-86690-087-6) + Alfred Witte \"Regelwerk für Planetenbilder\" 1928 + Ludwig Rudolph \"Werkbuch der Hamburger Schule\" 1956 + Ebertin Institut publications.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartWithTnp"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/cosmobiology/lefeldt-extensions \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/cosmobiology/lefeldt-extensions', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/cosmobiology/lefeldt-extensions',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('cosmobiology/lefeldt-extensions', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"orb":{"type":"number","nullable":true},"branches":{"type":"array","items":{"type":"object","properties":{"point":{"type":"string","nullable":true},"pictures":{"type":"array","items":{"type":"object","properties":{"formula":{"type":"string","nullable":true},"pointA":{"type":"string","nullable":true},"pointB":{"type":"string","nullable":true},"pointC":{"type":"string","nullable":true},"midpointLongitude":{"type":"number","nullable":true},"midpointLongitude90":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true},"sentence":{"type":"string","nullable":true},"keywords":{"type":"string","nullable":true}},"nullable":true},"nullable":true}},"nullable":true},"nullable":true},"octants":{"type":"object","properties":{"0–22.5°":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"22.5–45°":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"45–67.5°":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"67.5–90°":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}},"nullable":true},"methodology":{"type":"string","nullable":true},"source":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"orb":0.75,"branches":[{"point":"MC","pictures":[{"formula":"MC = Sun/Uranus","pointA":"MC","pointB":"Sun","pointC":"Uranus","midpointLongitude":346.7802053202811,"midpointLongitude90":76.78020532028106,"orb":0.2941,"sentence":"MC stands on the midpoint of Sun and Uranus.","keywords":"individuality, vocation via will, vitality & sudden change"}]}],"octants":{"0–22.5°":["Venus 12.79°"],"22.5–45°":["Moon 26.90°"],"45–67.5°":["Sun 54.38°"],"67.5–90°":["Mars 78.32°"]},"methodology":"Lefeldt-Brummund (Ebertin Institut continuators) refine the dial by 22.5° quarters and use 0.75° orb for natal pictures. Octants reveal cluster patterns invisible at 90°-grain.","source":"Ebertin Institut publications (Lefeldt-Brummund era, 1980s–present)"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/cosmobiology/personal-point-tree":{"post":{"tags":["Cosmobiology / Hamburg School"],"summary":"Personal Point Tree","description":"Tree per personal point.","operationId":"cosmobiology_personal-point-tree","x-quality":"green","x-source":"Reinhold Ebertin \"Combination of Stellar Influences\" 1940 / English ed. AFA 1972 (ISBN 0-86690-087-6) + Alfred Witte \"Regelwerk für Planetenbilder\" 1928 + Ludwig Rudolph \"Werkbuch der Hamburger Schule\" 1956 + Ebertin Institut publications.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartWithTnp"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/cosmobiology/personal-point-tree \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/cosmobiology/personal-point-tree', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/cosmobiology/personal-point-tree',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('cosmobiology/personal-point-tree', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"orb":{"type":"number","nullable":true},"tree":{"type":"object","properties":{"ASC":{"type":"array","items":{"type":"object","properties":{"b":{"type":"string","nullable":true},"c":{"type":"string","nullable":true},"orb":{"type":"number","nullable":true},"midpoint90":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"MC":{"type":"array","items":{"type":"object","properties":{"b":{"type":"string","nullable":true},"c":{"type":"string","nullable":true},"orb":{"type":"number","nullable":true},"midpoint90":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"Sun":{"type":"array","items":{},"nullable":true},"Moon":{"type":"array","items":{"type":"object","properties":{"b":{"type":"string","nullable":true},"c":{"type":"string","nullable":true},"orb":{"type":"number","nullable":true},"midpoint90":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"true Node":{"type":"array","items":{"type":"object","properties":{"b":{"type":"string","nullable":true},"c":{"type":"string","nullable":true},"orb":{"type":"number","nullable":true},"midpoint90":{"type":"number","nullable":true}},"nullable":true},"nullable":true}},"nullable":true},"methodology":{"type":"string","nullable":true},"source":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"orb":1.5,"tree":{"ASC":[{"b":"Mars","c":"DSC","orb":0.8248,"midpoint90":79.1432}],"MC":[{"b":"Sun","c":"Uranus","orb":0.2941,"midpoint90":76.7802}],"Sun":[],"Moon":[{"b":"true Node","c":"Chiron","orb":0.1701,"midpoint90":26.7346}],"true Node":[{"b":"Sun","c":"Moon","orb":0.3819,"midpoint90":40.6404}]},"methodology":"Ebertin's practical workflow: read the tree of every personal point top-down. The strongest themes show up as densest clusters of B/C pairs.","source":"Ebertin \"Combination of Stellar Influences\" 1940/1972 (AFA English ed., ISBN 0-86690-087-6) + Witte \"Regelwerk\" 1928 + Ebertin Institut current publications"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/stream/positions":{"post":{"tags":["Real-time Streaming"],"summary":"Stream Positions","description":"Current planetary positions snapshot, tickSeconds=30.","operationId":"stream_positions","x-quality":"green","x-source":"Swiss Ephemeris WASM (Astrodienst) + project core libs (moon-voc, ingresses, eclipse-calendar, planetary-hours, lunar-calendar). HTTP-polling snapshots; SSE upgrade planned.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Positions"},"example":{}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/stream/positions \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{}'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/stream/positions', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({}),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/stream/positions',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('stream/positions', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"timestamp":{"type":"string","nullable":true},"julianDay":{"type":"number","nullable":true},"planets":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"longitude":{"type":"number","nullable":true},"latitude":{"type":"number","nullable":true},"speed":{"type":"number","nullable":true},"retrograde":{"type":"boolean","nullable":true},"sign":{"type":"string","nullable":true},"degreeInSign":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"tickSeconds":{"type":"number","nullable":true},"transport":{"type":"string","nullable":true},"sseUpgrade":{"type":"string","nullable":true},"pricing":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"timestamp":"2026-08-23T22:05:26.767Z","julianDay":2461276.4204398147,"planets":[{"id":0,"name":"Sun","longitude":150.79404299195198,"latitude":-0.00008204620288850356,"speed":0.9637343842987806,"retrograde":false,"sign":"Virgo","degreeInSign":0.7940429919519545}],"tickSeconds":30,"transport":"http-polling","sseUpgrade":"Use the same endpoint with /sse subpath for Server-Sent Events (planned).","pricing":"10 credits/call (Tier 1): each tick recomputes positions, so it is a live compute, not a cheap lookup. Poll on the returned `tickSeconds`; see docs/PRICING.md §11."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/stream/transit-alerts":{"post":{"tags":["Real-time Streaming"],"summary":"Stream Transit Alerts","description":"Natal-transit hits within next N hours.","operationId":"stream_transit-alerts","x-quality":"green","x-source":"Swiss Ephemeris WASM (Astrodienst) + project core libs (moon-voc, ingresses, eclipse-calendar, planetary-hours, lunar-calendar). HTTP-polling snapshots; SSE upgrade planned.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransitAlerts"},"example":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52,"hours":24}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/stream/transit-alerts \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52, \"hours\": 24 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/stream/transit-alerts', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"1990-05-15\",\n    \"time\": \"15:30:00\",\n    \"timezone\": \"Europe/Kyiv\",\n    \"latitude\": 50.45,\n    \"longitude\": 30.52,\n    \"hours\": 24\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/stream/transit-alerts',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"1990-05-15\",\n      'time': \"15:30:00\",\n      'timezone': \"Europe/Kyiv\",\n      'latitude': 50.45,\n      'longitude': 30.52,\n      'hours': 24\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('stream/transit-alerts', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '1990-05-15',\n        'time' => '15:30:00',\n        'timezone' => 'Europe/Kyiv',\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n        'hours' => 24,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"windowHours":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true},"count":{"type":"number","nullable":true},"alerts":{"type":"array","items":{"type":"object","properties":{"transitPlanet":{"type":"string","nullable":true},"natalPlanet":{"type":"string","nullable":true},"angle":{"type":"number","nullable":true},"exactAt":{"type":"string","nullable":true},"orb":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"nextEventAt":{"type":"string","nullable":true},"tickSeconds":{"type":"number","nullable":true},"transport":{"type":"string","nullable":true},"sseUpgrade":{"type":"string","nullable":true},"pricing":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"windowHours":24,"orb":1,"count":10,"alerts":[{"transitPlanet":"Mars","natalPlanet":"Mercury","angle":60,"exactAt":"2026-08-23T22:05:25.999Z","orb":0.2077}],"nextEventAt":"2026-08-23T22:05:25.999Z","tickSeconds":300,"transport":"http-polling","sseUpgrade":"Use the same endpoint with /sse subpath for Server-Sent Events (planned).","pricing":"10 credits/call (Tier 1): each tick recomputes positions, so it is a live compute, not a cheap lookup. Poll on the returned `tickSeconds`; see docs/PRICING.md §11."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/stream/eclipse-incoming":{"post":{"tags":["Real-time Streaming"],"summary":"Stream Eclipse Incoming","description":"Countdown to next 5 eclipses.","operationId":"stream_eclipse-incoming","x-quality":"green","x-source":"Swiss Ephemeris WASM (Astrodienst) + project core libs (moon-voc, ingresses, eclipse-calendar, planetary-hours, lunar-calendar). HTTP-polling snapshots; SSE upgrade planned.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmptyBody"},"example":{}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/stream/eclipse-incoming \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{}'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/stream/eclipse-incoming', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({}),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/stream/eclipse-incoming',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('stream/eclipse-incoming', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"timestamp":{"type":"string","nullable":true},"count":{"type":"number","nullable":true},"eclipses":{"type":"array","items":{"type":"object","properties":{"kind":{"type":"string","nullable":true},"type":{"type":"string","nullable":true},"longitude":{"type":"number","nullable":true},"sign":{"type":"string","nullable":true},"maxAt":{"type":"string","nullable":true},"beginAt":{"type":"string","nullable":true},"endAt":{"type":"string","nullable":true},"daysUntil":{"type":"number","nullable":true},"hoursUntil":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"nextEventAt":{"type":"string","nullable":true},"tickSeconds":{"type":"number","nullable":true},"transport":{"type":"string","nullable":true},"sseUpgrade":{"type":"string","nullable":true},"pricing":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"timestamp":"2026-08-23T22:05:26.964Z","count":5,"eclipses":[{"kind":"lunar","type":"partial","longitude":334.8525422076384,"sign":"Pisces","maxAt":"2026-08-28T04:12:58.339Z","beginAt":"2026-08-28T02:33:53.071Z","endAt":"2026-08-28T05:52:03.261Z","daysUntil":4.26,"hoursUntil":102.1}],"nextEventAt":"2026-08-28T04:12:58.339Z","tickSeconds":3600,"transport":"http-polling","sseUpgrade":"Use the same endpoint with /sse subpath for Server-Sent Events (planned).","pricing":"10 credits/call (Tier 1): each tick recomputes positions, so it is a live compute, not a cheap lookup. Poll on the returned `tickSeconds`; see docs/PRICING.md §11."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/stream/retrograde-alerts":{"post":{"tags":["Real-time Streaming"],"summary":"Stream Retrograde Alerts","description":"All planets retro state + next stations.","operationId":"stream_retrograde-alerts","x-quality":"green","x-source":"Swiss Ephemeris WASM (Astrodienst) + project core libs (moon-voc, ingresses, eclipse-calendar, planetary-hours, lunar-calendar). HTTP-polling snapshots; SSE upgrade planned.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmptyBody"},"example":{}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/stream/retrograde-alerts \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{}'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/stream/retrograde-alerts', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({}),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/stream/retrograde-alerts',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('stream/retrograde-alerts', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"timestamp":{"type":"string","nullable":true},"planets":{"type":"array","items":{"type":"object","properties":{"planet":{"type":"string","nullable":true},"currentlyRetrograde":{"type":"boolean","nullable":true},"currentLongitude":{"type":"number","nullable":true},"sign":{"type":"string","nullable":true},"speed":{"type":"number","nullable":true},"nextStationAt":{"type":"string","nullable":true},"nextStationType":{"type":"string","nullable":true},"daysToStation":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"nextEventAt":{"type":"string","nullable":true},"tickSeconds":{"type":"number","nullable":true},"transport":{"type":"string","nullable":true},"sseUpgrade":{"type":"string","nullable":true},"pricing":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"timestamp":"2026-08-23T22:05:27.031Z","planets":[{"planet":"Mercury","currentlyRetrograde":false,"currentLongitude":146.9178054050402,"sign":"Leo","speed":2.0070012219964397,"nextStationAt":"2026-10-24T07:12:42.919Z","nextStationType":"retrograde","daysToStation":61.38}],"nextEventAt":"2026-09-10T18:27:14.899Z","tickSeconds":3600,"transport":"http-polling","sseUpgrade":"Use the same endpoint with /sse subpath for Server-Sent Events (planned).","pricing":"10 credits/call (Tier 1): each tick recomputes positions, so it is a live compute, not a cheap lookup. Poll on the returned `tickSeconds`; see docs/PRICING.md §11."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/stream/void-of-course":{"post":{"tags":["Real-time Streaming"],"summary":"Stream Void-of-Course","description":"Current Moon VOC + next ingress.","operationId":"stream_void-of-course","x-quality":"green","x-source":"Swiss Ephemeris WASM (Astrodienst) + project core libs (moon-voc, ingresses, eclipse-calendar, planetary-hours, lunar-calendar). HTTP-polling snapshots; SSE upgrade planned.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmptyBody"},"example":{}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/stream/void-of-course \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{}'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/stream/void-of-course', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({}),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/stream/void-of-course',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('stream/void-of-course', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"timestamp":{"type":"string","nullable":true},"julianDay":{"type":"number","nullable":true},"status":{"type":"object","properties":{"isVoC":{"type":"boolean","nullable":true},"currentPeriod":{"nullable":true}},"nullable":true},"nextIngress":{"type":"object","properties":{"jd":{"type":"number","nullable":true},"at":{"type":"string","nullable":true},"sign":{"type":"string","nullable":true},"longitude":{"type":"number","nullable":true}},"nullable":true},"nextEventAt":{"type":"string","nullable":true},"tickSeconds":{"type":"number","nullable":true},"transport":{"type":"string","nullable":true},"sseUpgrade":{"type":"string","nullable":true},"pricing":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"timestamp":"2026-08-23T22:05:27.274Z","julianDay":2461276.4204513887,"status":{"isVoC":false,"currentPeriod":null},"nextIngress":{"jd":2461277.876115446,"at":"2026-08-25T09:01:36.374Z","sign":"Aquarius","longitude":299.9992972156107},"nextEventAt":"2026-08-25T09:01:36.374Z","tickSeconds":600,"transport":"http-polling","sseUpgrade":"Use the same endpoint with /sse subpath for Server-Sent Events (planned).","pricing":"10 credits/call (Tier 1): each tick recomputes positions, so it is a live compute, not a cheap lookup. Poll on the returned `tickSeconds`; see docs/PRICING.md §11."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/stream/lunar-phase":{"post":{"tags":["Real-time Streaming"],"summary":"Stream Lunar Phase","description":"Current 8-phase + countdown to next major phase.","operationId":"stream_lunar-phase","x-quality":"green","x-source":"Swiss Ephemeris WASM (Astrodienst) + project core libs (moon-voc, ingresses, eclipse-calendar, planetary-hours, lunar-calendar). HTTP-polling snapshots; SSE upgrade planned.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmptyBody"},"example":{}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/stream/lunar-phase \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{}'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/stream/lunar-phase', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({}),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/stream/lunar-phase',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('stream/lunar-phase', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"phase":{"type":"string","nullable":true},"illuminationPct":{"type":"number","nullable":true}}}}},"example":{"ok":true,"data":{"phase":"...","illuminationPct":60}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/stream/ingress":{"post":{"tags":["Real-time Streaming"],"summary":"Stream Ingress","description":"Next planet sign-ingresses for N days.","operationId":"stream_ingress","x-quality":"green","x-source":"Swiss Ephemeris WASM (Astrodienst) + project core libs (moon-voc, ingresses, eclipse-calendar, planetary-hours, lunar-calendar). HTTP-polling snapshots; SSE upgrade planned.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ingress"},"example":{"days":30}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/stream/ingress \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"days\": 30 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/stream/ingress', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"days\": 30\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/stream/ingress',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'days': 30\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('stream/ingress', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'days' => 30,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"windowDays":{"type":"number","nullable":true},"count":{"type":"number","nullable":true},"ingresses":{"type":"array","items":{"type":"object","properties":{"planet":{"type":"string","nullable":true},"planetId":{"type":"number","nullable":true},"at":{"type":"string","nullable":true},"sign":{"type":"string","nullable":true},"longitude":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"nextEventAt":{"type":"string","nullable":true},"tickSeconds":{"type":"number","nullable":true},"transport":{"type":"string","nullable":true},"sseUpgrade":{"type":"string","nullable":true},"pricing":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"windowDays":30,"count":3,"ingresses":[{"planet":"Mercury","planetId":2,"at":"2026-08-25T11:04:09.656Z","sign":"Virgo","longitude":149.99990697162983}],"nextEventAt":"2026-08-25T11:04:09.656Z","tickSeconds":3600,"transport":"http-polling","sseUpgrade":"Use the same endpoint with /sse subpath for Server-Sent Events (planned).","pricing":"10 credits/call (Tier 1): each tick recomputes positions, so it is a live compute, not a cheap lookup. Poll on the returned `tickSeconds`; see docs/PRICING.md §11."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/stream/eclipse-totality":{"post":{"tags":["Real-time Streaming"],"summary":"Stream Eclipse Totality","description":"Next solar+lunar eclipses with totality info.","operationId":"stream_eclipse-totality","x-quality":"green","x-source":"Swiss Ephemeris WASM (Astrodienst) + project core libs (moon-voc, ingresses, eclipse-calendar, planetary-hours, lunar-calendar). HTTP-polling snapshots; SSE upgrade planned.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EclipseTotality"},"example":{}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/stream/eclipse-totality \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{}'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/stream/eclipse-totality', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({}),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/stream/eclipse-totality',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('stream/eclipse-totality', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"timestamp":{"type":"string","nullable":true},"nextSolar":{"type":"object","properties":{"type":{"type":"string","nullable":true},"longitude":{"type":"number","nullable":true},"sign":{"type":"string","nullable":true},"maxAt":{"type":"string","nullable":true},"beginAt":{"type":"string","nullable":true},"endAt":{"type":"string","nullable":true},"durationHours":{"type":"number","nullable":true},"daysUntil":{"type":"number","nullable":true},"isTotal":{"type":"boolean","nullable":true}},"nullable":true},"nextLunar":{"type":"object","properties":{"type":{"type":"string","nullable":true},"longitude":{"type":"number","nullable":true},"sign":{"type":"string","nullable":true},"maxAt":{"type":"string","nullable":true},"beginAt":{"type":"string","nullable":true},"endAt":{"type":"string","nullable":true},"durationHours":{"type":"number","nullable":true},"daysUntil":{"type":"number","nullable":true},"isTotal":{"type":"boolean","nullable":true}},"nullable":true},"note":{"type":"string","nullable":true},"nextEventAt":{"type":"string","nullable":true},"tickSeconds":{"type":"number","nullable":true},"transport":{"type":"string","nullable":true},"sseUpgrade":{"type":"string","nullable":true},"pricing":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"timestamp":"2026-08-23T22:05:27.448Z","nextSolar":{"type":"annular","longitude":317.62961434553335,"sign":"Aquarius","maxAt":"2027-02-06T15:59:40.318Z","beginAt":"2027-02-06T12:57:51.310Z","endAt":"2027-02-06T19:01:40.865Z","durationHours":6.06,"daysUntil":166.75,"isTotal":false},"nextLunar":{"type":"partial","longitude":334.8525422076384,"sign":"Pisces","maxAt":"2026-08-28T04:12:58.339Z","beginAt":"2026-08-28T02:33:53.071Z","endAt":"2026-08-28T05:52:03.261Z","durationHours":3.3,"daysUntil":4.26,"isTotal":false},"note":"Path-of-totality geographic resolution requires per-location calculation; current API returns event-level data only.","nextEventAt":"2026-08-28T04:12:58.339Z","tickSeconds":3600,"transport":"http-polling","sseUpgrade":"Use the same endpoint with /sse subpath for Server-Sent Events (planned).","pricing":"10 credits/call (Tier 1): each tick recomputes positions, so it is a live compute, not a cheap lookup. Poll on the returned `tickSeconds`; see docs/PRICING.md §11."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/stream/planetary-hour-changes":{"post":{"tags":["Real-time Streaming"],"summary":"Stream Planetary Hour Changes","description":"Current planetary hour + next 24.","operationId":"stream_planetary-hour-changes","x-quality":"green","x-source":"Swiss Ephemeris WASM (Astrodienst) + project core libs (moon-voc, ingresses, eclipse-calendar, planetary-hours, lunar-calendar). HTTP-polling snapshots; SSE upgrade planned.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanetaryHour"},"example":{"latitude":50.45,"longitude":30.52,"timezoneOffset":3}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/stream/planetary-hour-changes \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"latitude\": 50.45, \"longitude\": 30.52, \"timezoneOffset\": 3 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/stream/planetary-hour-changes', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"latitude\": 50.45,\n    \"longitude\": 30.52,\n    \"timezoneOffset\": 3\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/stream/planetary-hour-changes',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'latitude': 50.45,\n      'longitude': 30.52,\n      'timezoneOffset': 3\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('stream/planetary-hour-changes', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n        'timezoneOffset' => 3,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"timestamp":{"type":"string","nullable":true},"current":{"type":"object","properties":{"ruler":{"type":"string","nullable":true},"kind":{"type":"string","nullable":true},"startAt":{"type":"string","nullable":true}},"nullable":true},"next":{"type":"object","properties":{"ruler":{"type":"string","nullable":true},"kind":{"type":"string","nullable":true},"startAt":{"type":"string","nullable":true}},"nullable":true},"next24Hours":{"type":"array","items":{"type":"object","properties":{"ruler":{"type":"string","nullable":true},"kind":{"type":"string","nullable":true},"startAt":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"nextEventAt":{"type":"string","nullable":true},"tickSeconds":{"type":"number","nullable":true},"transport":{"type":"string","nullable":true},"sseUpgrade":{"type":"string","nullable":true},"pricing":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"timestamp":"2026-08-23T22:05:27.504Z","current":{"ruler":"Saturn","kind":"night","startAt":"2026-08-23T22:00:04.775Z"},"next":{"ruler":"Jupiter","kind":"night","startAt":"2026-08-23T22:49:47.036Z"},"next24Hours":[{"ruler":"Saturn","kind":"night","startAt":"2026-08-23T22:00:04.775Z"}],"nextEventAt":"2026-08-23T22:49:47.036Z","tickSeconds":600,"transport":"http-polling","sseUpgrade":"Use the same endpoint with /sse subpath for Server-Sent Events (planned).","pricing":"10 credits/call (Tier 1): each tick recomputes positions, so it is a live compute, not a cheap lookup. Poll on the returned `tickSeconds`; see docs/PRICING.md §11."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/stream/sunrise-sunset":{"post":{"tags":["Real-time Streaming"],"summary":"Stream Sunrise/Sunset","description":"Today + tomorrow sun events.","operationId":"stream_sunrise-sunset","x-quality":"green","x-source":"Swiss Ephemeris WASM (Astrodienst) + project core libs (moon-voc, ingresses, eclipse-calendar, planetary-hours, lunar-calendar). HTTP-polling snapshots; SSE upgrade planned.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Sun"},"example":{"latitude":50.45,"longitude":30.52,"timezoneOffset":3}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/stream/sunrise-sunset \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"latitude\": 50.45, \"longitude\": 30.52, \"timezoneOffset\": 3 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/stream/sunrise-sunset', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"latitude\": 50.45,\n    \"longitude\": 30.52,\n    \"timezoneOffset\": 3\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/stream/sunrise-sunset',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'latitude': 50.45,\n      'longitude': 30.52,\n      'timezoneOffset': 3\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('stream/sunrise-sunset', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'latitude' => 50.45,\n        'longitude' => 30.52,\n        'timezoneOffset' => 3,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"timestamp":{"type":"string","nullable":true},"today":{"type":"object","properties":{"date":{"type":"string","nullable":true},"sunrise":{"type":"string","nullable":true},"sunset":{"type":"string","nullable":true},"polarState":{"type":"string","nullable":true},"warning":{"nullable":true}},"nullable":true},"tomorrow":{"type":"object","properties":{"date":{"type":"string","nullable":true},"sunrise":{"type":"string","nullable":true},"sunset":{"type":"string","nullable":true},"polarState":{"type":"string","nullable":true}},"nullable":true},"nextEventAt":{"type":"string","nullable":true},"nextEventKind":{"type":"string","nullable":true},"tickSeconds":{"type":"number","nullable":true},"transport":{"type":"string","nullable":true},"sseUpgrade":{"type":"string","nullable":true},"pricing":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"timestamp":"2026-08-23T22:05:27.563Z","today":{"date":"2026-08-23","sunrise":"2026-08-23T02:58:18.342Z","sunset":"2026-08-23T17:01:51.208Z","polarState":"normal","warning":null},"tomorrow":{"date":"2026-08-24","sunrise":"2026-08-24T02:59:49.545Z","sunset":"2026-08-24T16:59:47.969Z","polarState":"normal"},"nextEventAt":"2026-08-24T02:59:49.545Z","nextEventKind":"sunrise","tickSeconds":1800,"transport":"http-polling","sseUpgrade":"Use the same endpoint with /sse subpath for Server-Sent Events (planned).","pricing":"10 credits/call (Tier 1): each tick recomputes positions, so it is a live compute, not a cheap lookup. Poll on the returned `tickSeconds`; see docs/PRICING.md §11."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/embed/daily-horoscope":{"get":{"tags":["Embeddable Widgets"],"summary":"Daily Horoscope (HTML)","description":"Iframe-friendly daily horoscope card per zodiac sign.","operationId":"embed_daily-horoscope_get","x-quality":"green","x-source":"Reuses /render/* SVG + /human-design + RWS tarot. Iframe-friendly HTML scaffold with X-Frame-Options ALLOWALL + CSP frame-ancestors *. Public IP-rate-limited (120/hr).","parameters":[{"name":"sign","in":"query","required":false,"description":"Zodiac sun sign, lowercase English name.","schema":{"type":"string","enum":["aries","taurus","gemini","cancer","leo","virgo","libra","scorpio","sagittarius","capricorn","aquarius","pisces"]},"example":"leo"},{"name":"date","in":"query","required":false,"description":"Calendar date `YYYY-MM-DD`. Defaults to today (UTC).","schema":{"type":"string","format":"date"},"example":"2026-08-01"},{"name":"time","in":"query","required":false,"description":"Local birth time `HH:mm:ss`. Defaults to 12:00:00.","schema":{"type":"string"},"example":"14:30:00"},{"name":"tz","in":"query","required":false,"description":"UTC offset in hours, e.g. `2` or `-5.5`. Defaults to 0.","schema":{"type":"number"},"example":2},{"name":"lat","in":"query","required":false,"description":"Latitude in decimal degrees. Defaults to 0.","schema":{"type":"number"},"example":50.45},{"name":"lng","in":"query","required":false,"description":"Longitude in decimal degrees. Defaults to 0.","schema":{"type":"number"},"example":30.52},{"name":"city","in":"query","required":false,"description":"Optional city label shown on the card.","schema":{"type":"string"}},{"name":"lang","in":"query","required":false,"description":"Widget language. Also accepts the Accept-Language header.","schema":{"type":"string","enum":["uk","en","de","ru","pl","es","pt","fr","it","nl","cs","ro","hu","el","tr","ar","hi","ja","ko","vi","id"]},"example":"de"},{"name":"theme","in":"query","required":false,"description":"Colour scheme. Unknown values fall back to dark.","schema":{"type":"string","enum":["dark","light","console"]},"example":"light"},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X GET https://api.astroway.info/v1/embed/daily-horoscope \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/embed/daily-horoscope', {\n  method: 'GET',\n  headers: {\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.get(\n    'https://api.astroway.info/v1/embed/daily-horoscope',\n    headers={'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->get('embed/daily-horoscope', [\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Rendered widget markup, ready to drop into an iframe.","content":{"text/html":{"schema":{"type":"string"}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"security":[]}},"/embed/wheel":{"get":{"tags":["Embeddable Widgets"],"summary":"Natal Wheel (HTML+SVG)","description":"Iframe natal wheel render. `/embed/natal` is a 302 alias for this path.","operationId":"embed_wheel_get","x-quality":"green","x-source":"Reuses /render/* SVG + /human-design + RWS tarot. Iframe-friendly HTML scaffold with X-Frame-Options ALLOWALL + CSP frame-ancestors *. Public IP-rate-limited (120/hr).","parameters":[{"name":"date","in":"query","required":false,"description":"Calendar date `YYYY-MM-DD`. Defaults to today (UTC).","schema":{"type":"string","format":"date"},"example":"2026-08-01"},{"name":"time","in":"query","required":false,"description":"Local birth time `HH:mm:ss`. Defaults to 12:00:00.","schema":{"type":"string"},"example":"14:30:00"},{"name":"tz","in":"query","required":false,"description":"UTC offset in hours, e.g. `2` or `-5.5`. Defaults to 0.","schema":{"type":"number"},"example":2},{"name":"lat","in":"query","required":false,"description":"Latitude in decimal degrees. Defaults to 0.","schema":{"type":"number"},"example":50.45},{"name":"lng","in":"query","required":false,"description":"Longitude in decimal degrees. Defaults to 0.","schema":{"type":"number"},"example":30.52},{"name":"lang","in":"query","required":false,"description":"Widget language. Also accepts the Accept-Language header.","schema":{"type":"string","enum":["uk","en","de","ru","pl","es","pt","fr","it","nl","cs","ro","hu","el","tr","ar","hi","ja","ko","vi","id"]},"example":"de"},{"name":"theme","in":"query","required":false,"description":"Colour scheme. Unknown values fall back to dark.","schema":{"type":"string","enum":["dark","light","console"]},"example":"light"},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X GET https://api.astroway.info/v1/embed/wheel \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/embed/wheel', {\n  method: 'GET',\n  headers: {\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.get(\n    'https://api.astroway.info/v1/embed/wheel',\n    headers={'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->get('embed/wheel', [\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Rendered widget markup, ready to drop into an iframe.","content":{"text/html":{"schema":{"type":"string"}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"security":[]}},"/embed/transit-timeline":{"get":{"tags":["Embeddable Widgets"],"summary":"Transit Timeline (HTML)","description":"7-day Moon ingress timeline.","operationId":"embed_transit-timeline_get","x-quality":"green","x-source":"Reuses /render/* SVG + /human-design + RWS tarot. Iframe-friendly HTML scaffold with X-Frame-Options ALLOWALL + CSP frame-ancestors *. Public IP-rate-limited (120/hr).","parameters":[{"name":"date","in":"query","required":false,"description":"Calendar date `YYYY-MM-DD`. Defaults to today (UTC).","schema":{"type":"string","format":"date"},"example":"2026-08-01"},{"name":"days","in":"query","required":false,"description":"Days to cover, default 7.","schema":{"type":"integer"},"example":7},{"name":"lang","in":"query","required":false,"description":"Widget language. Also accepts the Accept-Language header.","schema":{"type":"string","enum":["uk","en","de","ru","pl","es","pt","fr","it","nl","cs","ro","hu","el","tr","ar","hi","ja","ko","vi","id"]},"example":"de"},{"name":"theme","in":"query","required":false,"description":"Colour scheme. Unknown values fall back to dark.","schema":{"type":"string","enum":["dark","light","console"]},"example":"light"},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X GET https://api.astroway.info/v1/embed/transit-timeline \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/embed/transit-timeline', {\n  method: 'GET',\n  headers: {\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.get(\n    'https://api.astroway.info/v1/embed/transit-timeline',\n    headers={'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->get('embed/transit-timeline', [\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Rendered widget markup, ready to drop into an iframe.","content":{"text/html":{"schema":{"type":"string"}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"security":[]}},"/embed/bodygraph":{"get":{"tags":["Embeddable Widgets"],"summary":"HD Bodygraph (HTML)","description":"Type/strategy/authority/profile + center status.","operationId":"embed_bodygraph_get","x-quality":"green","x-source":"Reuses /render/* SVG + /human-design + RWS tarot. Iframe-friendly HTML scaffold with X-Frame-Options ALLOWALL + CSP frame-ancestors *. Public IP-rate-limited (120/hr).","parameters":[{"name":"date","in":"query","required":false,"description":"Calendar date `YYYY-MM-DD`. Defaults to today (UTC).","schema":{"type":"string","format":"date"},"example":"2026-08-01"},{"name":"time","in":"query","required":false,"description":"Local birth time `HH:mm:ss`. Defaults to 12:00:00.","schema":{"type":"string"},"example":"14:30:00"},{"name":"tz","in":"query","required":false,"description":"UTC offset in hours, e.g. `2` or `-5.5`. Defaults to 0.","schema":{"type":"number"},"example":2},{"name":"lat","in":"query","required":false,"description":"Latitude in decimal degrees. Defaults to 0.","schema":{"type":"number"},"example":50.45},{"name":"lng","in":"query","required":false,"description":"Longitude in decimal degrees. Defaults to 0.","schema":{"type":"number"},"example":30.52},{"name":"lang","in":"query","required":false,"description":"Widget language. Also accepts the Accept-Language header.","schema":{"type":"string","enum":["uk","en","de","ru","pl","es","pt","fr","it","nl","cs","ro","hu","el","tr","ar","hi","ja","ko","vi","id"]},"example":"de"},{"name":"theme","in":"query","required":false,"description":"Colour scheme. Unknown values fall back to dark.","schema":{"type":"string","enum":["dark","light","console"]},"example":"light"},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X GET https://api.astroway.info/v1/embed/bodygraph \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/embed/bodygraph', {\n  method: 'GET',\n  headers: {\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.get(\n    'https://api.astroway.info/v1/embed/bodygraph',\n    headers={'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->get('embed/bodygraph', [\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Rendered widget markup, ready to drop into an iframe.","content":{"text/html":{"schema":{"type":"string"}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"security":[]}},"/embed/kundli":{"get":{"tags":["Embeddable Widgets"],"summary":"Vedic Kundli (HTML+SVG)","description":"North-Indian kundli SVG.","operationId":"embed_kundli_get","x-quality":"green","x-source":"Reuses /render/* SVG + /human-design + RWS tarot. Iframe-friendly HTML scaffold with X-Frame-Options ALLOWALL + CSP frame-ancestors *. Public IP-rate-limited (120/hr).","parameters":[{"name":"date","in":"query","required":false,"description":"Calendar date `YYYY-MM-DD`. Defaults to today (UTC).","schema":{"type":"string","format":"date"},"example":"2026-08-01"},{"name":"time","in":"query","required":false,"description":"Local birth time `HH:mm:ss`. Defaults to 12:00:00.","schema":{"type":"string"},"example":"14:30:00"},{"name":"tz","in":"query","required":false,"description":"UTC offset in hours, e.g. `2` or `-5.5`. Defaults to 0.","schema":{"type":"number"},"example":2},{"name":"lat","in":"query","required":false,"description":"Latitude in decimal degrees. Defaults to 0.","schema":{"type":"number"},"example":50.45},{"name":"lng","in":"query","required":false,"description":"Longitude in decimal degrees. Defaults to 0.","schema":{"type":"number"},"example":30.52},{"name":"lang","in":"query","required":false,"description":"Widget language. Also accepts the Accept-Language header.","schema":{"type":"string","enum":["uk","en","de","ru","pl","es","pt","fr","it","nl","cs","ro","hu","el","tr","ar","hi","ja","ko","vi","id"]},"example":"de"},{"name":"theme","in":"query","required":false,"description":"Colour scheme. Unknown values fall back to dark.","schema":{"type":"string","enum":["dark","light","console"]},"example":"light"},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X GET https://api.astroway.info/v1/embed/kundli \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/embed/kundli', {\n  method: 'GET',\n  headers: {\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.get(\n    'https://api.astroway.info/v1/embed/kundli',\n    headers={'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->get('embed/kundli', [\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Rendered widget markup, ready to drop into an iframe.","content":{"text/html":{"schema":{"type":"string"}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"security":[]}},"/embed/mini-chart":{"get":{"tags":["Embeddable Widgets"],"summary":"Mini Chart (HTML+SVG)","description":"Compact natal wheel for sidebars.","operationId":"embed_mini-chart_get","x-quality":"green","x-source":"Reuses /render/* SVG + /human-design + RWS tarot. Iframe-friendly HTML scaffold with X-Frame-Options ALLOWALL + CSP frame-ancestors *. Public IP-rate-limited (120/hr).","parameters":[{"name":"date","in":"query","required":false,"description":"Calendar date `YYYY-MM-DD`. Defaults to today (UTC).","schema":{"type":"string","format":"date"},"example":"2026-08-01"},{"name":"time","in":"query","required":false,"description":"Local birth time `HH:mm:ss`. Defaults to 12:00:00.","schema":{"type":"string"},"example":"14:30:00"},{"name":"tz","in":"query","required":false,"description":"UTC offset in hours, e.g. `2` or `-5.5`. Defaults to 0.","schema":{"type":"number"},"example":2},{"name":"lat","in":"query","required":false,"description":"Latitude in decimal degrees. Defaults to 0.","schema":{"type":"number"},"example":50.45},{"name":"lng","in":"query","required":false,"description":"Longitude in decimal degrees. Defaults to 0.","schema":{"type":"number"},"example":30.52},{"name":"lang","in":"query","required":false,"description":"Widget language. Also accepts the Accept-Language header.","schema":{"type":"string","enum":["uk","en","de","ru","pl","es","pt","fr","it","nl","cs","ro","hu","el","tr","ar","hi","ja","ko","vi","id"]},"example":"de"},{"name":"theme","in":"query","required":false,"description":"Colour scheme. Unknown values fall back to dark.","schema":{"type":"string","enum":["dark","light","console"]},"example":"light"},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X GET https://api.astroway.info/v1/embed/mini-chart \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/embed/mini-chart', {\n  method: 'GET',\n  headers: {\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.get(\n    'https://api.astroway.info/v1/embed/mini-chart',\n    headers={'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->get('embed/mini-chart', [\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Rendered widget markup, ready to drop into an iframe.","content":{"text/html":{"schema":{"type":"string"}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"security":[]}},"/embed/planet-of-day":{"get":{"tags":["Embeddable Widgets"],"summary":"Planet of Day (HTML)","description":"Today's planetary day-ruler card.","operationId":"embed_planet-of-day_get","x-quality":"green","x-source":"Reuses /render/* SVG + /human-design + RWS tarot. Iframe-friendly HTML scaffold with X-Frame-Options ALLOWALL + CSP frame-ancestors *. Public IP-rate-limited (120/hr).","parameters":[{"name":"date","in":"query","required":false,"description":"Calendar date `YYYY-MM-DD`. Defaults to today (UTC).","schema":{"type":"string","format":"date"},"example":"2026-08-01"},{"name":"lang","in":"query","required":false,"description":"Widget language. Also accepts the Accept-Language header.","schema":{"type":"string","enum":["uk","en","de","ru","pl","es","pt","fr","it","nl","cs","ro","hu","el","tr","ar","hi","ja","ko","vi","id"]},"example":"de"},{"name":"theme","in":"query","required":false,"description":"Colour scheme. Unknown values fall back to dark.","schema":{"type":"string","enum":["dark","light","console"]},"example":"light"},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X GET https://api.astroway.info/v1/embed/planet-of-day \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/embed/planet-of-day', {\n  method: 'GET',\n  headers: {\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.get(\n    'https://api.astroway.info/v1/embed/planet-of-day',\n    headers={'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->get('embed/planet-of-day', [\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Rendered widget markup, ready to drop into an iframe.","content":{"text/html":{"schema":{"type":"string"}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"security":[]}},"/embed/moon-phase":{"get":{"tags":["Embeddable Widgets"],"summary":"Moon Phase (HTML+SVG)","description":"Current Moon phase widget.","operationId":"embed_moon-phase_get","x-quality":"green","x-source":"Reuses /render/* SVG + /human-design + RWS tarot. Iframe-friendly HTML scaffold with X-Frame-Options ALLOWALL + CSP frame-ancestors *. Public IP-rate-limited (120/hr).","parameters":[{"name":"date","in":"query","required":false,"description":"Calendar date `YYYY-MM-DD`. Defaults to today (UTC).","schema":{"type":"string","format":"date"},"example":"2026-08-01"},{"name":"lang","in":"query","required":false,"description":"Widget language. Also accepts the Accept-Language header.","schema":{"type":"string","enum":["uk","en","de","ru","pl","es","pt","fr","it","nl","cs","ro","hu","el","tr","ar","hi","ja","ko","vi","id"]},"example":"de"},{"name":"theme","in":"query","required":false,"description":"Colour scheme. Unknown values fall back to dark.","schema":{"type":"string","enum":["dark","light","console"]},"example":"light"},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X GET https://api.astroway.info/v1/embed/moon-phase \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/embed/moon-phase', {\n  method: 'GET',\n  headers: {\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.get(\n    'https://api.astroway.info/v1/embed/moon-phase',\n    headers={'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->get('embed/moon-phase', [\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Rendered widget markup, ready to drop into an iframe.","content":{"text/html":{"schema":{"type":"string"}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"security":[]}},"/embed/daily-tarot":{"get":{"tags":["Embeddable Widgets"],"summary":"Daily Tarot (HTML)","description":"Deterministic 1-card RWS draw.","operationId":"embed_daily-tarot_get","x-quality":"green","x-source":"Reuses /render/* SVG + /human-design + RWS tarot. Iframe-friendly HTML scaffold with X-Frame-Options ALLOWALL + CSP frame-ancestors *. Public IP-rate-limited (120/hr).","parameters":[{"name":"date","in":"query","required":false,"description":"Calendar date `YYYY-MM-DD`. Defaults to today (UTC).","schema":{"type":"string","format":"date"},"example":"2026-08-01"},{"name":"lang","in":"query","required":false,"description":"Widget language. Also accepts the Accept-Language header.","schema":{"type":"string","enum":["uk","en","de","ru","pl","es","pt","fr","it","nl","cs","ro","hu","el","tr","ar","hi","ja","ko","vi","id"]},"example":"de"},{"name":"theme","in":"query","required":false,"description":"Colour scheme. Unknown values fall back to dark.","schema":{"type":"string","enum":["dark","light","console"]},"example":"light"},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X GET https://api.astroway.info/v1/embed/daily-tarot \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/embed/daily-tarot', {\n  method: 'GET',\n  headers: {\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.get(\n    'https://api.astroway.info/v1/embed/daily-tarot',\n    headers={'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->get('embed/daily-tarot', [\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Rendered widget markup, ready to drop into an iframe.","content":{"text/html":{"schema":{"type":"string"}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"security":[]}},"/embed/monthly-forecast":{"get":{"tags":["Embeddable Widgets"],"summary":"Monthly Forecast (HTML)","description":"Per-sign 4-week themed forecast.","operationId":"embed_monthly-forecast_get","x-quality":"green","x-source":"Reuses /render/* SVG + /human-design + RWS tarot. Iframe-friendly HTML scaffold with X-Frame-Options ALLOWALL + CSP frame-ancestors *. Public IP-rate-limited (120/hr).","parameters":[{"name":"sign","in":"query","required":false,"description":"Zodiac sun sign, lowercase English name.","schema":{"type":"string","enum":["aries","taurus","gemini","cancer","leo","virgo","libra","scorpio","sagittarius","capricorn","aquarius","pisces"]},"example":"leo"},{"name":"month","in":"query","required":false,"description":"Month as `YYYY-MM`. Defaults to the current month.","schema":{"type":"string"},"example":"2026-08"},{"name":"lang","in":"query","required":false,"description":"Widget language. Also accepts the Accept-Language header.","schema":{"type":"string","enum":["uk","en","de","ru","pl","es","pt","fr","it","nl","cs","ro","hu","el","tr","ar","hi","ja","ko","vi","id"]},"example":"de"},{"name":"theme","in":"query","required":false,"description":"Colour scheme. Unknown values fall back to dark.","schema":{"type":"string","enum":["dark","light","console"]},"example":"light"},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X GET https://api.astroway.info/v1/embed/monthly-forecast \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/embed/monthly-forecast', {\n  method: 'GET',\n  headers: {\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.get(\n    'https://api.astroway.info/v1/embed/monthly-forecast',\n    headers={'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->get('embed/monthly-forecast', [\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Rendered widget markup, ready to drop into an iframe.","content":{"text/html":{"schema":{"type":"string"}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"security":[]}},"/embed/transit":{"get":{"tags":["Embeddable Widgets"],"summary":"Sky Transits (HTML)","description":"Current planet positions (sign + degree) for a date.","operationId":"embed_transit_get","x-quality":"green","x-source":"Reuses /render/* SVG + /human-design + RWS tarot. Iframe-friendly HTML scaffold with X-Frame-Options ALLOWALL + CSP frame-ancestors *. Public IP-rate-limited (120/hr).","parameters":[{"name":"date","in":"query","required":false,"description":"Calendar date `YYYY-MM-DD`. Defaults to today (UTC).","schema":{"type":"string","format":"date"},"example":"2026-08-01"},{"name":"lang","in":"query","required":false,"description":"Widget language. Also accepts the Accept-Language header.","schema":{"type":"string","enum":["uk","en","de","ru","pl","es","pt","fr","it","nl","cs","ro","hu","el","tr","ar","hi","ja","ko","vi","id"]},"example":"de"},{"name":"theme","in":"query","required":false,"description":"Colour scheme. Unknown values fall back to dark.","schema":{"type":"string","enum":["dark","light","console"]},"example":"light"},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X GET https://api.astroway.info/v1/embed/transit \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/embed/transit', {\n  method: 'GET',\n  headers: {\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.get(\n    'https://api.astroway.info/v1/embed/transit',\n    headers={'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->get('embed/transit', [\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Rendered widget markup, ready to drop into an iframe.","content":{"text/html":{"schema":{"type":"string"}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"security":[]}},"/embed/numerology":{"get":{"tags":["Embeddable Widgets"],"summary":"Numerology (HTML)","description":"Life Path / Expression / Soul Urge / Personality card.","operationId":"embed_numerology_get","x-quality":"green","x-source":"Reuses /render/* SVG + /human-design + RWS tarot. Iframe-friendly HTML scaffold with X-Frame-Options ALLOWALL + CSP frame-ancestors *. Public IP-rate-limited (120/hr).","parameters":[{"name":"date","in":"query","required":false,"description":"Calendar date `YYYY-MM-DD`. Defaults to today (UTC).","schema":{"type":"string","format":"date"},"example":"2026-08-01"},{"name":"name","in":"query","required":false,"description":"Full name used for the name-based numbers.","schema":{"type":"string"}},{"name":"system","in":"query","required":false,"description":"Numerology system.","schema":{"type":"string","enum":["pythagorean","chaldean"]}},{"name":"lang","in":"query","required":false,"description":"Widget language. Also accepts the Accept-Language header.","schema":{"type":"string","enum":["uk","en","de","ru","pl","es","pt","fr","it","nl","cs","ro","hu","el","tr","ar","hi","ja","ko","vi","id"]},"example":"de"},{"name":"theme","in":"query","required":false,"description":"Colour scheme. Unknown values fall back to dark.","schema":{"type":"string","enum":["dark","light","console"]},"example":"light"},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X GET https://api.astroway.info/v1/embed/numerology \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/embed/numerology', {\n  method: 'GET',\n  headers: {\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.get(\n    'https://api.astroway.info/v1/embed/numerology',\n    headers={'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->get('embed/numerology', [\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Rendered widget markup, ready to drop into an iframe.","content":{"text/html":{"schema":{"type":"string"}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"security":[]}},"/embed/panchang":{"get":{"tags":["Embeddable Widgets"],"summary":"Panchang (HTML)","description":"Tithi / nakshatra / yoga / karana / vara + Rahu Kaal for a date.","operationId":"embed_panchang_get","x-quality":"green","x-source":"Reuses /render/* SVG + /human-design + RWS tarot. Iframe-friendly HTML scaffold with X-Frame-Options ALLOWALL + CSP frame-ancestors *. Public IP-rate-limited (120/hr).","parameters":[{"name":"date","in":"query","required":false,"description":"Calendar date `YYYY-MM-DD`. Defaults to today (UTC).","schema":{"type":"string","format":"date"},"example":"2026-08-01"},{"name":"lat","in":"query","required":false,"description":"Latitude in decimal degrees.","schema":{"type":"number"}},{"name":"lng","in":"query","required":false,"description":"Longitude in decimal degrees.","schema":{"type":"number"}},{"name":"tz","in":"query","required":false,"description":"UTC offset in hours.","schema":{"type":"number"}},{"name":"lang","in":"query","required":false,"description":"Widget language. Also accepts the Accept-Language header.","schema":{"type":"string","enum":["uk","en","de","ru","pl","es","pt","fr","it","nl","cs","ro","hu","el","tr","ar","hi","ja","ko","vi","id"]},"example":"de"},{"name":"theme","in":"query","required":false,"description":"Colour scheme. Unknown values fall back to dark.","schema":{"type":"string","enum":["dark","light","console"]},"example":"light"},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X GET https://api.astroway.info/v1/embed/panchang \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/embed/panchang', {\n  method: 'GET',\n  headers: {\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.get(\n    'https://api.astroway.info/v1/embed/panchang',\n    headers={'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->get('embed/panchang', [\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Rendered widget markup, ready to drop into an iframe.","content":{"text/html":{"schema":{"type":"string"}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"security":[]}},"/embed/synastry":{"get":{"tags":["Embeddable Widgets"],"summary":"Synastry (HTML)","description":"Two-subject compatibility score + key cross-aspects.","operationId":"embed_synastry_get","x-quality":"green","x-source":"Reuses /render/* SVG + /human-design + RWS tarot. Iframe-friendly HTML scaffold with X-Frame-Options ALLOWALL + CSP frame-ancestors *. Public IP-rate-limited (120/hr).","parameters":[{"name":"date_a","in":"query","required":false,"description":"Birth date `YYYY-MM-DD` of subject A. Required; the widget renders an error without both subjects.","schema":{"type":"string","format":"date"}},{"name":"time_a","in":"query","required":false,"description":"Birth time of subject A. Defaults to 12:00:00.","schema":{"type":"string"}},{"name":"tz_a","in":"query","required":false,"description":"UTC offset of subject A. Defaults to 0.","schema":{"type":"number"}},{"name":"lat_a","in":"query","required":false,"description":"Latitude of subject A. Defaults to 0.","schema":{"type":"number"}},{"name":"lng_a","in":"query","required":false,"description":"Longitude of subject A. Defaults to 0.","schema":{"type":"number"}},{"name":"date_b","in":"query","required":false,"description":"Birth date `YYYY-MM-DD` of subject B. Required; the widget renders an error without both subjects.","schema":{"type":"string","format":"date"}},{"name":"time_b","in":"query","required":false,"description":"Birth time of subject B. Defaults to 12:00:00.","schema":{"type":"string"}},{"name":"tz_b","in":"query","required":false,"description":"UTC offset of subject B. Defaults to 0.","schema":{"type":"number"}},{"name":"lat_b","in":"query","required":false,"description":"Latitude of subject B. Defaults to 0.","schema":{"type":"number"}},{"name":"lng_b","in":"query","required":false,"description":"Longitude of subject B. Defaults to 0.","schema":{"type":"number"}},{"name":"lang","in":"query","required":false,"description":"Widget language. Also accepts the Accept-Language header.","schema":{"type":"string","enum":["uk","en","de","ru","pl","es","pt","fr","it","nl","cs","ro","hu","el","tr","ar","hi","ja","ko","vi","id"]},"example":"de"},{"name":"theme","in":"query","required":false,"description":"Colour scheme. Unknown values fall back to dark.","schema":{"type":"string","enum":["dark","light","console"]},"example":"light"},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X GET https://api.astroway.info/v1/embed/synastry \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/embed/synastry', {\n  method: 'GET',\n  headers: {\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.get(\n    'https://api.astroway.info/v1/embed/synastry',\n    headers={'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->get('embed/synastry', [\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Rendered widget markup, ready to drop into an iframe.","content":{"text/html":{"schema":{"type":"string"}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"security":[]}},"/embed/moon-calendar":{"get":{"tags":["Embeddable Widgets"],"summary":"Moon Calendar (HTML+SVG)","description":"A month grid with the Moon's phase and sign for each day and the four quarter moments, in the `tz` you pass.","operationId":"embed_moon-calendar_get","x-quality":"green","x-source":"Reuses /render/* SVG + /human-design + RWS tarot. Iframe-friendly HTML scaffold with X-Frame-Options ALLOWALL + CSP frame-ancestors *. Public IP-rate-limited (120/hr).","parameters":[{"name":"month","in":"query","required":false,"description":"Month as `YYYY-MM`. Defaults to the current month.","schema":{"type":"string"},"example":"2026-11"},{"name":"tz","in":"query","required":false,"description":"UTC offset in hours for the day grid and the quarter times, default 0.","schema":{"type":"number"}},{"name":"lang","in":"query","required":false,"description":"Widget language. Also accepts the Accept-Language header.","schema":{"type":"string","enum":["uk","en","de","ru","pl","es","pt","fr","it","nl","cs","ro","hu","el","tr","ar","hi","ja","ko","vi","id"]},"example":"de"},{"name":"theme","in":"query","required":false,"description":"Colour scheme. Unknown values fall back to dark.","schema":{"type":"string","enum":["dark","light","console"]},"example":"light"},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X GET https://api.astroway.info/v1/embed/moon-calendar \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/embed/moon-calendar', {\n  method: 'GET',\n  headers: {\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.get(\n    'https://api.astroway.info/v1/embed/moon-calendar',\n    headers={'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->get('embed/moon-calendar', [\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Rendered widget markup, ready to drop into an iframe.","content":{"text/html":{"schema":{"type":"string"}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"security":[]}},"/embed/sign-compatibility":{"get":{"tags":["Embeddable Widgets"],"summary":"Sign Compatibility (HTML)","description":"Two zodiac signs: their classical relation (trine, sextile, square, opposition, aversion), tone, elements, modalities and polarity, after Ptolemy. No score: a sign pair carries nothing to weigh.","operationId":"embed_sign-compatibility_get","x-quality":"green","x-source":"Reuses /render/* SVG + /human-design + RWS tarot. Iframe-friendly HTML scaffold with X-Frame-Options ALLOWALL + CSP frame-ancestors *. Public IP-rate-limited (120/hr).","parameters":[{"name":"sign_a","in":"query","required":true,"description":"First sign, lowercase English name.","schema":{"type":"string","enum":["aries","taurus","gemini","cancer","leo","virgo","libra","scorpio","sagittarius","capricorn","aquarius","pisces"]},"example":"aries"},{"name":"sign_b","in":"query","required":true,"description":"Second sign, lowercase English name.","schema":{"type":"string","enum":["aries","taurus","gemini","cancer","leo","virgo","libra","scorpio","sagittarius","capricorn","aquarius","pisces"]},"example":"leo"},{"name":"lang","in":"query","required":false,"description":"Widget language. Also accepts the Accept-Language header.","schema":{"type":"string","enum":["uk","en","de","ru","pl","es","pt","fr","it","nl","cs","ro","hu","el","tr","ar","hi","ja","ko","vi","id"]},"example":"de"},{"name":"theme","in":"query","required":false,"description":"Colour scheme. Unknown values fall back to dark.","schema":{"type":"string","enum":["dark","light","console"]},"example":"light"},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X GET https://api.astroway.info/v1/embed/sign-compatibility \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/embed/sign-compatibility', {\n  method: 'GET',\n  headers: {\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.get(\n    'https://api.astroway.info/v1/embed/sign-compatibility',\n    headers={'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->get('embed/sign-compatibility', [\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Rendered widget markup, ready to drop into an iframe.","content":{"text/html":{"schema":{"type":"string"}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"security":[]}},"/embed/tarot-spread":{"get":{"tags":["Embeddable Widgets"],"summary":"Tarot Spread (HTML)","description":"One to five RWS cards with art, position and meaning: single-card, three-card, decision or career. Fixed per date, or per visitor with `seed`.","operationId":"embed_tarot-spread_get","x-quality":"green","x-source":"Reuses /render/* SVG + /human-design + RWS tarot. Iframe-friendly HTML scaffold with X-Frame-Options ALLOWALL + CSP frame-ancestors *. Public IP-rate-limited (120/hr).","parameters":[{"name":"date","in":"query","required":false,"description":"Calendar date `YYYY-MM-DD`. Defaults to today (UTC).","schema":{"type":"string","format":"date"},"example":"2026-08-01"},{"name":"spread","in":"query","required":false,"description":"Spread, default `three-card`.","schema":{"type":"string","enum":["single-card","three-card","decision","career"]}},{"name":"seed","in":"query","required":false,"description":"Any string up to 64 characters. Without it every visitor sees the same draw for the date; pass a visitor id for a draw of their own.","schema":{"type":"string"}},{"name":"reversed","in":"query","required":false,"description":"`1` lets cards fall reversed.","schema":{"type":"string","enum":["0","1"]}},{"name":"art","in":"query","required":false,"description":"Card art set id from `GET /v1/tarot/decks`, default `rws-1909`.","schema":{"type":"string"}},{"name":"lang","in":"query","required":false,"description":"Widget language. Also accepts the Accept-Language header.","schema":{"type":"string","enum":["uk","en","de","ru","pl","es","pt","fr","it","nl","cs","ro","hu","el","tr","ar","hi","ja","ko","vi","id"]},"example":"de"},{"name":"theme","in":"query","required":false,"description":"Colour scheme. Unknown values fall back to dark.","schema":{"type":"string","enum":["dark","light","console"]},"example":"light"},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X GET https://api.astroway.info/v1/embed/tarot-spread \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/embed/tarot-spread', {\n  method: 'GET',\n  headers: {\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.get(\n    'https://api.astroway.info/v1/embed/tarot-spread',\n    headers={'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->get('embed/tarot-spread', [\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Rendered widget markup, ready to drop into an iframe.","content":{"text/html":{"schema":{"type":"string"}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"security":[]}},"/mcp/tool-call-stream":{"post":{"tags":["MCP Advanced"],"summary":"MCP Tool-Call Stream","description":"SSE-stream of a tool call envelope.","operationId":"mcp_tool-call-stream","x-quality":"green","x-source":"Anthropic Model Context Protocol spec 2025-03 + 8 astrologer personas (Classical/Modern/Evolutionary/Vedic/Humanistic/Hermetic/Cosmobiologist/Horary).","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolCall"},"example":{"tool":"chart","args":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/mcp/tool-call-stream \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"tool\": \"chart\", \"args\": { \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 } }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/mcp/tool-call-stream', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"tool\": \"chart\",\n    \"args\": {\n      \"date\": \"1990-05-15\",\n      \"time\": \"15:30:00\",\n      \"timezone\": \"Europe/Kyiv\",\n      \"latitude\": 50.45,\n      \"longitude\": 30.52\n    }\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/mcp/tool-call-stream',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'tool': \"chart\",\n      'args': {\n        'date': \"1990-05-15\",\n        'time': \"15:30:00\",\n        'timezone': \"Europe/Kyiv\",\n        'latitude': 50.45,\n        'longitude': 30.52\n      }\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('mcp/tool-call-stream', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'tool' => 'chart',\n        'args' => [\n            'date' => '1990-05-15',\n            'time' => '15:30:00',\n            'timezone' => 'Europe/Kyiv',\n            'latitude' => 50.45,\n            'longitude' => 30.52,\n        ],\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Server-sent events. Each frame is `data: ` followed by a JSON object: `{\"type\":\"tool-start\",\"tool\",\"args\"}`, then `{\"type\":\"progress\",\"stage\",\"text\"}` per stage, then `{\"type\":\"done\",\"tool\",\"language\",\"note\"}`.","content":{"text/event-stream":{"schema":{"type":"string"}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/mcp/multi-agent-coordinate":{"post":{"tags":["MCP Advanced"],"summary":"MCP Multi-Agent Coordinate","description":"Run N personas in parallel + LLM synthesis.","operationId":"mcp_multi-agent-coordinate","x-quality":"green","x-source":"Anthropic Model Context Protocol spec 2025-03 + 8 astrologer personas (Classical/Modern/Evolutionary/Vedic/Humanistic/Hermetic/Cosmobiologist/Horary).","security":[{"ApiKeyAuth":[]}],"parameters":[{"in":"header","name":"X-Provider","required":false,"schema":{"type":"string","enum":["openai","anthropic","google","groq","mistral","openrouter","deepseek","together"]},"description":"Bring your own model key: the LLM provider that should run this completion. Send together with X-Provider-Key or the request is refused: a key with no provider bills us for tokens you meant to pay for, and a provider with no key would look like it worked. The endpoint is fixed per provider on our side and is never taken from the request. There is no fallback to our own chain: if your key fails you get the provider's status and message.","example":"anthropic"},{"in":"header","name":"X-Provider-Key","required":false,"schema":{"type":"string"},"description":"Your own credential for X-Provider. Never logged, stored or cached: it travels in a header because the request body is hashed into two cache keys, and a BYOK turn bypasses both caches in each direction. A provider error that quotes the key back is redacted before it reaches our logs or your response. Such a turn costs 5 credits instead of the endpoint price, and only when a completion actually ran on your key.","example":"sk-ant-..."},{"in":"header","name":"X-Provider-Model","required":false,"schema":{"type":"string","maxLength":120},"description":"Optional model id, overriding the default for that provider. Defaults: openai → gpt-4o-mini, anthropic → claude-sonnet-4-5, google → gemini-2.5-flash, groq → openai/gpt-oss-120b, mistral → mistral-large-latest, openrouter → meta-llama/llama-3.3-70b-instruct, deepseek → deepseek-chat, together → meta-llama/Llama-3.3-70B-Instruct-Turbo.","example":"claude-sonnet-4-5"},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MultiAgent"},"example":{"question":"What does my Saturn placement mean for my career?","agents":["classical","modern"]}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/mcp/multi-agent-coordinate \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"question\": \"What does my Saturn placement mean for my career?\", \"agents\": [ \"classical\", \"modern\" ] }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/mcp/multi-agent-coordinate', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"question\": \"What does my Saturn placement mean for my career?\",\n    \"agents\": [\n      \"classical\",\n      \"modern\"\n    ]\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/mcp/multi-agent-coordinate',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'question': \"What does my Saturn placement mean for my career?\",\n      'agents': [\n        \"classical\",\n        \"modern\"\n      ]\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('mcp/multi-agent-coordinate', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'question' => 'What does my Saturn placement mean for my career?',\n        'agents' => ['classical', 'modern'],\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"individual":{"type":"array","items":{},"nullable":true},"synthesis":{"type":"string","nullable":true}}}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}}}},"/mcp/agent-debate":{"post":{"tags":["MCP Advanced"],"summary":"MCP Agent Debate","description":"2 personas debate a topic, multi-round transcript.","operationId":"mcp_agent-debate","x-quality":"green","x-source":"Anthropic Model Context Protocol spec 2025-03 + 8 astrologer personas (Classical/Modern/Evolutionary/Vedic/Humanistic/Hermetic/Cosmobiologist/Horary).","security":[{"ApiKeyAuth":[]}],"parameters":[{"in":"header","name":"X-Provider","required":false,"schema":{"type":"string","enum":["openai","anthropic","google","groq","mistral","openrouter","deepseek","together"]},"description":"Bring your own model key: the LLM provider that should run this completion. Send together with X-Provider-Key or the request is refused: a key with no provider bills us for tokens you meant to pay for, and a provider with no key would look like it worked. The endpoint is fixed per provider on our side and is never taken from the request. There is no fallback to our own chain: if your key fails you get the provider's status and message.","example":"anthropic"},{"in":"header","name":"X-Provider-Key","required":false,"schema":{"type":"string"},"description":"Your own credential for X-Provider. Never logged, stored or cached: it travels in a header because the request body is hashed into two cache keys, and a BYOK turn bypasses both caches in each direction. A provider error that quotes the key back is redacted before it reaches our logs or your response. Such a turn costs 5 credits instead of the endpoint price, and only when a completion actually ran on your key.","example":"sk-ant-..."},{"in":"header","name":"X-Provider-Model","required":false,"schema":{"type":"string","maxLength":120},"description":"Optional model id, overriding the default for that provider. Defaults: openai → gpt-4o-mini, anthropic → claude-sonnet-4-5, google → gemini-2.5-flash, groq → openai/gpt-oss-120b, mistral → mistral-large-latest, openrouter → meta-llama/llama-3.3-70b-instruct, deepseek → deepseek-chat, together → meta-llama/Llama-3.3-70B-Instruct-Turbo.","example":"claude-sonnet-4-5"},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Debate"},"example":{"topic":"Is the Saturn return a crisis or a rite of passage?","agentA":"classical","agentB":"modern","rounds":2}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/mcp/agent-debate \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"topic\": \"Is the Saturn return a crisis or a rite of passage?\", \"agentA\": \"classical\", \"agentB\": \"modern\", \"rounds\": 2 }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/mcp/agent-debate', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"topic\": \"Is the Saturn return a crisis or a rite of passage?\",\n    \"agentA\": \"classical\",\n    \"agentB\": \"modern\",\n    \"rounds\": 2\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/mcp/agent-debate',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'topic': \"Is the Saturn return a crisis or a rite of passage?\",\n      'agentA': \"classical\",\n      'agentB': \"modern\",\n      'rounds': 2\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('mcp/agent-debate', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'topic' => 'Is the Saturn return a crisis or a rite of passage?',\n        'agentA' => 'classical',\n        'agentB' => 'modern',\n        'rounds' => 2,\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"transcript":{"type":"array","items":{},"nullable":true}}}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}}}},"/mcp/rag-search":{"post":{"tags":["MCP Advanced"],"summary":"MCP RAG Search","description":"Keyword-tag scoring over chart chunks.","operationId":"mcp_rag-search","x-quality":"green","x-source":"Anthropic Model Context Protocol spec 2025-03 + 8 astrologer personas (Classical/Modern/Evolutionary/Vedic/Humanistic/Hermetic/Cosmobiologist/Horary).","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Rag"},"example":{"query":"saturn return meaning","chart":{"date":"1990-05-15","time":"15:30:00","timezone":"Europe/Kyiv","latitude":50.45,"longitude":30.52}}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/mcp/rag-search \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"query\": \"saturn return meaning\", \"chart\": { \"date\": \"1990-05-15\", \"time\": \"15:30:00\", \"timezone\": \"Europe/Kyiv\", \"latitude\": 50.45, \"longitude\": 30.52 } }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/mcp/rag-search', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"query\": \"saturn return meaning\",\n    \"chart\": {\n      \"date\": \"1990-05-15\",\n      \"time\": \"15:30:00\",\n      \"timezone\": \"Europe/Kyiv\",\n      \"latitude\": 50.45,\n      \"longitude\": 30.52\n    }\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/mcp/rag-search',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'query': \"saturn return meaning\",\n      'chart': {\n        'date': \"1990-05-15\",\n        'time': \"15:30:00\",\n        'timezone': \"Europe/Kyiv\",\n        'latitude': 50.45,\n        'longitude': 30.52\n      }\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('mcp/rag-search', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'query' => 'saturn return meaning',\n        'chart' => [\n            'date' => '1990-05-15',\n            'time' => '15:30:00',\n            'timezone' => 'Europe/Kyiv',\n            'latitude' => 50.45,\n            'longitude' => 30.52,\n        ],\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"query":{"type":"string","nullable":true},"tokens":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"total":{"type":"number","nullable":true},"matches":{"type":"number","nullable":true},"results":{"type":"array","items":{"type":"object","properties":{"text":{"type":"string","nullable":true},"tags":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"score":{"type":"number","nullable":true}},"nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"query":"saturn return meaning","tokens":["saturn"],"total":38,"matches":4,"results":[{"text":"Saturn at 295.25° (retrograde)","tags":["saturn"],"score":4}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/mcp/agent-pool-status":{"get":{"tags":["MCP Advanced"],"summary":"MCP Agent Pool Status","description":"8 personas with specialties.","operationId":"mcp_agent-pool-status_get","x-quality":"green","x-source":"Anthropic Model Context Protocol spec 2025-03 + 8 astrologer personas (Classical/Modern/Evolutionary/Vedic/Humanistic/Hermetic/Cosmobiologist/Horary).","security":[{"ApiKeyAuth":[]}],"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X GET https://api.astroway.info/v1/mcp/agent-pool-status \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/mcp/agent-pool-status', {\n  method: 'GET',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.get(\n    'https://api.astroway.info/v1/mcp/agent-pool-status',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->get('mcp/agent-pool-status', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"count":{"type":"number","nullable":true},"personas":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","nullable":true},"label":{"type":"string","nullable":true},"specialties":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"voice":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"note":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"count":8,"personas":[{"id":"classical","label":"Classical Hellenistic","specialties":["lots"],"voice":"Vettius Valens-style: fate, sect, condition."}],"note":"Pass any persona.id to /mcp/multi-agent-coordinate (agents[]) or /mcp/agent-debate (agentA/agentB)."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/agent/tools":{"get":{"tags":["Agent Platform"],"summary":"Agent tool definitions","description":"Tool definitions for an agent framework, generated from the live OpenAPI document, so the schema a model fills is the schema the endpoint validates. `format=openai` (default) returns `{ type, function }` objects you can spread straight into a chat completion; `format=anthropic` returns `{ name, description, input_schema }`. The objects carry nothing of ours: how to call each tool lives in a separate `executors` map keyed by tool name, because an unexpected key inside a vendor tool object is a 400 at their end. `select` chooses what to hand over: the curated starter set by default, `all` for the catalogue, `group:Vedic` for one area, `paths:/chart,/synastry` for an explicit list; `q` filters within that, `limit` caps it (default 32, max 128, which is the OpenAI ceiling). Nothing truncates silently: `totalMatched`, `totalAvailable` and a note say what was left out. No auth is embedded in a tool, so send X-Api-Key on the call itself.","operationId":"agent_tools_get","x-quality":"green","x-source":"The OpenAPI document this API publishes, resolved: $ref inlined, allOf flattened with the override winning, and the OpenAPI 3.0 nullable spelling translated into a JSON Schema type union. Without that a model receives a schema its vendor rejects.","security":[{"ApiKeyAuth":[]}],"parameters":[{"in":"query","name":"format","required":false,"schema":{"type":"string","enum":["openai","anthropic"],"default":"openai"},"description":"Which vendor contract the tool objects follow. `openai` returns `{ type, function }`, `anthropic` returns `{ name, description, input_schema }`."},{"in":"query","name":"select","required":false,"schema":{"type":"string","default":"starter"},"description":"What to hand over: `starter` (the curated set, the default), `all`, `group:<tag>` such as `group:Vedic`, or `paths:/chart,/synastry` for an explicit list. An unknown path is named in `notes` rather than dropped."},{"in":"query","name":"q","required":false,"schema":{"type":"string","maxLength":120},"description":"Free-text filter applied within the selection, matched against path, summary, description and group."},{"in":"query","name":"limit","required":false,"schema":{"type":"integer","minimum":1,"maximum":128,"default":32},"description":"How many tools to return. The ceiling is the OpenAI limit of 128 functions per request; models degrade well before it. Anything left out is counted in `totalMatched`."},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X GET https://api.astroway.info/v1/agent/tools \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/agent/tools', {\n  method: 'GET',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.get(\n    'https://api.astroway.info/v1/agent/tools',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->get('agent/tools', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"format":{"type":"string","nullable":true},"select":{"type":"string","nullable":true},"tools":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","nullable":true},"function":{"type":"object","properties":{"name":{"type":"string","nullable":true},"description":{"type":"string","nullable":true},"parameters":{"type":"object","properties":{"type":{"type":"string","nullable":true},"properties":{"type":"object","properties":{"date":{"type":"object","properties":{"type":{"type":"string","nullable":true},"pattern":{"type":"string","nullable":true}},"nullable":true},"time":{"type":"object","properties":{"type":{"type":"string","nullable":true},"pattern":{"type":"string","nullable":true}},"nullable":true},"timezoneOffset":{"type":"object","properties":{"type":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"minimum":{"type":"number","nullable":true},"maximum":{"type":"number","nullable":true},"default":{"type":"number","nullable":true},"description":{"type":"string","nullable":true}},"nullable":true},"latitude":{"type":"object","properties":{"type":{"type":"string","nullable":true},"minimum":{"type":"number","nullable":true},"maximum":{"type":"number","nullable":true}},"nullable":true},"longitude":{"type":"object","properties":{"type":{"type":"string","nullable":true},"minimum":{"type":"number","nullable":true},"maximum":{"type":"number","nullable":true}},"nullable":true},"houseSystem":{"type":"object","properties":{"type":{"type":"string","nullable":true},"default":{"type":"string","nullable":true}},"nullable":true},"name":{"type":"object","properties":{"type":{"type":"string","nullable":true},"default":{"type":"string","nullable":true}},"nullable":true},"city":{"type":"object","properties":{"type":{"type":"string","nullable":true},"default":{"type":"string","nullable":true}},"nullable":true},"zodiacType":{"type":"object","properties":{"type":{"type":"string","nullable":true},"enum":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}},"nullable":true},"ayanamsaId":{"type":"object","properties":{"type":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}},"nullable":true},"ayanamsa":{"type":"object","properties":{"type":{"type":"string","nullable":true},"enum":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"description":{"type":"string","nullable":true}},"nullable":true},"cosmogram":{"type":"object","properties":{"type":{"type":"string","nullable":true}},"nullable":true},"timeUnknown":{"type":"object","properties":{"type":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"required":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"additionalProperties":{"type":"boolean","nullable":true},"description":{"type":"string","nullable":true}},"nullable":true}},"nullable":true}},"nullable":true},"nullable":true},"executors":{"type":"object","properties":{"astroway_post_chart":{"type":"object","properties":{"method":{"type":"string","nullable":true},"path":{"type":"string","nullable":true},"credits":{"type":"number","nullable":true},"group":{"type":"string","nullable":true},"docs":{"type":"string","nullable":true}},"nullable":true},"astroway_post_planets":{"type":"object","properties":{"method":{"type":"string","nullable":true},"path":{"type":"string","nullable":true},"credits":{"type":"number","nullable":true},"group":{"type":"string","nullable":true},"docs":{"type":"string","nullable":true}},"nullable":true},"astroway_post_sun_times":{"type":"object","properties":{"method":{"type":"string","nullable":true},"path":{"type":"string","nullable":true},"credits":{"type":"number","nullable":true},"group":{"type":"string","nullable":true},"docs":{"type":"string","nullable":true}},"nullable":true},"astroway_post_synastry":{"type":"object","properties":{"method":{"type":"string","nullable":true},"path":{"type":"string","nullable":true},"credits":{"type":"number","nullable":true},"group":{"type":"string","nullable":true},"docs":{"type":"string","nullable":true}},"nullable":true},"astroway_post_composite":{"type":"object","properties":{"method":{"type":"string","nullable":true},"path":{"type":"string","nullable":true},"credits":{"type":"number","nullable":true},"group":{"type":"string","nullable":true},"docs":{"type":"string","nullable":true}},"nullable":true},"astroway_post_synastry_attraction_score":{"type":"object","properties":{"method":{"type":"string","nullable":true},"path":{"type":"string","nullable":true},"credits":{"type":"number","nullable":true},"group":{"type":"string","nullable":true},"docs":{"type":"string","nullable":true}},"nullable":true},"astroway_post_transits":{"type":"object","properties":{"method":{"type":"string","nullable":true},"path":{"type":"string","nullable":true},"credits":{"type":"number","nullable":true},"group":{"type":"string","nullable":true},"docs":{"type":"string","nullable":true}},"nullable":true},"astroway_post_transit_calendar":{"type":"object","properties":{"method":{"type":"string","nullable":true},"path":{"type":"string","nullable":true},"credits":{"type":"number","nullable":true},"group":{"type":"string","nullable":true},"docs":{"type":"string","nullable":true}},"nullable":true},"astroway_post_forecast_calendar":{"type":"object","properties":{"method":{"type":"string","nullable":true},"path":{"type":"string","nullable":true},"credits":{"type":"number","nullable":true},"group":{"type":"string","nullable":true},"docs":{"type":"string","nullable":true}},"nullable":true},"astroway_post_solar_return":{"type":"object","properties":{"method":{"type":"string","nullable":true},"path":{"type":"string","nullable":true},"credits":{"type":"number","nullable":true},"group":{"type":"string","nullable":true},"docs":{"type":"string","nullable":true}},"nullable":true},"astroway_post_render_wheel_western":{"type":"object","properties":{"method":{"type":"string","nullable":true},"path":{"type":"string","nullable":true},"credits":{"type":"number","nullable":true},"group":{"type":"string","nullable":true},"docs":{"type":"string","nullable":true}},"nullable":true},"astroway_post_moon_phase":{"type":"object","properties":{"method":{"type":"string","nullable":true},"path":{"type":"string","nullable":true},"credits":{"type":"number","nullable":true},"group":{"type":"string","nullable":true},"docs":{"type":"string","nullable":true}},"nullable":true},"astroway_post_human_design":{"type":"object","properties":{"method":{"type":"string","nullable":true},"path":{"type":"string","nullable":true},"credits":{"type":"number","nullable":true},"group":{"type":"string","nullable":true},"docs":{"type":"string","nullable":true}},"nullable":true},"astroway_post_hd_penta":{"type":"object","properties":{"method":{"type":"string","nullable":true},"path":{"type":"string","nullable":true},"credits":{"type":"number","nullable":true},"group":{"type":"string","nullable":true},"docs":{"type":"string","nullable":true}},"nullable":true},"astroway_post_vedic_varga_D1":{"type":"object","properties":{"method":{"type":"string","nullable":true},"path":{"type":"string","nullable":true},"credits":{"type":"number","nullable":true},"group":{"type":"string","nullable":true},"docs":{"type":"string","nullable":true}},"nullable":true},"astroway_post_vedic_varga_D9":{"type":"object","properties":{"method":{"type":"string","nullable":true},"path":{"type":"string","nullable":true},"credits":{"type":"number","nullable":true},"group":{"type":"string","nullable":true},"docs":{"type":"string","nullable":true}},"nullable":true},"astroway_post_vedic_panchang_full":{"type":"object","properties":{"method":{"type":"string","nullable":true},"path":{"type":"string","nullable":true},"credits":{"type":"number","nullable":true},"group":{"type":"string","nullable":true},"docs":{"type":"string","nullable":true}},"nullable":true},"astroway_post_vedic_dashas_vimshottari_maha":{"type":"object","properties":{"method":{"type":"string","nullable":true},"path":{"type":"string","nullable":true},"credits":{"type":"number","nullable":true},"group":{"type":"string","nullable":true},"docs":{"type":"string","nullable":true}},"nullable":true},"astroway_post_horoscope_daily":{"type":"object","properties":{"method":{"type":"string","nullable":true},"path":{"type":"string","nullable":true},"credits":{"type":"number","nullable":true},"group":{"type":"string","nullable":true},"docs":{"type":"string","nullable":true}},"nullable":true},"astroway_post_numerology_pythagorean_life_path":{"type":"object","properties":{"method":{"type":"string","nullable":true},"path":{"type":"string","nullable":true},"credits":{"type":"number","nullable":true},"group":{"type":"string","nullable":true},"docs":{"type":"string","nullable":true}},"nullable":true},"astroway_post_numerology_pythagorean_expression":{"type":"object","properties":{"method":{"type":"string","nullable":true},"path":{"type":"string","nullable":true},"credits":{"type":"number","nullable":true},"group":{"type":"string","nullable":true},"docs":{"type":"string","nullable":true}},"nullable":true},"astroway_post_numerology_chaldean_life_path":{"type":"object","properties":{"method":{"type":"string","nullable":true},"path":{"type":"string","nullable":true},"credits":{"type":"number","nullable":true},"group":{"type":"string","nullable":true},"docs":{"type":"string","nullable":true}},"nullable":true},"astroway_post_tarot_rider_waite_draw_single":{"type":"object","properties":{"method":{"type":"string","nullable":true},"path":{"type":"string","nullable":true},"credits":{"type":"number","nullable":true},"group":{"type":"string","nullable":true},"docs":{"type":"string","nullable":true}},"nullable":true},"astroway_post_tarot_rider_waite_draw_three_card":{"type":"object","properties":{"method":{"type":"string","nullable":true},"path":{"type":"string","nullable":true},"credits":{"type":"number","nullable":true},"group":{"type":"string","nullable":true},"docs":{"type":"string","nullable":true}},"nullable":true},"astroway_post_reports_natal":{"type":"object","properties":{"method":{"type":"string","nullable":true},"path":{"type":"string","nullable":true},"credits":{"type":"number","nullable":true},"group":{"type":"string","nullable":true},"docs":{"type":"string","nullable":true}},"nullable":true},"astroway_post_ai_explain_aspect":{"type":"object","properties":{"method":{"type":"string","nullable":true},"path":{"type":"string","nullable":true},"credits":{"type":"number","nullable":true},"group":{"type":"string","nullable":true},"docs":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"count":{"type":"number","nullable":true},"totalMatched":{"type":"number","nullable":true},"totalAvailable":{"type":"number","nullable":true},"truncated":{"type":"boolean","nullable":true},"notes":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}}}}},"example":{"ok":true,"data":{"format":"openai","select":"starter","tools":[{"type":"function","function":{"name":"astroway_post_chart","description":"Natal Chart. Calculate a full natal chart: planets, house cusps, aspects, sect, and angular data for a given birth moment. When the birth time is unknown, send timeUnknown: true instead of time and the response carries planets and aspects with houses, angles and sect set to null, plus a timeUnknown block giving the ran…","parameters":{"type":"object","properties":{"date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"time":{"type":"string","pattern":"^\\d{2}:\\d{2}:\\d{2}$"},"timezoneOffset":{"type":["number"],"minimum":-14,"maximum":14,"default":0,"description":"Hours from UTC at the given moment, not minutes. Fractional zones are hours too: 5.5 for India, 5.75 for Nepal, -3.5 for Newfoundland. Defaults to 0, meaning UTC."},"latitude":{"type":"number","minimum":-90,"maximum":90},"longitude":{"type":"number","minimum":-180,"maximum":180},"houseSystem":{"type":"string","default":"P"},"name":{"type":"string","default":""},"city":{"type":"string","default":""},"zodiacType":{"type":"string","enum":["tropical"]},"ayanamsaId":{"type":["number"]},"ayanamsa":{"type":"string","enum":["fagan-bradley"],"description":"Sidereal school by name. Lahiri when omitted. Equivalent to ayanamsaId; send either."},"cosmogram":{"type":"boolean"},"timeUnknown":{"type":"boolean"}},"required":["date"],"additionalProperties":true,"description":"Birth data where the clock time may be unknown. Either pass time (HH:mm:ss), or set timeUnknown: true and omit it. In the second case the response carries planets and aspects but no houses, angles or sect."}}}],"executors":{"astroway_post_chart":{"method":"POST","path":"/v1/chart","credits":20,"group":"Core","docs":"https://api.astroway.info/docs/api/chart"},"astroway_post_planets":{"method":"POST","path":"/v1/planets","credits":10,"group":"Core","docs":"https://api.astroway.info/docs/api/planets"},"astroway_post_sun_times":{"method":"POST","path":"/v1/sun-times","credits":10,"group":"Core","docs":"https://api.astroway.info/docs/api/sun-times"},"astroway_post_synastry":{"method":"POST","path":"/v1/synastry","credits":50,"group":"Comparisons","docs":"https://api.astroway.info/docs/api/synastry"},"astroway_post_composite":{"method":"POST","path":"/v1/composite","credits":50,"group":"Comparisons","docs":"https://api.astroway.info/docs/api/composite"},"astroway_post_synastry_attraction_score":{"method":"POST","path":"/v1/synastry/attraction-score","credits":50,"group":"Comparisons","docs":"https://api.astroway.info/docs/api/synastry/attraction-score"},"astroway_post_transits":{"method":"POST","path":"/v1/transits","credits":50,"group":"Prognostics","docs":"https://api.astroway.info/docs/api/transits"},"astroway_post_transit_calendar":{"method":"POST","path":"/v1/transit-calendar","credits":100,"group":"Prognostics","docs":"https://api.astroway.info/docs/api/transit-calendar"},"astroway_post_forecast_calendar":{"method":"POST","path":"/v1/forecast-calendar","credits":100,"group":"Prognostics","docs":"https://api.astroway.info/docs/api/forecast-calendar"},"astroway_post_solar_return":{"method":"POST","path":"/v1/solar-return","credits":50,"group":"Prognostics","docs":"https://api.astroway.info/docs/api/solar-return"},"astroway_post_render_wheel_western":{"method":"POST","path":"/v1/render/wheel-western","credits":10,"group":"Visualization","docs":"https://api.astroway.info/docs/api/render/wheel-western"},"astroway_post_moon_phase":{"method":"POST","path":"/v1/moon-phase","credits":10,"group":"Calendar & Cycles","docs":"https://api.astroway.info/docs/api/moon-phase"},"astroway_post_human_design":{"method":"POST","path":"/v1/human-design","credits":50,"group":"Human Design","docs":"https://api.astroway.info/docs/api/human-design"},"astroway_post_hd_penta":{"method":"POST","path":"/v1/hd/penta","credits":100,"group":"Human Design","docs":"https://api.astroway.info/docs/api/hd/penta"},"astroway_post_vedic_varga_D1":{"method":"POST","path":"/v1/vedic/varga/D1","credits":20,"group":"Vedic","docs":"https://api.astroway.info/docs/api/vedic/varga/D1"},"astroway_post_vedic_varga_D9":{"method":"POST","path":"/v1/vedic/varga/D9","credits":20,"group":"Vedic","docs":"https://api.astroway.info/docs/api/vedic/varga/D9"},"astroway_post_vedic_panchang_full":{"method":"POST","path":"/v1/vedic/panchang/full","credits":20,"group":"Vedic","docs":"https://api.astroway.info/docs/api/vedic/panchang/full"},"astroway_post_vedic_dashas_vimshottari_maha":{"method":"POST","path":"/v1/vedic/dashas/vimshottari/maha","credits":20,"group":"Vedic","docs":"https://api.astroway.info/docs/api/vedic/dashas/vimshottari/maha"},"astroway_post_horoscope_daily":{"method":"POST","path":"/v1/horoscope/daily","credits":50,"group":"Horoscope","docs":"https://api.astroway.info/docs/api/horoscope/daily"},"astroway_post_numerology_pythagorean_life_path":{"method":"POST","path":"/v1/numerology/pythagorean/life-path","credits":10,"group":"Numerology: Pythagorean","docs":"https://api.astroway.info/docs/api/numerology/pythagorean/life-path"},"astroway_post_numerology_pythagorean_expression":{"method":"POST","path":"/v1/numerology/pythagorean/expression","credits":10,"group":"Numerology: Pythagorean","docs":"https://api.astroway.info/docs/api/numerology/pythagorean/expression"},"astroway_post_numerology_chaldean_life_path":{"method":"POST","path":"/v1/numerology/chaldean/life-path","credits":10,"group":"Numerology: Chaldean","docs":"https://api.astroway.info/docs/api/numerology/chaldean/life-path"},"astroway_post_tarot_rider_waite_draw_single":{"method":"POST","path":"/v1/tarot/rider-waite/draw/single","credits":10,"group":"Tarot: Rider-Waite-Smith","docs":"https://api.astroway.info/docs/api/tarot/rider-waite/draw/single"},"astroway_post_tarot_rider_waite_draw_three_card":{"method":"POST","path":"/v1/tarot/rider-waite/draw/three-card","credits":10,"group":"Tarot: Rider-Waite-Smith","docs":"https://api.astroway.info/docs/api/tarot/rider-waite/draw/three-card"},"astroway_post_reports_natal":{"method":"POST","path":"/v1/reports/natal","credits":5000,"group":"Reports","docs":"https://api.astroway.info/docs/api/reports/natal"},"astroway_post_ai_explain_aspect":{"method":"POST","path":"/v1/ai/explain-aspect","credits":100,"group":"AI & MCP","docs":"https://api.astroway.info/docs/api/ai/explain-aspect"}},"count":26,"totalMatched":26,"totalAvailable":760,"truncated":false,"notes":["Tools carry no auth. Send X-Api-Key on the call itself, exactly as for a direct request."]}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}}}},"/geomancy/via":{"post":{"tags":["Geomancy (Agrippa)"],"summary":"Via: The Way","description":"Movement, change, journey.","operationId":"geomancy_via","x-quality":"green","x-source":"Heinrich Cornelius Agrippa \"De Occulta Philosophia Libri Tres\" 1531 Book III ch. 33 (PD) + John Heydon \"Theomagia\" 1664 (PD) + Stephen Skinner \"Terrestrial Astrology\" 1980.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmptyBody"},"example":{}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/geomancy/via \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{}'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/geomancy/via', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({}),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/geomancy/via',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('geomancy/via', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"figure":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"latin":{"type":"string","nullable":true},"english":{"type":"string","nullable":true},"pattern":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"ruler":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"sign":{"type":"string","nullable":true},"nature":{"type":"string","nullable":true},"meaning":{"type":"string","nullable":true},"positive":{"type":"string","nullable":true},"negative":{"type":"string","nullable":true},"divinatory":{"type":"string","nullable":true}},"nullable":true},"source":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"figure":{"slug":"via","latin":"Via","english":"The Way","pattern":[1],"ruler":"Moon","element":"water","sign":"Cancer","nature":"mixed","meaning":"movement, change, journey","positive":"progress, new directions, travel","negative":"instability, restlessness","divinatory":"change is coming; nothing stays in place"},"source":"Agrippa \"De Occulta Philosophia\" 1531 + Skinner \"Terrestrial Astrology\" 1980"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/geomancy/populus":{"post":{"tags":["Geomancy (Agrippa)"],"summary":"Populus: The People","description":"Crowd, gathering, public.","operationId":"geomancy_populus","x-quality":"green","x-source":"Heinrich Cornelius Agrippa \"De Occulta Philosophia Libri Tres\" 1531 Book III ch. 33 (PD) + John Heydon \"Theomagia\" 1664 (PD) + Stephen Skinner \"Terrestrial Astrology\" 1980.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmptyBody"},"example":{}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/geomancy/populus \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{}'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/geomancy/populus', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({}),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/geomancy/populus',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('geomancy/populus', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"figure":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"latin":{"type":"string","nullable":true},"english":{"type":"string","nullable":true},"pattern":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"ruler":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"sign":{"type":"string","nullable":true},"nature":{"type":"string","nullable":true},"meaning":{"type":"string","nullable":true},"positive":{"type":"string","nullable":true},"negative":{"type":"string","nullable":true},"divinatory":{"type":"string","nullable":true}},"nullable":true},"source":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"figure":{"slug":"populus","latin":"Populus","english":"The People","pattern":[2],"ruler":"Moon","element":"water","sign":"Cancer","nature":"mixed","meaning":"crowd, gathering, public","positive":"community support, large groups","negative":"mob mentality, indecision","divinatory":"a multitude or assembly is involved"},"source":"Agrippa \"De Occulta Philosophia\" 1531 + Skinner \"Terrestrial Astrology\" 1980"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/geomancy/albus":{"post":{"tags":["Geomancy (Agrippa)"],"summary":"Albus: White","description":"Wisdom, peace, clarity.","operationId":"geomancy_albus","x-quality":"green","x-source":"Heinrich Cornelius Agrippa \"De Occulta Philosophia Libri Tres\" 1531 Book III ch. 33 (PD) + John Heydon \"Theomagia\" 1664 (PD) + Stephen Skinner \"Terrestrial Astrology\" 1980.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmptyBody"},"example":{}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/geomancy/albus \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{}'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/geomancy/albus', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({}),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/geomancy/albus',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('geomancy/albus', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"figure":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"latin":{"type":"string","nullable":true},"english":{"type":"string","nullable":true},"pattern":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"ruler":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"sign":{"type":"string","nullable":true},"nature":{"type":"string","nullable":true},"meaning":{"type":"string","nullable":true},"positive":{"type":"string","nullable":true},"negative":{"type":"string","nullable":true},"divinatory":{"type":"string","nullable":true}},"nullable":true},"source":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"figure":{"slug":"albus","latin":"Albus","english":"White","pattern":[2],"ruler":"Mercury","element":"water","sign":"Gemini","nature":"good","meaning":"wisdom, peace, clarity","positive":"good counsel, wise decisions","negative":"detachment, over-thinking","divinatory":"truth is revealed; favourable for thought"},"source":"Agrippa \"De Occulta Philosophia\" 1531 + Skinner \"Terrestrial Astrology\" 1980"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/geomancy/rubeus":{"post":{"tags":["Geomancy (Agrippa)"],"summary":"Rubeus: Red","description":"Passion, anger, blood: ill omen.","operationId":"geomancy_rubeus","x-quality":"green","x-source":"Heinrich Cornelius Agrippa \"De Occulta Philosophia Libri Tres\" 1531 Book III ch. 33 (PD) + John Heydon \"Theomagia\" 1664 (PD) + Stephen Skinner \"Terrestrial Astrology\" 1980.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmptyBody"},"example":{}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/geomancy/rubeus \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{}'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/geomancy/rubeus', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({}),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/geomancy/rubeus',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('geomancy/rubeus', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"figure":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"latin":{"type":"string","nullable":true},"english":{"type":"string","nullable":true},"pattern":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"ruler":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"sign":{"type":"string","nullable":true},"nature":{"type":"string","nullable":true},"meaning":{"type":"string","nullable":true},"positive":{"type":"string","nullable":true},"negative":{"type":"string","nullable":true},"divinatory":{"type":"string","nullable":true}},"nullable":true},"source":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"figure":{"slug":"rubeus","latin":"Rubeus","english":"Red","pattern":[1],"ruler":"Mars","element":"water","sign":"Scorpio","nature":"evil","meaning":"passion, anger, blood","positive":"intensity, courage in struggle","negative":"violence, lust, deceit","divinatory":"reverse a chart; ill omen for most matters"},"source":"Agrippa \"De Occulta Philosophia\" 1531 + Skinner \"Terrestrial Astrology\" 1980"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/geomancy/coniunctio":{"post":{"tags":["Geomancy (Agrippa)"],"summary":"Coniunctio: Conjunction","description":"Union, meeting, partnership.","operationId":"geomancy_coniunctio","x-quality":"green","x-source":"Heinrich Cornelius Agrippa \"De Occulta Philosophia Libri Tres\" 1531 Book III ch. 33 (PD) + John Heydon \"Theomagia\" 1664 (PD) + Stephen Skinner \"Terrestrial Astrology\" 1980.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmptyBody"},"example":{}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/geomancy/coniunctio \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{}'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/geomancy/coniunctio', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({}),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/geomancy/coniunctio',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('geomancy/coniunctio', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"figure":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"latin":{"type":"string","nullable":true},"english":{"type":"string","nullable":true},"pattern":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"ruler":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"sign":{"type":"string","nullable":true},"nature":{"type":"string","nullable":true},"meaning":{"type":"string","nullable":true},"positive":{"type":"string","nullable":true},"negative":{"type":"string","nullable":true},"divinatory":{"type":"string","nullable":true}},"nullable":true},"source":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"figure":{"slug":"coniunctio","latin":"Coniunctio","english":"Conjunction","pattern":[2],"ruler":"Mercury","element":"earth","sign":"Virgo","nature":"mixed","meaning":"union, meeting, partnership","positive":"connection, recovery of what was lost","negative":"entanglement, confusion","divinatory":"two come together; outcome depends on partner"},"source":"Agrippa \"De Occulta Philosophia\" 1531 + Skinner \"Terrestrial Astrology\" 1980"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/geomancy/puella":{"post":{"tags":["Geomancy (Agrippa)"],"summary":"Puella: Girl","description":"Beauty, harmony, love.","operationId":"geomancy_puella","x-quality":"green","x-source":"Heinrich Cornelius Agrippa \"De Occulta Philosophia Libri Tres\" 1531 Book III ch. 33 (PD) + John Heydon \"Theomagia\" 1664 (PD) + Stephen Skinner \"Terrestrial Astrology\" 1980.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmptyBody"},"example":{}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/geomancy/puella \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{}'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/geomancy/puella', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({}),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/geomancy/puella',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('geomancy/puella', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"figure":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"latin":{"type":"string","nullable":true},"english":{"type":"string","nullable":true},"pattern":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"ruler":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"sign":{"type":"string","nullable":true},"nature":{"type":"string","nullable":true},"meaning":{"type":"string","nullable":true},"positive":{"type":"string","nullable":true},"negative":{"type":"string","nullable":true},"divinatory":{"type":"string","nullable":true}},"nullable":true},"source":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"figure":{"slug":"puella","latin":"Puella","english":"Girl","pattern":[2],"ruler":"Venus","element":"air","sign":"Libra","nature":"good","meaning":"beauty, harmony, love","positive":"pleasure, attraction, fertility","negative":"vanity, superficiality","divinatory":"gentle, favourable; love and beauty"},"source":"Agrippa \"De Occulta Philosophia\" 1531 + Skinner \"Terrestrial Astrology\" 1980"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/geomancy/amissio":{"post":{"tags":["Geomancy (Agrippa)"],"summary":"Amissio: Loss","description":"Loss, letting go, slipping away.","operationId":"geomancy_amissio","x-quality":"green","x-source":"Heinrich Cornelius Agrippa \"De Occulta Philosophia Libri Tres\" 1531 Book III ch. 33 (PD) + John Heydon \"Theomagia\" 1664 (PD) + Stephen Skinner \"Terrestrial Astrology\" 1980.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmptyBody"},"example":{}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/geomancy/amissio \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{}'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/geomancy/amissio', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({}),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/geomancy/amissio',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('geomancy/amissio', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"figure":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"latin":{"type":"string","nullable":true},"english":{"type":"string","nullable":true},"pattern":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"ruler":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"sign":{"type":"string","nullable":true},"nature":{"type":"string","nullable":true},"meaning":{"type":"string","nullable":true},"positive":{"type":"string","nullable":true},"negative":{"type":"string","nullable":true},"divinatory":{"type":"string","nullable":true}},"nullable":true},"source":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"figure":{"slug":"amissio","latin":"Amissio","english":"Loss","pattern":[1],"ruler":"Venus","element":"earth","sign":"Taurus","nature":"evil","meaning":"loss, letting go, things slipping away","positive":"release of burden, freedom","negative":"theft, financial loss, end of love","divinatory":"good for letting go; bad for keeping"},"source":"Agrippa \"De Occulta Philosophia\" 1531 + Skinner \"Terrestrial Astrology\" 1980"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/geomancy/fortuna-major":{"post":{"tags":["Geomancy (Agrippa)"],"summary":"Fortuna Major","description":"Greater Fortune: lasting success.","operationId":"geomancy_fortuna-major","x-quality":"green","x-source":"Heinrich Cornelius Agrippa \"De Occulta Philosophia Libri Tres\" 1531 Book III ch. 33 (PD) + John Heydon \"Theomagia\" 1664 (PD) + Stephen Skinner \"Terrestrial Astrology\" 1980.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmptyBody"},"example":{}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/geomancy/fortuna-major \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{}'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/geomancy/fortuna-major', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({}),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/geomancy/fortuna-major',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('geomancy/fortuna-major', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"figure":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"latin":{"type":"string","nullable":true},"english":{"type":"string","nullable":true},"pattern":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"ruler":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"sign":{"type":"string","nullable":true},"nature":{"type":"string","nullable":true},"meaning":{"type":"string","nullable":true},"positive":{"type":"string","nullable":true},"negative":{"type":"string","nullable":true},"divinatory":{"type":"string","nullable":true}},"nullable":true},"source":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"figure":{"slug":"fortuna-major","latin":"Fortuna Major","english":"Greater Fortune","pattern":[1],"ruler":"Sun","element":"fire","sign":"Leo","nature":"good","meaning":"great success, inner strength","positive":"lasting victory, recognition","negative":"pride, arrogance","divinatory":"success that takes time but endures"},"source":"Agrippa \"De Occulta Philosophia\" 1531 + Skinner \"Terrestrial Astrology\" 1980"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/geomancy/fortuna-minor":{"post":{"tags":["Geomancy (Agrippa)"],"summary":"Fortuna Minor","description":"Lesser Fortune: quick gains.","operationId":"geomancy_fortuna-minor","x-quality":"green","x-source":"Heinrich Cornelius Agrippa \"De Occulta Philosophia Libri Tres\" 1531 Book III ch. 33 (PD) + John Heydon \"Theomagia\" 1664 (PD) + Stephen Skinner \"Terrestrial Astrology\" 1980.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmptyBody"},"example":{}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/geomancy/fortuna-minor \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{}'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/geomancy/fortuna-minor', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({}),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/geomancy/fortuna-minor',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('geomancy/fortuna-minor', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"figure":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"latin":{"type":"string","nullable":true},"english":{"type":"string","nullable":true},"pattern":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"ruler":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"sign":{"type":"string","nullable":true},"nature":{"type":"string","nullable":true},"meaning":{"type":"string","nullable":true},"positive":{"type":"string","nullable":true},"negative":{"type":"string","nullable":true},"divinatory":{"type":"string","nullable":true}},"nullable":true},"source":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"figure":{"slug":"fortuna-minor","latin":"Fortuna Minor","english":"Lesser Fortune","pattern":[2],"ruler":"Sun","element":"fire","sign":"Leo","nature":"good","meaning":"quick success, fleeting fortune","positive":"fast results, momentum","negative":"short-lived gains, instability","divinatory":"win quickly but exit quickly"},"source":"Agrippa \"De Occulta Philosophia\" 1531 + Skinner \"Terrestrial Astrology\" 1980"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/geomancy/acquisitio":{"post":{"tags":["Geomancy (Agrippa)"],"summary":"Acquisitio: Gain","description":"Gain, profit, abundance.","operationId":"geomancy_acquisitio","x-quality":"green","x-source":"Heinrich Cornelius Agrippa \"De Occulta Philosophia Libri Tres\" 1531 Book III ch. 33 (PD) + John Heydon \"Theomagia\" 1664 (PD) + Stephen Skinner \"Terrestrial Astrology\" 1980.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmptyBody"},"example":{}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/geomancy/acquisitio \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{}'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/geomancy/acquisitio', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({}),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/geomancy/acquisitio',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('geomancy/acquisitio', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"figure":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"latin":{"type":"string","nullable":true},"english":{"type":"string","nullable":true},"pattern":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"ruler":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"sign":{"type":"string","nullable":true},"nature":{"type":"string","nullable":true},"meaning":{"type":"string","nullable":true},"positive":{"type":"string","nullable":true},"negative":{"type":"string","nullable":true},"divinatory":{"type":"string","nullable":true}},"nullable":true},"source":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"figure":{"slug":"acquisitio","latin":"Acquisitio","english":"Gain","pattern":[2],"ruler":"Jupiter","element":"air","sign":"Sagittarius","nature":"good","meaning":"gain, profit, abundance","positive":"wealth, opportunity, expansion","negative":"greed, materialism","divinatory":"gain comes; favourable for trade and money"},"source":"Agrippa \"De Occulta Philosophia\" 1531 + Skinner \"Terrestrial Astrology\" 1980"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/geomancy/carcer":{"post":{"tags":["Geomancy (Agrippa)"],"summary":"Carcer: Prison","description":"Restriction, confinement, isolation.","operationId":"geomancy_carcer","x-quality":"green","x-source":"Heinrich Cornelius Agrippa \"De Occulta Philosophia Libri Tres\" 1531 Book III ch. 33 (PD) + John Heydon \"Theomagia\" 1664 (PD) + Stephen Skinner \"Terrestrial Astrology\" 1980.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmptyBody"},"example":{}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/geomancy/carcer \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{}'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/geomancy/carcer', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({}),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/geomancy/carcer',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('geomancy/carcer', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"figure":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"latin":{"type":"string","nullable":true},"english":{"type":"string","nullable":true},"pattern":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"ruler":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"sign":{"type":"string","nullable":true},"nature":{"type":"string","nullable":true},"meaning":{"type":"string","nullable":true},"positive":{"type":"string","nullable":true},"negative":{"type":"string","nullable":true},"divinatory":{"type":"string","nullable":true}},"nullable":true},"source":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"figure":{"slug":"carcer","latin":"Carcer","english":"Prison","pattern":[2],"ruler":"Saturn","element":"earth","sign":"Capricorn","nature":"evil","meaning":"restriction, confinement, isolation","positive":"discipline, focus, structure","negative":"imprisonment, stagnation","divinatory":"things are stuck; no movement"},"source":"Agrippa \"De Occulta Philosophia\" 1531 + Skinner \"Terrestrial Astrology\" 1980"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/geomancy/tristitia":{"post":{"tags":["Geomancy (Agrippa)"],"summary":"Tristitia: Sorrow","description":"Sadness, depression, melancholy.","operationId":"geomancy_tristitia","x-quality":"green","x-source":"Heinrich Cornelius Agrippa \"De Occulta Philosophia Libri Tres\" 1531 Book III ch. 33 (PD) + John Heydon \"Theomagia\" 1664 (PD) + Stephen Skinner \"Terrestrial Astrology\" 1980.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmptyBody"},"example":{}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/geomancy/tristitia \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{}'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/geomancy/tristitia', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({}),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/geomancy/tristitia',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('geomancy/tristitia', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"figure":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"latin":{"type":"string","nullable":true},"english":{"type":"string","nullable":true},"pattern":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"ruler":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"sign":{"type":"string","nullable":true},"nature":{"type":"string","nullable":true},"meaning":{"type":"string","nullable":true},"positive":{"type":"string","nullable":true},"negative":{"type":"string","nullable":true},"divinatory":{"type":"string","nullable":true}},"nullable":true},"source":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"figure":{"slug":"tristitia","latin":"Tristitia","english":"Sorrow","pattern":[1],"ruler":"Saturn","element":"earth","sign":"Aquarius","nature":"evil","meaning":"sadness, depression, melancholy","positive":"depth, contemplation, endurance","negative":"grief, loss, despair","divinatory":"sorrow but durable; foundations hold"},"source":"Agrippa \"De Occulta Philosophia\" 1531 + Skinner \"Terrestrial Astrology\" 1980"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/geomancy/laetitia":{"post":{"tags":["Geomancy (Agrippa)"],"summary":"Laetitia: Joy","description":"Happiness, optimism, healing.","operationId":"geomancy_laetitia","x-quality":"green","x-source":"Heinrich Cornelius Agrippa \"De Occulta Philosophia Libri Tres\" 1531 Book III ch. 33 (PD) + John Heydon \"Theomagia\" 1664 (PD) + Stephen Skinner \"Terrestrial Astrology\" 1980.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmptyBody"},"example":{}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/geomancy/laetitia \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{}'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/geomancy/laetitia', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({}),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/geomancy/laetitia',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('geomancy/laetitia', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"figure":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"latin":{"type":"string","nullable":true},"english":{"type":"string","nullable":true},"pattern":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"ruler":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"sign":{"type":"string","nullable":true},"nature":{"type":"string","nullable":true},"meaning":{"type":"string","nullable":true},"positive":{"type":"string","nullable":true},"negative":{"type":"string","nullable":true},"divinatory":{"type":"string","nullable":true}},"nullable":true},"source":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"figure":{"slug":"laetitia","latin":"Laetitia","english":"Joy","pattern":[1],"ruler":"Jupiter","element":"fire","sign":"Pisces","nature":"good","meaning":"happiness, optimism, healing","positive":"celebration, recovery, hope","negative":"over-optimism, denial","divinatory":"joy and elevation; favourable for healing"},"source":"Agrippa \"De Occulta Philosophia\" 1531 + Skinner \"Terrestrial Astrology\" 1980"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/geomancy/cauda-draconis":{"post":{"tags":["Geomancy (Agrippa)"],"summary":"Cauda Draconis","description":"Dragon's Tail: endings, exit.","operationId":"geomancy_cauda-draconis","x-quality":"green","x-source":"Heinrich Cornelius Agrippa \"De Occulta Philosophia Libri Tres\" 1531 Book III ch. 33 (PD) + John Heydon \"Theomagia\" 1664 (PD) + Stephen Skinner \"Terrestrial Astrology\" 1980.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmptyBody"},"example":{}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/geomancy/cauda-draconis \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{}'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/geomancy/cauda-draconis', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({}),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/geomancy/cauda-draconis',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('geomancy/cauda-draconis', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"figure":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"latin":{"type":"string","nullable":true},"english":{"type":"string","nullable":true},"pattern":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"ruler":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"sign":{"type":"string","nullable":true},"nature":{"type":"string","nullable":true},"meaning":{"type":"string","nullable":true},"positive":{"type":"string","nullable":true},"negative":{"type":"string","nullable":true},"divinatory":{"type":"string","nullable":true}},"nullable":true},"source":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"figure":{"slug":"cauda-draconis","latin":"Cauda Draconis","english":"Dragon's Tail","pattern":[1],"ruler":"South Node","element":"fire","sign":"Sagittarius","nature":"evil","meaning":"endings, exit, release","positive":"good for completion, leaving behind","negative":"bad for beginnings, treachery","divinatory":"closing of cycle; bad for starting"},"source":"Agrippa \"De Occulta Philosophia\" 1531 + Skinner \"Terrestrial Astrology\" 1980"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/geomancy/caput-draconis":{"post":{"tags":["Geomancy (Agrippa)"],"summary":"Caput Draconis","description":"Dragon's Head: beginnings, threshold.","operationId":"geomancy_caput-draconis","x-quality":"green","x-source":"Heinrich Cornelius Agrippa \"De Occulta Philosophia Libri Tres\" 1531 Book III ch. 33 (PD) + John Heydon \"Theomagia\" 1664 (PD) + Stephen Skinner \"Terrestrial Astrology\" 1980.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmptyBody"},"example":{}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/geomancy/caput-draconis \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{}'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/geomancy/caput-draconis', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({}),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/geomancy/caput-draconis',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('geomancy/caput-draconis', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"figure":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"latin":{"type":"string","nullable":true},"english":{"type":"string","nullable":true},"pattern":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"ruler":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"sign":{"type":"string","nullable":true},"nature":{"type":"string","nullable":true},"meaning":{"type":"string","nullable":true},"positive":{"type":"string","nullable":true},"negative":{"type":"string","nullable":true},"divinatory":{"type":"string","nullable":true}},"nullable":true},"source":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"figure":{"slug":"caput-draconis","latin":"Caput Draconis","english":"Dragon's Head","pattern":[2],"ruler":"North Node","element":"earth","sign":"Virgo","nature":"good","meaning":"beginnings, entry, threshold","positive":"auspicious start, new ventures","negative":"bad for endings, premature","divinatory":"start of cycle; favourable for new things"},"source":"Agrippa \"De Occulta Philosophia\" 1531 + Skinner \"Terrestrial Astrology\" 1980"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/geomancy/puer":{"post":{"tags":["Geomancy (Agrippa)"],"summary":"Puer: Boy","description":"Young man, energy, impulse.","operationId":"geomancy_puer","x-quality":"green","x-source":"Heinrich Cornelius Agrippa \"De Occulta Philosophia Libri Tres\" 1531 Book III ch. 33 (PD) + John Heydon \"Theomagia\" 1664 (PD) + Stephen Skinner \"Terrestrial Astrology\" 1980.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmptyBody"},"example":{}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/geomancy/puer \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{}'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/geomancy/puer', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({}),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/geomancy/puer',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('geomancy/puer', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"figure":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"latin":{"type":"string","nullable":true},"english":{"type":"string","nullable":true},"pattern":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"ruler":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"sign":{"type":"string","nullable":true},"nature":{"type":"string","nullable":true},"meaning":{"type":"string","nullable":true},"positive":{"type":"string","nullable":true},"negative":{"type":"string","nullable":true},"divinatory":{"type":"string","nullable":true}},"nullable":true},"source":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"figure":{"slug":"puer","latin":"Puer","english":"Boy","pattern":[1],"ruler":"Mars","element":"fire","sign":"Aries","nature":"mixed","meaning":"young man, energy, impulsiveness","positive":"courage, drive, war (won)","negative":"recklessness, conflict","divinatory":"good for action and war; bad for love"},"source":"Agrippa \"De Occulta Philosophia\" 1531 + Skinner \"Terrestrial Astrology\" 1980"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/runes/single":{"post":{"tags":["Elder Futhark Runes"],"summary":"Single Rune Draw","description":"Deterministic 1-rune draw.","operationId":"runes_single","x-quality":"green","x-source":"Poetic Edda (Codex Regius ~1270, PD) + Prose Edda Snorri Sturluson ~1220 (PD) + Stephen Flowers \"Futhark\" 1984 + Diana Paxson \"Taking Up the Runes\" 2005 + Pennick \"Runic Astrology\" 1990 (zodiac mapping).","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Single"},"example":{"seed":"..."}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/runes/single \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"seed\": \"...\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/runes/single', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"seed\": \"...\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/runes/single',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'seed': \"...\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('runes/single', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'seed' => '...',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"spread":{"type":"string","nullable":true},"seed":{"type":"number","nullable":true},"runes":{"type":"array","items":{"type":"object","properties":{"number":{"type":"number","nullable":true},"slug":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"letter":{"type":"string","nullable":true},"glyph":{"type":"string","nullable":true},"aett":{"type":"string","nullable":true},"meaning":{"type":"string","nullable":true},"upright":{"type":"string","nullable":true},"reversed":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"deity":{"type":"string","nullable":true},"reversedDrawn":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true},"source":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"spread":"single","seed":193428655,"runes":[{"number":17,"slug":"tiwaz","name":"Tiwaz","letter":"T","glyph":"ᛏ","aett":"Tyr","meaning":"Tyr, sky-god, justice, sacrifice","upright":"just outcome, courage, sacrifice for honour","reversed":"injustice, dishonour, defeat","element":"air","deity":"Tyr","reversedDrawn":false}],"source":"Poetic Edda + Prose Edda + Flowers 1984 + Paxson 2005"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/runes/three":{"post":{"tags":["Elder Futhark Runes"],"summary":"Norn 3-Rune Cast","description":"Past/Present/Future (Urdr/Verdandi/Skuld).","operationId":"runes_three","x-quality":"green","x-source":"Poetic Edda (Codex Regius ~1270, PD) + Prose Edda Snorri Sturluson ~1220 (PD) + Stephen Flowers \"Futhark\" 1984 + Diana Paxson \"Taking Up the Runes\" 2005 + Pennick \"Runic Astrology\" 1990 (zodiac mapping).","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Three"},"example":{"seed":"..."}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/runes/three \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"seed\": \"...\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/runes/three', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"seed\": \"...\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/runes/three',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'seed': \"...\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('runes/three', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'seed' => '...',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"spread":{"type":"string","nullable":true},"seed":{"type":"number","nullable":true},"question":{"nullable":true},"runes":{"type":"array","items":{"type":"object","properties":{"number":{"type":"number","nullable":true},"slug":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"letter":{"type":"string","nullable":true},"glyph":{"type":"string","nullable":true},"aett":{"type":"string","nullable":true},"meaning":{"type":"string","nullable":true},"upright":{"type":"string","nullable":true},"reversed":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"deity":{"type":"string","nullable":true},"reversedDrawn":{"type":"boolean","nullable":true},"position":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"source":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"spread":"norn-three","seed":193428655,"question":null,"runes":[{"number":17,"slug":"tiwaz","name":"Tiwaz","letter":"T","glyph":"ᛏ","aett":"Tyr","meaning":"Tyr, sky-god, justice, sacrifice","upright":"just outcome, courage, sacrifice for honour","reversed":"injustice, dishonour, defeat","element":"air","deity":"Tyr","reversedDrawn":false,"position":"Urdr (Past)"}],"source":"Poetic Edda + Prose Edda + Flowers 1984 + Paxson 2005"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/runes/nine":{"post":{"tags":["Elder Futhark Runes"],"summary":"9-Rune Cast","description":"Pennick layout 9-rune cast.","operationId":"runes_nine","x-quality":"green","x-source":"Poetic Edda (Codex Regius ~1270, PD) + Prose Edda Snorri Sturluson ~1220 (PD) + Stephen Flowers \"Futhark\" 1984 + Diana Paxson \"Taking Up the Runes\" 2005 + Pennick \"Runic Astrology\" 1990 (zodiac mapping).","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Nine"},"example":{"seed":"..."}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/runes/nine \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"seed\": \"...\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/runes/nine', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"seed\": \"...\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/runes/nine',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'seed': \"...\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('runes/nine', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'seed' => '...',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"spread":{"type":"string","nullable":true},"seed":{"type":"number","nullable":true},"question":{"nullable":true},"runes":{"type":"array","items":{"type":"object","properties":{"number":{"type":"number","nullable":true},"slug":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"letter":{"type":"string","nullable":true},"glyph":{"type":"string","nullable":true},"aett":{"type":"string","nullable":true},"meaning":{"type":"string","nullable":true},"upright":{"type":"string","nullable":true},"reversed":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"deity":{"type":"string","nullable":true},"reversedDrawn":{"type":"boolean","nullable":true},"position":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"source":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"spread":"nine-rune-cast","seed":193428655,"question":null,"runes":[{"number":17,"slug":"tiwaz","name":"Tiwaz","letter":"T","glyph":"ᛏ","aett":"Tyr","meaning":"Tyr, sky-god, justice, sacrifice","upright":"just outcome, courage, sacrifice for honour","reversed":"injustice, dishonour, defeat","element":"air","deity":"Tyr","reversedDrawn":false,"position":"Self (centre)"}],"source":"Poetic Edda + Prose Edda + Flowers 1984 + Paxson 2005"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/runes/by-zodiac":{"post":{"tags":["Elder Futhark Runes"],"summary":"Rune by Zodiac","description":"Tropical-sign → Elder Futhark affinity rune.","operationId":"runes_by-zodiac","x-quality":"green","x-source":"Poetic Edda (Codex Regius ~1270, PD) + Prose Edda Snorri Sturluson ~1220 (PD) + Stephen Flowers \"Futhark\" 1984 + Diana Paxson \"Taking Up the Runes\" 2005 + Pennick \"Runic Astrology\" 1990 (zodiac mapping).","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Zodiac"},"example":{"sign":"leo"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/runes/by-zodiac \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"sign\": \"leo\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/runes/by-zodiac', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"sign\": \"leo\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/runes/by-zodiac',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'sign': \"leo\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('runes/by-zodiac', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'sign' => 'leo',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"sign":{"type":"string","nullable":true},"affinityRune":{"type":"object","properties":{"number":{"type":"number","nullable":true},"slug":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"letter":{"type":"string","nullable":true},"glyph":{"type":"string","nullable":true},"aett":{"type":"string","nullable":true},"meaning":{"type":"string","nullable":true},"upright":{"type":"string","nullable":true},"reversed":{"nullable":true},"element":{"type":"string","nullable":true},"deity":{"type":"string","nullable":true}},"nullable":true},"methodology":{"type":"string","nullable":true},"source":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"sign":"leo","affinityRune":{"number":16,"slug":"sowilo","name":"Sowilo","letter":"S","glyph":"ᛋ","aett":"Hagal","meaning":"sun, victory, life-force","upright":"success, vitality, illumination","reversed":null,"element":"fire","deity":"Sol/Sunna"},"methodology":"Tropical-sign → Elder Futhark affinity per Pennick \"Runic Astrology\" 1990 + Aswynn \"Northern Mysteries\" 1990.","source":"Poetic Edda + Prose Edda + Flowers 1984 + Paxson 2005"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/runes":{"post":{"tags":["Elder Futhark Runes"],"summary":"Elder Futhark List","description":"All 24 runes.","operationId":"runes","x-quality":"green","x-source":"Poetic Edda (Codex Regius ~1270, PD) + Prose Edda Snorri Sturluson ~1220 (PD) + Stephen Flowers \"Futhark\" 1984 + Diana Paxson \"Taking Up the Runes\" 2005 + Pennick \"Runic Astrology\" 1990 (zodiac mapping).","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmptyBody"},"example":{}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/runes \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{}'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/runes', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({}),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/runes',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('runes', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"count":{"type":"number","nullable":true},"runes":{"type":"array","items":{"type":"object","properties":{"number":{"type":"number","nullable":true},"slug":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"letter":{"type":"string","nullable":true},"glyph":{"type":"string","nullable":true},"aett":{"type":"string","nullable":true},"meaning":{"type":"string","nullable":true},"upright":{"type":"string","nullable":true},"reversed":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"deity":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"source":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"count":24,"runes":[{"number":1,"slug":"fehu","name":"Fehu","letter":"F","glyph":"ᚠ","aett":"Freyr","meaning":"cattle, wealth, mobile property","upright":"wealth, prosperity, fulfilment of needs","reversed":"loss, greed, frustration","element":"fire","deity":"Freyr"}],"source":"Poetic Edda + Prose Edda + Flowers 1984 + Paxson 2005"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/palmistry/life-line":{"post":{"tags":["Palmistry (Cheiro)"],"summary":"Life Line","description":"Vitality, health, life force.","operationId":"palmistry_life-line","x-quality":"yellow","x-source":"Cheiro (William John Warner) \"Cheiro's Language of the Hand\" 1900 (PD) + Comte de Saint-Germain \"The Practice of Palmistry\" 1897 (PD). Modern reading conventions update Cheiro's gendered framings.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmptyBody"},"example":{}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/palmistry/life-line \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{}'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/palmistry/life-line', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({}),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/palmistry/life-line',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('palmistry/life-line', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"line":{"type":"object","properties":{"name":{"type":"string","nullable":true},"latin":{"type":"string","nullable":true},"location":{"type":"string","nullable":true},"represents":{"type":"string","nullable":true},"variations":{"type":"array","items":{"type":"object","properties":{"pattern":{"type":"string","nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"readingNotes":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"sourceCaveats":{"type":"string","nullable":true}},"nullable":true},"source":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"line":{"name":"Life Line","latin":"Linea Vitalis","location":"Curves around the base of the thumb (mount of Venus), starting between thumb and index finger.","represents":"Vitality, physical health, life force, major life changes: NOT lifespan length (Cheiro 1900 ch. 4 explicitly cautions against literal length-equals-years readings).","variations":[{"pattern":"Long, deep, clear","meaning":"Strong vitality, robust health, resilience."}],"readingNotes":["Read on the dominant hand for the active life path; on the non-dominant hand for inherited tendencies."],"sourceCaveats":"Cheiro himself rejected the popular \"short line = early death\" reading."},"source":"Cheiro 'The Language of the Hand' 1900 (PD) + Comte de Saint-Germain 'The Practice of Palmistry' 1897 (PD)","disclaimer":"Palmistry is interpretive: readings are reflective frameworks, not predictive forecasts."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/palmistry/heart-line":{"post":{"tags":["Palmistry (Cheiro)"],"summary":"Heart Line","description":"Emotional life, romance.","operationId":"palmistry_heart-line","x-quality":"yellow","x-source":"Cheiro (William John Warner) \"Cheiro's Language of the Hand\" 1900 (PD) + Comte de Saint-Germain \"The Practice of Palmistry\" 1897 (PD). Modern reading conventions update Cheiro's gendered framings.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmptyBody"},"example":{}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/palmistry/heart-line \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{}'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/palmistry/heart-line', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({}),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/palmistry/heart-line',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('palmistry/heart-line', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"line":{"type":"object","properties":{"name":{"type":"string","nullable":true},"latin":{"type":"string","nullable":true},"location":{"type":"string","nullable":true},"represents":{"type":"string","nullable":true},"variations":{"type":"array","items":{"type":"object","properties":{"pattern":{"type":"string","nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"readingNotes":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"sourceCaveats":{"type":"string","nullable":true}},"nullable":true},"source":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"line":{"name":"Heart Line","latin":"Linea Mensalis","location":"Topmost major line, runs horizontally across the upper palm below the fingers.","represents":"Emotional life, romantic relationships, capacity for love, emotional resilience.","variations":[{"pattern":"Long, curving up to Jupiter (index finger)","meaning":"Idealistic in love, deeply committed."}],"readingNotes":["Position relative to the head line shows balance between emotion and intellect."],"sourceCaveats":"Modern readers note cultural bias in Cheiro's 1900 era; gender-coded interpretations should be read with care."},"source":"Cheiro 'The Language of the Hand' 1900 (PD) + Comte de Saint-Germain 'The Practice of Palmistry' 1897 (PD)","disclaimer":"Palmistry is interpretive: readings are reflective frameworks, not predictive forecasts."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/palmistry/head-line":{"post":{"tags":["Palmistry (Cheiro)"],"summary":"Head Line","description":"Intellect, mental approach.","operationId":"palmistry_head-line","x-quality":"yellow","x-source":"Cheiro (William John Warner) \"Cheiro's Language of the Hand\" 1900 (PD) + Comte de Saint-Germain \"The Practice of Palmistry\" 1897 (PD). Modern reading conventions update Cheiro's gendered framings.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmptyBody"},"example":{}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/palmistry/head-line \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{}'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/palmistry/head-line', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({}),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/palmistry/head-line',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('palmistry/head-line', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"line":{"type":"object","properties":{"name":{"type":"string","nullable":true},"latin":{"type":"string","nullable":true},"location":{"type":"string","nullable":true},"represents":{"type":"string","nullable":true},"variations":{"type":"array","items":{"type":"object","properties":{"pattern":{"type":"string","nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"readingNotes":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"sourceCaveats":{"type":"string","nullable":true}},"nullable":true},"source":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"line":{"name":"Head Line","latin":"Linea Cephalica","location":"Runs horizontally across the middle of the palm, often starting near the life line.","represents":"Intellect, mental approach, communication style, decision-making.","variations":[{"pattern":"Long, straight","meaning":"Logical, analytical, focused thinking."}],"readingNotes":["Depth of line reflects depth of thought."],"sourceCaveats":"Length is not \"intelligence\": straight line ≠ smarter than curved line; just different cognitive style."},"source":"Cheiro 'The Language of the Hand' 1900 (PD) + Comte de Saint-Germain 'The Practice of Palmistry' 1897 (PD)","disclaimer":"Palmistry is interpretive: readings are reflective frameworks, not predictive forecasts."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/palmistry/fate-line":{"post":{"tags":["Palmistry (Cheiro)"],"summary":"Fate Line","description":"Career, life direction.","operationId":"palmistry_fate-line","x-quality":"yellow","x-source":"Cheiro (William John Warner) \"Cheiro's Language of the Hand\" 1900 (PD) + Comte de Saint-Germain \"The Practice of Palmistry\" 1897 (PD). Modern reading conventions update Cheiro's gendered framings.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmptyBody"},"example":{}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/palmistry/fate-line \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{}'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/palmistry/fate-line', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({}),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/palmistry/fate-line',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('palmistry/fate-line', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"line":{"type":"object","properties":{"name":{"type":"string","nullable":true},"latin":{"type":"string","nullable":true},"location":{"type":"string","nullable":true},"represents":{"type":"string","nullable":true},"variations":{"type":"array","items":{"type":"object","properties":{"pattern":{"type":"string","nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"readingNotes":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"sourceCaveats":{"type":"string","nullable":true}},"nullable":true},"source":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"line":{"name":"Fate Line","latin":"Linea Saturni","location":"Runs vertically up the centre of the palm, toward the middle (Saturn) finger.","represents":"Career path, life direction, sense of purpose, external influences on the life journey. Often called the \"line of destiny\" or Saturn line.","variations":[{"pattern":"Strong, unbroken","meaning":"Clear life path, strong sense of purpose."}],"readingNotes":["Read upward = chronological from base (early life) to fingers (later life)."],"sourceCaveats":"Cheiro emphasized this line as the most variable; absence is normal for autonomous lives."},"source":"Cheiro 'The Language of the Hand' 1900 (PD) + Comte de Saint-Germain 'The Practice of Palmistry' 1897 (PD)","disclaimer":"Palmistry is interpretive: readings are reflective frameworks, not predictive forecasts."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/palmistry/marriage-line":{"post":{"tags":["Palmistry (Cheiro)"],"summary":"Marriage Line","description":"Significant partnerships.","operationId":"palmistry_marriage-line","x-quality":"yellow","x-source":"Cheiro (William John Warner) \"Cheiro's Language of the Hand\" 1900 (PD) + Comte de Saint-Germain \"The Practice of Palmistry\" 1897 (PD). Modern reading conventions update Cheiro's gendered framings.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmptyBody"},"example":{}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/palmistry/marriage-line \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{}'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/palmistry/marriage-line', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({}),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/palmistry/marriage-line',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('palmistry/marriage-line', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"line":{"type":"object","properties":{"name":{"type":"string","nullable":true},"latin":{"type":"string","nullable":true},"location":{"type":"string","nullable":true},"represents":{"type":"string","nullable":true},"variations":{"type":"array","items":{"type":"object","properties":{"pattern":{"type":"string","nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"readingNotes":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"sourceCaveats":{"type":"string","nullable":true}},"nullable":true},"source":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"line":{"name":"Marriage Line","latin":"Linea Matrimoniorum","location":"Short horizontal lines on the side of the palm below the little finger (Mercury), above the heart line.","represents":"Significant intimate relationships, partnerships, deep bonds. Modern reading: NOT literally \"marriages\" but committed unions.","variations":[{"pattern":"One strong, deep line","meaning":"One central life partnership."}],"readingNotes":["Position reflects timing: closer to heart line = earlier in life; closer to little finger = later in life."],"sourceCaveats":"Cheiro's 1900 framing presumed heteronormative monogamy; modern palmistry honours all partnership configurations equally."},"source":"Cheiro 'The Language of the Hand' 1900 (PD) + Comte de Saint-Germain 'The Practice of Palmistry' 1897 (PD)","disclaimer":"Palmistry is interpretive: readings are reflective frameworks, not predictive forecasts."}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/iching/lookup/{number}":{"get":{"tags":["I Ching (Standalone)"],"summary":"Hexagram Lookup","description":"Fetch hexagram 1-64 by King Wen number.","operationId":"iching_lookup_{number}_get","x-quality":"green","x-source":"I Ching (Book of Changes) ~9th c. BCE Chinese (PD) + King Wen sequence (PD) + Wilhelm-Baynes 1923/1950 (Princeton) hexagram names.","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"number","in":"path","required":true,"description":"Hexagram number in King Wen order.","schema":{"type":"integer","minimum":1,"maximum":64},"example":1},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X GET https://api.astroway.info/v1/iching/lookup/{number} \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/iching/lookup/{number}', {\n  method: 'GET',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.get(\n    'https://api.astroway.info/v1/iching/lookup/{number}',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->get('iching/lookup/{number}', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"hexagram":{"type":"object","properties":{"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"chinese":{"type":"string","nullable":true},"trigrams":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"lines":{"type":"array","items":{"type":"object","properties":{"value":{"type":"number","nullable":true},"isYang":{"type":"boolean","nullable":true},"isChanging":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true}},"nullable":true},"upperTrigram":{"type":"object","properties":{"name":{"type":"string","nullable":true},"symbol":{"type":"string","nullable":true},"lines":{"type":"array","items":{"type":"number","nullable":true},"nullable":true}},"nullable":true},"lowerTrigram":{"type":"object","properties":{"name":{"type":"string","nullable":true},"symbol":{"type":"string","nullable":true},"lines":{"type":"array","items":{"type":"number","nullable":true},"nullable":true}},"nullable":true},"source":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"hexagram":{"number":1,"name":"The Creative","chinese":"䷀","trigrams":[0],"lines":[{"value":7,"isYang":true,"isChanging":false}]},"upperTrigram":{"name":"Qian (Heaven)","symbol":"☰","lines":[1]},"lowerTrigram":{"name":"Qian (Heaven)","symbol":"☰","lines":[1]},"source":"I Ching ~9th c. BCE; King Wen sequence (PD); Wilhelm-Baynes 1923/1950 names"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}}}},"/iching/daily":{"post":{"tags":["I Ching (Standalone)"],"summary":"Daily I Ching","description":"Deterministic per-date hexagram.","operationId":"iching_daily","x-quality":"green","x-source":"I Ching (Book of Changes) ~9th c. BCE Chinese (PD) + King Wen sequence (PD) + Wilhelm-Baynes 1923/1950 (Princeton) hexagram names.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Daily"},"example":{"date":"..."}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/iching/daily \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"date\": \"...\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/iching/daily', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"date\": \"...\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/iching/daily',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'date': \"...\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('iching/daily', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'date' => '...',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"date":{"type":"string","nullable":true},"hexagram":{"type":"object","properties":{"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"chinese":{"type":"string","nullable":true},"trigrams":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"lines":{"type":"array","items":{"type":"object","properties":{"value":{"type":"number","nullable":true},"isYang":{"type":"boolean","nullable":true},"isChanging":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true},"changingHexagram":{"type":"number","nullable":true}},"nullable":true},"upperTrigram":{"type":"object","properties":{"name":{"type":"string","nullable":true},"symbol":{"type":"string","nullable":true},"lines":{"type":"array","items":{"type":"number","nullable":true},"nullable":true}},"nullable":true},"lowerTrigram":{"type":"object","properties":{"name":{"type":"string","nullable":true},"symbol":{"type":"string","nullable":true},"lines":{"type":"array","items":{"type":"number","nullable":true},"nullable":true}},"nullable":true},"source":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"date":"...","hexagram":{"number":57,"name":"The Gentle","chinese":"䷸","trigrams":[5],"lines":[{"value":6,"isYang":false,"isChanging":true}],"changingHexagram":19},"upperTrigram":{"name":"Xun (Wind)","symbol":"☴","lines":[0]},"lowerTrigram":{"name":"Xun (Wind)","symbol":"☴","lines":[0]},"source":"I Ching ~9th c. BCE; King Wen sequence (PD); Wilhelm-Baynes 1923/1950 names"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/iching/throw-coins":{"post":{"tags":["I Ching (Standalone)"],"summary":"Throw Coins","description":"Seeded 3-coin method.","operationId":"iching_throw-coins","x-quality":"green","x-source":"I Ching (Book of Changes) ~9th c. BCE Chinese (PD) + King Wen sequence (PD) + Wilhelm-Baynes 1923/1950 (Princeton) hexagram names.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Throw"},"example":{"seed":"..."}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/iching/throw-coins \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"seed\": \"...\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/iching/throw-coins', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"seed\": \"...\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/iching/throw-coins',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'seed': \"...\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('iching/throw-coins', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'seed' => '...',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"method":{"type":"string","nullable":true},"seed":{"type":"number","nullable":true},"hexagram":{"type":"object","properties":{"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"chinese":{"type":"string","nullable":true},"trigrams":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"lines":{"type":"array","items":{"type":"object","properties":{"value":{"type":"number","nullable":true},"isYang":{"type":"boolean","nullable":true},"isChanging":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true},"changingHexagram":{"type":"number","nullable":true}},"nullable":true},"source":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"method":"3-coin throw (Yang=3, Yin=2)","seed":193428655,"hexagram":{"number":30,"name":"The Clinging","chinese":"䷝","trigrams":[6],"lines":[{"value":7,"isYang":true,"isChanging":false}],"changingHexagram":42},"source":"I Ching ~9th c. BCE; King Wen sequence (PD); Wilhelm-Baynes 1923/1950 names"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/iching/with-changing-lines":{"post":{"tags":["I Ching (Standalone)"],"summary":"With Changing Lines","description":"Primary + transformed hexagrams.","operationId":"iching_with-changing-lines","x-quality":"green","x-source":"I Ching (Book of Changes) ~9th c. BCE Chinese (PD) + King Wen sequence (PD) + Wilhelm-Baynes 1923/1950 (Princeton) hexagram names.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Changing"},"example":{"seed":"..."}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/iching/with-changing-lines \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"seed\": \"...\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/iching/with-changing-lines', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"seed\": \"...\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/iching/with-changing-lines',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'seed': \"...\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('iching/with-changing-lines', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'seed' => '...',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"seed":{"type":"number","nullable":true},"primary":{"type":"object","properties":{"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"chinese":{"type":"string","nullable":true},"trigrams":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"lines":{"type":"array","items":{"type":"object","properties":{"value":{"type":"number","nullable":true},"isYang":{"type":"boolean","nullable":true},"isChanging":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true},"changingHexagram":{"type":"number","nullable":true}},"nullable":true},"changingLines":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"transformedHexagram":{"type":"object","properties":{"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"chinese":{"type":"string","nullable":true},"trigrams":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"lines":{"type":"array","items":{"type":"object","properties":{"value":{"type":"number","nullable":true},"isYang":{"type":"boolean","nullable":true},"isChanging":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true}},"nullable":true},"note":{"type":"string","nullable":true},"source":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"seed":193428655,"primary":{"number":30,"name":"The Clinging","chinese":"䷝","trigrams":[6],"lines":[{"value":7,"isYang":true,"isChanging":false}],"changingHexagram":42},"changingLines":[3],"transformedHexagram":{"number":42,"name":"Increase","chinese":"䷩","trigrams":[2],"lines":[{"value":7,"isYang":true,"isChanging":false}]},"note":"3 changing line(s): situation evolves into hexagram 42.","source":"I Ching ~9th c. BCE; King Wen sequence (PD); Wilhelm-Baynes 1923/1950 names"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/iching/by-question":{"post":{"tags":["I Ching (Standalone)"],"summary":"By Question","description":"Deterministic hexagram from question text.","operationId":"iching_by-question","x-quality":"green","x-source":"I Ching (Book of Changes) ~9th c. BCE Chinese (PD) + King Wen sequence (PD) + Wilhelm-Baynes 1923/1950 (Princeton) hexagram names.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Question"},"example":{"question":"..."}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/iching/by-question \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"question\": \"...\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/iching/by-question', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"question\": \"...\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/iching/by-question',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'question': \"...\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('iching/by-question', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'question' => '...',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"question":{"type":"string","nullable":true},"seed":{"type":"number","nullable":true},"hexagram":{"type":"object","properties":{"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"chinese":{"type":"string","nullable":true},"trigrams":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"lines":{"type":"array","items":{"type":"object","properties":{"value":{"type":"number","nullable":true},"isYang":{"type":"boolean","nullable":true},"isChanging":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true},"changingHexagram":{"type":"number","nullable":true}},"nullable":true},"upperTrigram":{"type":"object","properties":{"name":{"type":"string","nullable":true},"symbol":{"type":"string","nullable":true},"lines":{"type":"array","items":{"type":"number","nullable":true},"nullable":true}},"nullable":true},"lowerTrigram":{"type":"object","properties":{"name":{"type":"string","nullable":true},"symbol":{"type":"string","nullable":true},"lines":{"type":"array","items":{"type":"number","nullable":true},"nullable":true}},"nullable":true},"note":{"type":"string","nullable":true},"source":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"question":"...","seed":1487523500,"hexagram":{"number":10,"name":"Treading","chinese":"䷉","trigrams":[7],"lines":[{"value":7,"isYang":true,"isChanging":false}],"changingHexagram":43},"upperTrigram":{"name":"Qian (Heaven)","symbol":"☰","lines":[1]},"lowerTrigram":{"name":"Dui (Lake)","symbol":"☱","lines":[1]},"note":"Reading is deterministic by question text: same question yields the same hexagram. Reword the question for a fresh reading.","source":"I Ching ~9th c. BCE; King Wen sequence (PD); Wilhelm-Baynes 1923/1950 names"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/zodiac/aries":{"get":{"tags":["Zodiac Signs (Per-Sign Deep)"],"summary":"Aries: Cardinal Fire","description":"Pioneering will, raw initiation. Ruler Mars. I AM signature.","operationId":"zodiac_aries_get","x-quality":"green","x-source":"SIGNS reference table + DECANS reference + classical interpretive lineage (Hand 1981, Tyl 1973, Brennan 2017).","security":[{"ApiKeyAuth":[]}],"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X GET https://api.astroway.info/v1/zodiac/aries \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/zodiac/aries', {\n  method: 'GET',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.get(\n    'https://api.astroway.info/v1/zodiac/aries',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->get('zodiac/aries', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"sign":{"type":"object","properties":{"id":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"glyph":{"type":"string","nullable":true},"unicode":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"modality":{"type":"string","nullable":true},"polarity":{"type":"string","nullable":true},"ruler":{"type":"string","nullable":true},"exaltation":{"type":"string","nullable":true},"fall":{"type":"string","nullable":true},"detriment":{"type":"string","nullable":true},"bodyParts":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"startLongitude":{"type":"number","nullable":true}},"nullable":true},"description":{"type":"string","nullable":true},"decans":{"type":"array","items":{"type":"object","properties":{"number":{"type":"number","nullable":true},"sign":{"type":"string","nullable":true},"decanInSign":{"type":"number","nullable":true},"startDegree":{"type":"number","nullable":true},"endDegree":{"type":"number","nullable":true},"egyptianRuler":{"type":"string","nullable":true},"modernRuler":{"type":"string","nullable":true},"faceRuler":{"type":"string","nullable":true},"description":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"cohort":{"type":"object","properties":{"element":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"modality":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"polarity":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}},"nullable":true},"degreeRange":{"type":"object","properties":{"start":{"type":"number","nullable":true},"end":{"type":"number","nullable":true}},"nullable":true},"source":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"sign":{"id":0,"name":"Aries","glyph":"♈","unicode":"U+2648","element":"fire","modality":"cardinal","polarity":"masculine","ruler":"Mars","exaltation":"Sun","fall":"Saturn","detriment":"Venus","bodyParts":["head"],"startLongitude":0},"description":"Cardinal fire: pioneering will, raw initiation. Ruler Mars channels assertive action; the I AM signature.","decans":[{"number":1,"sign":"Aries","decanInSign":1,"startDegree":0,"endDegree":10,"egyptianRuler":"Mars","modernRuler":"Mars","faceRuler":"Mars","description":"pioneer, raw fire, initiation"}],"cohort":{"element":["Aries"],"modality":["Aries"],"polarity":["Aries"]},"degreeRange":{"start":0,"end":30},"source":"SIGNS reference + DECANS reference + classical interpretive lineage (Hand 1981, Tyl 1973, Brennan 2017)"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/zodiac/taurus":{"get":{"tags":["Zodiac Signs (Per-Sign Deep)"],"summary":"Taurus: Fixed Earth","description":"Embodied stability, sensory wealth. Ruler Venus. I HAVE.","operationId":"zodiac_taurus_get","x-quality":"green","x-source":"SIGNS reference table + DECANS reference + classical interpretive lineage (Hand 1981, Tyl 1973, Brennan 2017).","security":[{"ApiKeyAuth":[]}],"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X GET https://api.astroway.info/v1/zodiac/taurus \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/zodiac/taurus', {\n  method: 'GET',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.get(\n    'https://api.astroway.info/v1/zodiac/taurus',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->get('zodiac/taurus', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"sign":{"type":"object","properties":{"id":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"glyph":{"type":"string","nullable":true},"unicode":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"modality":{"type":"string","nullable":true},"polarity":{"type":"string","nullable":true},"ruler":{"type":"string","nullable":true},"exaltation":{"type":"string","nullable":true},"fall":{"type":"string","nullable":true},"detriment":{"type":"string","nullable":true},"bodyParts":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"startLongitude":{"type":"number","nullable":true}},"nullable":true},"description":{"type":"string","nullable":true},"decans":{"type":"array","items":{"type":"object","properties":{"number":{"type":"number","nullable":true},"sign":{"type":"string","nullable":true},"decanInSign":{"type":"number","nullable":true},"startDegree":{"type":"number","nullable":true},"endDegree":{"type":"number","nullable":true},"egyptianRuler":{"type":"string","nullable":true},"modernRuler":{"type":"string","nullable":true},"faceRuler":{"type":"string","nullable":true},"description":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"cohort":{"type":"object","properties":{"element":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"modality":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"polarity":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}},"nullable":true},"degreeRange":{"type":"object","properties":{"start":{"type":"number","nullable":true},"end":{"type":"number","nullable":true}},"nullable":true},"source":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"sign":{"id":1,"name":"Taurus","glyph":"♉","unicode":"U+2649","element":"earth","modality":"fixed","polarity":"feminine","ruler":"Venus","exaltation":"Moon","fall":"Uranus","detriment":"Mars","bodyParts":["neck"],"startLongitude":30},"description":"Fixed earth: embodied stability, sensory wealth. Ruler Venus draws beauty into form; the I HAVE signature.","decans":[{"number":4,"sign":"Taurus","decanInSign":1,"startDegree":30,"endDegree":40,"egyptianRuler":"Mercury","modernRuler":"Venus","faceRuler":"Mercury","description":"embodied stability, sensual ground"}],"cohort":{"element":["Taurus"],"modality":["Taurus"],"polarity":["Taurus"]},"degreeRange":{"start":30,"end":60},"source":"SIGNS reference + DECANS reference + classical interpretive lineage (Hand 1981, Tyl 1973, Brennan 2017)"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/zodiac/gemini":{"get":{"tags":["Zodiac Signs (Per-Sign Deep)"],"summary":"Gemini: Mutable Air","description":"Curious connection, plural perspectives. Ruler Mercury. I THINK.","operationId":"zodiac_gemini_get","x-quality":"green","x-source":"SIGNS reference table + DECANS reference + classical interpretive lineage (Hand 1981, Tyl 1973, Brennan 2017).","security":[{"ApiKeyAuth":[]}],"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X GET https://api.astroway.info/v1/zodiac/gemini \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/zodiac/gemini', {\n  method: 'GET',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.get(\n    'https://api.astroway.info/v1/zodiac/gemini',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->get('zodiac/gemini', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"sign":{"type":"object","properties":{"id":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"glyph":{"type":"string","nullable":true},"unicode":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"modality":{"type":"string","nullable":true},"polarity":{"type":"string","nullable":true},"ruler":{"type":"string","nullable":true},"detriment":{"type":"string","nullable":true},"bodyParts":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"startLongitude":{"type":"number","nullable":true}},"nullable":true},"description":{"type":"string","nullable":true},"decans":{"type":"array","items":{"type":"object","properties":{"number":{"type":"number","nullable":true},"sign":{"type":"string","nullable":true},"decanInSign":{"type":"number","nullable":true},"startDegree":{"type":"number","nullable":true},"endDegree":{"type":"number","nullable":true},"egyptianRuler":{"type":"string","nullable":true},"modernRuler":{"type":"string","nullable":true},"faceRuler":{"type":"string","nullable":true},"description":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"cohort":{"type":"object","properties":{"element":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"modality":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"polarity":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}},"nullable":true},"degreeRange":{"type":"object","properties":{"start":{"type":"number","nullable":true},"end":{"type":"number","nullable":true}},"nullable":true},"source":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"sign":{"id":2,"name":"Gemini","glyph":"♊","unicode":"U+264A","element":"air","modality":"mutable","polarity":"masculine","ruler":"Mercury","detriment":"Jupiter","bodyParts":["arms"],"startLongitude":60},"description":"Mutable air: curious connection, plural perspectives. Ruler Mercury threads ideas across contexts; the I THINK signature.","decans":[{"number":7,"sign":"Gemini","decanInSign":1,"startDegree":60,"endDegree":70,"egyptianRuler":"Jupiter","modernRuler":"Mercury","faceRuler":"Jupiter","description":"bright curiosity, the messenger"}],"cohort":{"element":["Gemini"],"modality":["Gemini"],"polarity":["Aries"]},"degreeRange":{"start":60,"end":90},"source":"SIGNS reference + DECANS reference + classical interpretive lineage (Hand 1981, Tyl 1973, Brennan 2017)"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/zodiac/cancer":{"get":{"tags":["Zodiac Signs (Per-Sign Deep)"],"summary":"Cancer: Cardinal Water","description":"Protective nurture, tidal memory. Ruler Moon. I FEEL.","operationId":"zodiac_cancer_get","x-quality":"green","x-source":"SIGNS reference table + DECANS reference + classical interpretive lineage (Hand 1981, Tyl 1973, Brennan 2017).","security":[{"ApiKeyAuth":[]}],"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X GET https://api.astroway.info/v1/zodiac/cancer \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/zodiac/cancer', {\n  method: 'GET',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.get(\n    'https://api.astroway.info/v1/zodiac/cancer',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->get('zodiac/cancer', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"sign":{"type":"object","properties":{"id":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"glyph":{"type":"string","nullable":true},"unicode":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"modality":{"type":"string","nullable":true},"polarity":{"type":"string","nullable":true},"ruler":{"type":"string","nullable":true},"exaltation":{"type":"string","nullable":true},"fall":{"type":"string","nullable":true},"detriment":{"type":"string","nullable":true},"bodyParts":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"startLongitude":{"type":"number","nullable":true}},"nullable":true},"description":{"type":"string","nullable":true},"decans":{"type":"array","items":{"type":"object","properties":{"number":{"type":"number","nullable":true},"sign":{"type":"string","nullable":true},"decanInSign":{"type":"number","nullable":true},"startDegree":{"type":"number","nullable":true},"endDegree":{"type":"number","nullable":true},"egyptianRuler":{"type":"string","nullable":true},"modernRuler":{"type":"string","nullable":true},"faceRuler":{"type":"string","nullable":true},"description":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"cohort":{"type":"object","properties":{"element":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"modality":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"polarity":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}},"nullable":true},"degreeRange":{"type":"object","properties":{"start":{"type":"number","nullable":true},"end":{"type":"number","nullable":true}},"nullable":true},"source":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"sign":{"id":3,"name":"Cancer","glyph":"♋","unicode":"U+264B","element":"water","modality":"cardinal","polarity":"feminine","ruler":"Moon","exaltation":"Jupiter","fall":"Mars","detriment":"Saturn","bodyParts":["chest"],"startLongitude":90},"description":"Cardinal water: protective nurture, tidal memory. Ruler Moon holds ancestral and emotional patterns; the I FEEL signature.","decans":[{"number":10,"sign":"Cancer","decanInSign":1,"startDegree":90,"endDegree":100,"egyptianRuler":"Venus","modernRuler":"Moon","faceRuler":"Venus","description":"tender feeling, nurture"}],"cohort":{"element":["Cancer"],"modality":["Aries"],"polarity":["Taurus"]},"degreeRange":{"start":90,"end":120},"source":"SIGNS reference + DECANS reference + classical interpretive lineage (Hand 1981, Tyl 1973, Brennan 2017)"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/zodiac/leo":{"get":{"tags":["Zodiac Signs (Per-Sign Deep)"],"summary":"Leo: Fixed Fire","description":"Radiant generosity, theatrical authority. Ruler Sun. I WILL.","operationId":"zodiac_leo_get","x-quality":"green","x-source":"SIGNS reference table + DECANS reference + classical interpretive lineage (Hand 1981, Tyl 1973, Brennan 2017).","security":[{"ApiKeyAuth":[]}],"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X GET https://api.astroway.info/v1/zodiac/leo \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/zodiac/leo', {\n  method: 'GET',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.get(\n    'https://api.astroway.info/v1/zodiac/leo',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->get('zodiac/leo', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"sign":{"type":"object","properties":{"id":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"glyph":{"type":"string","nullable":true},"unicode":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"modality":{"type":"string","nullable":true},"polarity":{"type":"string","nullable":true},"ruler":{"type":"string","nullable":true},"detriment":{"type":"string","nullable":true},"bodyParts":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"startLongitude":{"type":"number","nullable":true}},"nullable":true},"description":{"type":"string","nullable":true},"decans":{"type":"array","items":{"type":"object","properties":{"number":{"type":"number","nullable":true},"sign":{"type":"string","nullable":true},"decanInSign":{"type":"number","nullable":true},"startDegree":{"type":"number","nullable":true},"endDegree":{"type":"number","nullable":true},"egyptianRuler":{"type":"string","nullable":true},"modernRuler":{"type":"string","nullable":true},"faceRuler":{"type":"string","nullable":true},"description":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"cohort":{"type":"object","properties":{"element":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"modality":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"polarity":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}},"nullable":true},"degreeRange":{"type":"object","properties":{"start":{"type":"number","nullable":true},"end":{"type":"number","nullable":true}},"nullable":true},"source":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"sign":{"id":4,"name":"Leo","glyph":"♌","unicode":"U+264C","element":"fire","modality":"fixed","polarity":"masculine","ruler":"Sun","detriment":"Saturn","bodyParts":["heart"],"startLongitude":120},"description":"Fixed fire: radiant generosity, theatrical authority. Ruler Sun broadcasts the creative core; the I WILL signature.","decans":[{"number":13,"sign":"Leo","decanInSign":1,"startDegree":120,"endDegree":130,"egyptianRuler":"Saturn","modernRuler":"Sun","faceRuler":"Saturn","description":"commanding presence, vitality"}],"cohort":{"element":["Aries"],"modality":["Taurus"],"polarity":["Aries"]},"degreeRange":{"start":120,"end":150},"source":"SIGNS reference + DECANS reference + classical interpretive lineage (Hand 1981, Tyl 1973, Brennan 2017)"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/zodiac/virgo":{"get":{"tags":["Zodiac Signs (Per-Sign Deep)"],"summary":"Virgo: Mutable Earth","description":"Discerning service, refined craft. Ruler Mercury. I ANALYZE.","operationId":"zodiac_virgo_get","x-quality":"green","x-source":"SIGNS reference table + DECANS reference + classical interpretive lineage (Hand 1981, Tyl 1973, Brennan 2017).","security":[{"ApiKeyAuth":[]}],"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X GET https://api.astroway.info/v1/zodiac/virgo \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/zodiac/virgo', {\n  method: 'GET',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.get(\n    'https://api.astroway.info/v1/zodiac/virgo',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->get('zodiac/virgo', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"sign":{"type":"object","properties":{"id":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"glyph":{"type":"string","nullable":true},"unicode":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"modality":{"type":"string","nullable":true},"polarity":{"type":"string","nullable":true},"ruler":{"type":"string","nullable":true},"exaltation":{"type":"string","nullable":true},"fall":{"type":"string","nullable":true},"detriment":{"type":"string","nullable":true},"bodyParts":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"startLongitude":{"type":"number","nullable":true}},"nullable":true},"description":{"type":"string","nullable":true},"decans":{"type":"array","items":{"type":"object","properties":{"number":{"type":"number","nullable":true},"sign":{"type":"string","nullable":true},"decanInSign":{"type":"number","nullable":true},"startDegree":{"type":"number","nullable":true},"endDegree":{"type":"number","nullable":true},"egyptianRuler":{"type":"string","nullable":true},"modernRuler":{"type":"string","nullable":true},"faceRuler":{"type":"string","nullable":true},"description":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"cohort":{"type":"object","properties":{"element":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"modality":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"polarity":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}},"nullable":true},"degreeRange":{"type":"object","properties":{"start":{"type":"number","nullable":true},"end":{"type":"number","nullable":true}},"nullable":true},"source":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"sign":{"id":5,"name":"Virgo","glyph":"♍","unicode":"U+264D","element":"earth","modality":"mutable","polarity":"feminine","ruler":"Mercury","exaltation":"Mercury","fall":"Venus","detriment":"Jupiter","bodyParts":["intestines"],"startLongitude":150},"description":"Mutable earth: discerning service, refined craft. Ruler Mercury sorts and refines; the I ANALYZE signature.","decans":[{"number":16,"sign":"Virgo","decanInSign":1,"startDegree":150,"endDegree":160,"egyptianRuler":"Sun","modernRuler":"Mercury","faceRuler":"Sun","description":"discerning service"}],"cohort":{"element":["Taurus"],"modality":["Gemini"],"polarity":["Taurus"]},"degreeRange":{"start":150,"end":180},"source":"SIGNS reference + DECANS reference + classical interpretive lineage (Hand 1981, Tyl 1973, Brennan 2017)"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/zodiac/libra":{"get":{"tags":["Zodiac Signs (Per-Sign Deep)"],"summary":"Libra: Cardinal Air","description":"Partnership, aesthetic balance, mediation. Ruler Venus. I BALANCE.","operationId":"zodiac_libra_get","x-quality":"green","x-source":"SIGNS reference table + DECANS reference + classical interpretive lineage (Hand 1981, Tyl 1973, Brennan 2017).","security":[{"ApiKeyAuth":[]}],"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X GET https://api.astroway.info/v1/zodiac/libra \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/zodiac/libra', {\n  method: 'GET',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.get(\n    'https://api.astroway.info/v1/zodiac/libra',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->get('zodiac/libra', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"sign":{"type":"object","properties":{"id":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"glyph":{"type":"string","nullable":true},"unicode":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"modality":{"type":"string","nullable":true},"polarity":{"type":"string","nullable":true},"ruler":{"type":"string","nullable":true},"exaltation":{"type":"string","nullable":true},"fall":{"type":"string","nullable":true},"detriment":{"type":"string","nullable":true},"bodyParts":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"startLongitude":{"type":"number","nullable":true}},"nullable":true},"description":{"type":"string","nullable":true},"decans":{"type":"array","items":{"type":"object","properties":{"number":{"type":"number","nullable":true},"sign":{"type":"string","nullable":true},"decanInSign":{"type":"number","nullable":true},"startDegree":{"type":"number","nullable":true},"endDegree":{"type":"number","nullable":true},"egyptianRuler":{"type":"string","nullable":true},"modernRuler":{"type":"string","nullable":true},"faceRuler":{"type":"string","nullable":true},"description":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"cohort":{"type":"object","properties":{"element":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"modality":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"polarity":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}},"nullable":true},"degreeRange":{"type":"object","properties":{"start":{"type":"number","nullable":true},"end":{"type":"number","nullable":true}},"nullable":true},"source":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"sign":{"id":6,"name":"Libra","glyph":"♎","unicode":"U+264E","element":"air","modality":"cardinal","polarity":"masculine","ruler":"Venus","exaltation":"Saturn","fall":"Sun","detriment":"Mars","bodyParts":["kidneys"],"startLongitude":180},"description":"Cardinal air: partnership, aesthetic balance, mediation. Ruler Venus weighs and harmonises; the I BALANCE signature.","decans":[{"number":19,"sign":"Libra","decanInSign":1,"startDegree":180,"endDegree":190,"egyptianRuler":"Moon","modernRuler":"Venus","faceRuler":"Moon","description":"graceful balance"}],"cohort":{"element":["Gemini"],"modality":["Aries"],"polarity":["Aries"]},"degreeRange":{"start":180,"end":210},"source":"SIGNS reference + DECANS reference + classical interpretive lineage (Hand 1981, Tyl 1973, Brennan 2017)"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/zodiac/scorpio":{"get":{"tags":["Zodiac Signs (Per-Sign Deep)"],"summary":"Scorpio: Fixed Water","description":"Penetrating depth, transformation. Mars + Pluto. I DESIRE.","operationId":"zodiac_scorpio_get","x-quality":"green","x-source":"SIGNS reference table + DECANS reference + classical interpretive lineage (Hand 1981, Tyl 1973, Brennan 2017).","security":[{"ApiKeyAuth":[]}],"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X GET https://api.astroway.info/v1/zodiac/scorpio \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/zodiac/scorpio', {\n  method: 'GET',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.get(\n    'https://api.astroway.info/v1/zodiac/scorpio',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->get('zodiac/scorpio', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"sign":{"type":"object","properties":{"id":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"glyph":{"type":"string","nullable":true},"unicode":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"modality":{"type":"string","nullable":true},"polarity":{"type":"string","nullable":true},"ruler":{"type":"string","nullable":true},"modernRuler":{"type":"string","nullable":true},"fall":{"type":"string","nullable":true},"detriment":{"type":"string","nullable":true},"bodyParts":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"startLongitude":{"type":"number","nullable":true}},"nullable":true},"description":{"type":"string","nullable":true},"decans":{"type":"array","items":{"type":"object","properties":{"number":{"type":"number","nullable":true},"sign":{"type":"string","nullable":true},"decanInSign":{"type":"number","nullable":true},"startDegree":{"type":"number","nullable":true},"endDegree":{"type":"number","nullable":true},"egyptianRuler":{"type":"string","nullable":true},"modernRuler":{"type":"string","nullable":true},"faceRuler":{"type":"string","nullable":true},"description":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"cohort":{"type":"object","properties":{"element":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"modality":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"polarity":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}},"nullable":true},"degreeRange":{"type":"object","properties":{"start":{"type":"number","nullable":true},"end":{"type":"number","nullable":true}},"nullable":true},"source":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"sign":{"id":7,"name":"Scorpio","glyph":"♏","unicode":"U+264F","element":"water","modality":"fixed","polarity":"feminine","ruler":"Mars","modernRuler":"Pluto","fall":"Moon","detriment":"Venus","bodyParts":["reproductive"],"startLongitude":210},"description":"Fixed water: penetrating depth, transformative intensity. Classical ruler Mars + modern Pluto; the I DESIRE signature.","decans":[{"number":22,"sign":"Scorpio","decanInSign":1,"startDegree":210,"endDegree":220,"egyptianRuler":"Mars","modernRuler":"Pluto","faceRuler":"Mars","description":"piercing intensity"}],"cohort":{"element":["Cancer"],"modality":["Taurus"],"polarity":["Taurus"]},"degreeRange":{"start":210,"end":240},"source":"SIGNS reference + DECANS reference + classical interpretive lineage (Hand 1981, Tyl 1973, Brennan 2017)"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/zodiac/sagittarius":{"get":{"tags":["Zodiac Signs (Per-Sign Deep)"],"summary":"Sagittarius: Mutable Fire","description":"Philosophical quest, frank expansion. Ruler Jupiter. I SEE.","operationId":"zodiac_sagittarius_get","x-quality":"green","x-source":"SIGNS reference table + DECANS reference + classical interpretive lineage (Hand 1981, Tyl 1973, Brennan 2017).","security":[{"ApiKeyAuth":[]}],"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X GET https://api.astroway.info/v1/zodiac/sagittarius \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/zodiac/sagittarius', {\n  method: 'GET',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.get(\n    'https://api.astroway.info/v1/zodiac/sagittarius',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->get('zodiac/sagittarius', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"sign":{"type":"object","properties":{"id":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"glyph":{"type":"string","nullable":true},"unicode":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"modality":{"type":"string","nullable":true},"polarity":{"type":"string","nullable":true},"ruler":{"type":"string","nullable":true},"detriment":{"type":"string","nullable":true},"bodyParts":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"startLongitude":{"type":"number","nullable":true}},"nullable":true},"description":{"type":"string","nullable":true},"decans":{"type":"array","items":{"type":"object","properties":{"number":{"type":"number","nullable":true},"sign":{"type":"string","nullable":true},"decanInSign":{"type":"number","nullable":true},"startDegree":{"type":"number","nullable":true},"endDegree":{"type":"number","nullable":true},"egyptianRuler":{"type":"string","nullable":true},"modernRuler":{"type":"string","nullable":true},"faceRuler":{"type":"string","nullable":true},"description":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"cohort":{"type":"object","properties":{"element":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"modality":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"polarity":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}},"nullable":true},"degreeRange":{"type":"object","properties":{"start":{"type":"number","nullable":true},"end":{"type":"number","nullable":true}},"nullable":true},"source":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"sign":{"id":8,"name":"Sagittarius","glyph":"♐","unicode":"U+2650","element":"fire","modality":"mutable","polarity":"masculine","ruler":"Jupiter","detriment":"Mercury","bodyParts":["hips"],"startLongitude":240},"description":"Mutable fire: philosophical quest, frank expansion. Ruler Jupiter seeks meaning across horizons; the I SEE signature.","decans":[{"number":25,"sign":"Sagittarius","decanInSign":1,"startDegree":240,"endDegree":250,"egyptianRuler":"Mercury","modernRuler":"Jupiter","faceRuler":"Mercury","description":"visionary archer"}],"cohort":{"element":["Aries"],"modality":["Gemini"],"polarity":["Aries"]},"degreeRange":{"start":240,"end":270},"source":"SIGNS reference + DECANS reference + classical interpretive lineage (Hand 1981, Tyl 1973, Brennan 2017)"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/zodiac/capricorn":{"get":{"tags":["Zodiac Signs (Per-Sign Deep)"],"summary":"Capricorn: Cardinal Earth","description":"Disciplined mastery, long-view structure. Ruler Saturn. I USE.","operationId":"zodiac_capricorn_get","x-quality":"green","x-source":"SIGNS reference table + DECANS reference + classical interpretive lineage (Hand 1981, Tyl 1973, Brennan 2017).","security":[{"ApiKeyAuth":[]}],"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X GET https://api.astroway.info/v1/zodiac/capricorn \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/zodiac/capricorn', {\n  method: 'GET',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.get(\n    'https://api.astroway.info/v1/zodiac/capricorn',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->get('zodiac/capricorn', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"sign":{"type":"object","properties":{"id":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"glyph":{"type":"string","nullable":true},"unicode":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"modality":{"type":"string","nullable":true},"polarity":{"type":"string","nullable":true},"ruler":{"type":"string","nullable":true},"exaltation":{"type":"string","nullable":true},"fall":{"type":"string","nullable":true},"detriment":{"type":"string","nullable":true},"bodyParts":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"startLongitude":{"type":"number","nullable":true}},"nullable":true},"description":{"type":"string","nullable":true},"decans":{"type":"array","items":{"type":"object","properties":{"number":{"type":"number","nullable":true},"sign":{"type":"string","nullable":true},"decanInSign":{"type":"number","nullable":true},"startDegree":{"type":"number","nullable":true},"endDegree":{"type":"number","nullable":true},"egyptianRuler":{"type":"string","nullable":true},"modernRuler":{"type":"string","nullable":true},"faceRuler":{"type":"string","nullable":true},"description":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"cohort":{"type":"object","properties":{"element":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"modality":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"polarity":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}},"nullable":true},"degreeRange":{"type":"object","properties":{"start":{"type":"number","nullable":true},"end":{"type":"number","nullable":true}},"nullable":true},"source":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"sign":{"id":9,"name":"Capricorn","glyph":"♑","unicode":"U+2651","element":"earth","modality":"cardinal","polarity":"feminine","ruler":"Saturn","exaltation":"Mars","fall":"Jupiter","detriment":"Moon","bodyParts":["knees"],"startLongitude":270},"description":"Cardinal earth: disciplined mastery, long-view structure. Ruler Saturn builds enduring form; the I USE signature.","decans":[{"number":28,"sign":"Capricorn","decanInSign":1,"startDegree":270,"endDegree":280,"egyptianRuler":"Jupiter","modernRuler":"Saturn","faceRuler":"Jupiter","description":"patient mountain climber"}],"cohort":{"element":["Taurus"],"modality":["Aries"],"polarity":["Taurus"]},"degreeRange":{"start":270,"end":300},"source":"SIGNS reference + DECANS reference + classical interpretive lineage (Hand 1981, Tyl 1973, Brennan 2017)"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/zodiac/aquarius":{"get":{"tags":["Zodiac Signs (Per-Sign Deep)"],"summary":"Aquarius: Fixed Air","description":"Communal innovation, futurist detachment. Saturn + Uranus. I KNOW.","operationId":"zodiac_aquarius_get","x-quality":"green","x-source":"SIGNS reference table + DECANS reference + classical interpretive lineage (Hand 1981, Tyl 1973, Brennan 2017).","security":[{"ApiKeyAuth":[]}],"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X GET https://api.astroway.info/v1/zodiac/aquarius \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/zodiac/aquarius', {\n  method: 'GET',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.get(\n    'https://api.astroway.info/v1/zodiac/aquarius',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->get('zodiac/aquarius', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"sign":{"type":"object","properties":{"id":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"glyph":{"type":"string","nullable":true},"unicode":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"modality":{"type":"string","nullable":true},"polarity":{"type":"string","nullable":true},"ruler":{"type":"string","nullable":true},"modernRuler":{"type":"string","nullable":true},"detriment":{"type":"string","nullable":true},"bodyParts":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"startLongitude":{"type":"number","nullable":true}},"nullable":true},"description":{"type":"string","nullable":true},"decans":{"type":"array","items":{"type":"object","properties":{"number":{"type":"number","nullable":true},"sign":{"type":"string","nullable":true},"decanInSign":{"type":"number","nullable":true},"startDegree":{"type":"number","nullable":true},"endDegree":{"type":"number","nullable":true},"egyptianRuler":{"type":"string","nullable":true},"modernRuler":{"type":"string","nullable":true},"faceRuler":{"type":"string","nullable":true},"description":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"cohort":{"type":"object","properties":{"element":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"modality":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"polarity":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}},"nullable":true},"degreeRange":{"type":"object","properties":{"start":{"type":"number","nullable":true},"end":{"type":"number","nullable":true}},"nullable":true},"source":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"sign":{"id":10,"name":"Aquarius","glyph":"♒","unicode":"U+2652","element":"air","modality":"fixed","polarity":"masculine","ruler":"Saturn","modernRuler":"Uranus","detriment":"Sun","bodyParts":["ankles"],"startLongitude":300},"description":"Fixed air: communal innovation, futurist detachment. Classical ruler Saturn + modern Uranus; the I KNOW signature.","decans":[{"number":31,"sign":"Aquarius","decanInSign":1,"startDegree":300,"endDegree":310,"egyptianRuler":"Venus","modernRuler":"Uranus","faceRuler":"Venus","description":"humanitarian innovator"}],"cohort":{"element":["Gemini"],"modality":["Taurus"],"polarity":["Aries"]},"degreeRange":{"start":300,"end":330},"source":"SIGNS reference + DECANS reference + classical interpretive lineage (Hand 1981, Tyl 1973, Brennan 2017)"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/zodiac/pisces":{"get":{"tags":["Zodiac Signs (Per-Sign Deep)"],"summary":"Pisces: Mutable Water","description":"Oceanic compassion, dissolving boundaries. Jupiter + Neptune. I BELIEVE.","operationId":"zodiac_pisces_get","x-quality":"green","x-source":"SIGNS reference table + DECANS reference + classical interpretive lineage (Hand 1981, Tyl 1973, Brennan 2017).","security":[{"ApiKeyAuth":[]}],"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X GET https://api.astroway.info/v1/zodiac/pisces \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/zodiac/pisces', {\n  method: 'GET',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.get(\n    'https://api.astroway.info/v1/zodiac/pisces',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->get('zodiac/pisces', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"sign":{"type":"object","properties":{"id":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"glyph":{"type":"string","nullable":true},"unicode":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"modality":{"type":"string","nullable":true},"polarity":{"type":"string","nullable":true},"ruler":{"type":"string","nullable":true},"modernRuler":{"type":"string","nullable":true},"exaltation":{"type":"string","nullable":true},"fall":{"type":"string","nullable":true},"detriment":{"type":"string","nullable":true},"bodyParts":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"startLongitude":{"type":"number","nullable":true}},"nullable":true},"description":{"type":"string","nullable":true},"decans":{"type":"array","items":{"type":"object","properties":{"number":{"type":"number","nullable":true},"sign":{"type":"string","nullable":true},"decanInSign":{"type":"number","nullable":true},"startDegree":{"type":"number","nullable":true},"endDegree":{"type":"number","nullable":true},"egyptianRuler":{"type":"string","nullable":true},"modernRuler":{"type":"string","nullable":true},"faceRuler":{"type":"string","nullable":true},"description":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"cohort":{"type":"object","properties":{"element":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"modality":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"polarity":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}},"nullable":true},"degreeRange":{"type":"object","properties":{"start":{"type":"number","nullable":true},"end":{"type":"number","nullable":true}},"nullable":true},"source":{"type":"string","nullable":true}}}}},"example":{"ok":true,"data":{"sign":{"id":11,"name":"Pisces","glyph":"♓","unicode":"U+2653","element":"water","modality":"mutable","polarity":"feminine","ruler":"Jupiter","modernRuler":"Neptune","exaltation":"Venus","fall":"Mercury","detriment":"Mercury","bodyParts":["feet"],"startLongitude":330},"description":"Mutable water: oceanic compassion, dissolving boundaries. Classical ruler Jupiter + modern Neptune; the I BELIEVE signature.","decans":[{"number":34,"sign":"Pisces","decanInSign":1,"startDegree":330,"endDegree":340,"egyptianRuler":"Saturn","modernRuler":"Neptune","faceRuler":"Saturn","description":"mystic dreamer"}],"cohort":{"element":["Cancer"],"modality":["Gemini"],"polarity":["Taurus"]},"degreeRange":{"start":330,"end":360},"source":"SIGNS reference + DECANS reference + classical interpretive lineage (Hand 1981, Tyl 1973, Brennan 2017)"}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/translate/astro":{"post":{"tags":["Content Localization"],"summary":"Translate (astro-aware)","description":"Translate one text into any of 21 languages with astrology-domain glossary pinning. Source defaults to English; pass source_lang to override. Credits: 15 + ceil(chars/40). Max 3000 chars.","operationId":"translate_astro","x-quality":"green","x-source":"Astro-aware machine translation across 21 languages via the ai.astroway.info LLM gateway, with a domain glossary (Vedic / Western / Tarot / Numerology / HD / marketing) pinning specialist terms (Dasha, Nakshatra, Ascendant, …) so they are not mistranslated. Numeric fields untouched.","security":[{"ApiKeyAuth":[]}],"parameters":[{"in":"header","name":"X-Provider","required":false,"schema":{"type":"string","enum":["openai","anthropic","google","groq","mistral","openrouter","deepseek","together"]},"description":"Bring your own model key: the LLM provider that should run this completion. Send together with X-Provider-Key or the request is refused: a key with no provider bills us for tokens you meant to pay for, and a provider with no key would look like it worked. The endpoint is fixed per provider on our side and is never taken from the request. There is no fallback to our own chain: if your key fails you get the provider's status and message.","example":"anthropic"},{"in":"header","name":"X-Provider-Key","required":false,"schema":{"type":"string"},"description":"Your own credential for X-Provider. Never logged, stored or cached: it travels in a header because the request body is hashed into two cache keys, and a BYOK turn bypasses both caches in each direction. A provider error that quotes the key back is redacted before it reaches our logs or your response. Such a turn costs 5 credits instead of the endpoint price, and only when a completion actually ran on your key.","example":"sk-ant-..."},{"in":"header","name":"X-Provider-Model","required":false,"schema":{"type":"string","maxLength":120},"description":"Optional model id, overriding the default for that provider. Defaults: openai → gpt-4o-mini, anthropic → claude-sonnet-4-5, google → gemini-2.5-flash, groq → openai/gpt-oss-120b, mistral → mistral-large-latest, openrouter → meta-llama/llama-3.3-70b-instruct, deepseek → deepseek-chat, together → meta-llama/Llama-3.3-70B-Instruct-Turbo.","example":"claude-sonnet-4-5"},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TranslateAstro"},"example":{"text":"Mercury is retrograde in Gemini.","target_lang":"de","domain":"western"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/translate/astro \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"text\": \"Mercury is retrograde in Gemini.\", \"target_lang\": \"de\", \"domain\": \"western\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/translate/astro', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"text\": \"Mercury is retrograde in Gemini.\",\n    \"target_lang\": \"de\",\n    \"domain\": \"western\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/translate/astro',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'text': \"Mercury is retrograde in Gemini.\",\n      'target_lang': \"de\",\n      'domain': \"western\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('translate/astro', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'text' => 'Mercury is retrograde in Gemini.',\n        'target_lang' => 'de',\n        'domain' => 'western',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"translated":{"type":"string","nullable":true},"source_lang":{"type":"string","nullable":true},"target_lang":{"type":"string","nullable":true},"domain":{"type":"string","nullable":true},"provider":{"type":"string","nullable":true},"chars":{"type":"number","nullable":true},"credits":{"type":"number","nullable":true}}}}},"example":{"ok":true,"data":{"translated":"Merkur ist rückläufig in den Zwillingen.","source_lang":"en","target_lang":"de","domain":"western","provider":"gemini","chars":32,"credits":16}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}}}},"/translate/batch":{"post":{"tags":["Content Localization"],"summary":"Translate batch","description":"Translate up to 25 strings (≤2000 chars each, ≤20000 total) sharing one target language + domain. Credits: 15 + ceil(total_chars/40).","operationId":"translate_batch","x-quality":"green","x-source":"Astro-aware machine translation across 21 languages via the ai.astroway.info LLM gateway, with a domain glossary (Vedic / Western / Tarot / Numerology / HD / marketing) pinning specialist terms (Dasha, Nakshatra, Ascendant, …) so they are not mistranslated. Numeric fields untouched.","security":[{"ApiKeyAuth":[]}],"parameters":[{"in":"header","name":"X-Provider","required":false,"schema":{"type":"string","enum":["openai","anthropic","google","groq","mistral","openrouter","deepseek","together"]},"description":"Bring your own model key: the LLM provider that should run this completion. Send together with X-Provider-Key or the request is refused: a key with no provider bills us for tokens you meant to pay for, and a provider with no key would look like it worked. The endpoint is fixed per provider on our side and is never taken from the request. There is no fallback to our own chain: if your key fails you get the provider's status and message.","example":"anthropic"},{"in":"header","name":"X-Provider-Key","required":false,"schema":{"type":"string"},"description":"Your own credential for X-Provider. Never logged, stored or cached: it travels in a header because the request body is hashed into two cache keys, and a BYOK turn bypasses both caches in each direction. A provider error that quotes the key back is redacted before it reaches our logs or your response. Such a turn costs 5 credits instead of the endpoint price, and only when a completion actually ran on your key.","example":"sk-ant-..."},{"in":"header","name":"X-Provider-Model","required":false,"schema":{"type":"string","maxLength":120},"description":"Optional model id, overriding the default for that provider. Defaults: openai → gpt-4o-mini, anthropic → claude-sonnet-4-5, google → gemini-2.5-flash, groq → openai/gpt-oss-120b, mistral → mistral-large-latest, openrouter → meta-llama/llama-3.3-70b-instruct, deepseek → deepseek-chat, together → meta-llama/Llama-3.3-70B-Instruct-Turbo.","example":"claude-sonnet-4-5"},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TranslateBatch"},"example":{"items":["Mercury retrograde","Full Moon in Leo"],"target_lang":"pl","domain":"western"}}}},"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST https://api.astroway.info/v1/translate/batch \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"items\": [ \"Mercury retrograde\", \"Full Moon in Leo\" ], \"target_lang\": \"pl\", \"domain\": \"western\" }'"},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/translate/batch', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    \"items\": [\n      \"Mercury retrograde\",\n      \"Full Moon in Leo\"\n    ],\n    \"target_lang\": \"pl\",\n    \"domain\": \"western\"\n  }),\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    'https://api.astroway.info/v1/translate/batch',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n    json={\n      'items': [\n        \"Mercury retrograde\",\n        \"Full Moon in Leo\"\n      ],\n      'target_lang': \"pl\",\n      'domain': \"western\"\n    },\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->post('translate/batch', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n    'json' => [\n        'items' => ['Mercury retrograde', 'Full Moon in Leo'],\n        'target_lang' => 'pl',\n        'domain' => 'western',\n    ],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"translated":{"type":"string","nullable":true},"provider":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"source_lang":{"type":"string","nullable":true},"target_lang":{"type":"string","nullable":true},"domain":{"type":"string","nullable":true},"count":{"type":"number","nullable":true},"chars":{"type":"number","nullable":true},"credits":{"type":"number","nullable":true}}}}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}}}},"/translate/languages":{"get":{"tags":["Content Localization"],"summary":"Supported languages","description":"List the 21 supported language codes + names. Free (0 credits).","operationId":"translate_languages_get","x-quality":"green","x-source":"Astro-aware machine translation across 21 languages via the ai.astroway.info LLM gateway, with a domain glossary (Vedic / Western / Tarot / Numerology / HD / marketing) pinning specialist terms (Dasha, Nakshatra, Ascendant, …) so they are not mistranslated. Numeric fields untouched.","security":[{"ApiKeyAuth":[]}],"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X GET https://api.astroway.info/v1/translate/languages \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/translate/languages', {\n  method: 'GET',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.get(\n    'https://api.astroway.info/v1/translate/languages',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->get('translate/languages', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"languages":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string","nullable":true},"name":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"count":{"type":"number","nullable":true}}}}},"example":{"ok":true,"data":{"languages":[{"code":"uk","name":"Ukrainian"}],"count":20}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/translate/glossary/{lang}":{"get":{"tags":["Content Localization"],"summary":"Glossary download","description":"Download the astrology glossary for a target language. Query: ?source=<lang> (default en), ?domain=<domain> (default generic). Free (0 credits).","operationId":"translate_glossary_{lang}_get","x-quality":"green","x-source":"Astro-aware machine translation across 21 languages via the ai.astroway.info LLM gateway, with a domain glossary (Vedic / Western / Tarot / Numerology / HD / marketing) pinning specialist terms (Dasha, Nakshatra, Ascendant, …) so they are not mistranslated. Numeric fields untouched.","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"lang","in":"path","required":true,"description":"Target language code, one of the active locales.","schema":{"type":"string"},"example":"uk"},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X GET https://api.astroway.info/v1/translate/glossary/{lang} \\\n  -H \"X-Api-Key: aw_live_...\" \\\n  -H \"Content-Type: application/json\""},{"lang":"JavaScript","label":"Node.js","source":"const res = await fetch('https://api.astroway.info/v1/translate/glossary/{lang}', {\n  method: 'GET',\n  headers: {\n    'X-Api-Key': process.env.ASTROWAY_API_KEY,\n    'Content-Type': 'application/json',\n  },\n});\nconst { ok, data, error } = await res.json();\nif (!ok) throw new Error(error.message);\nconsole.log(data);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.get(\n    'https://api.astroway.info/v1/translate/glossary/{lang}',\n    headers={'X-Api-Key': os.environ['ASTROWAY_API_KEY'], 'Content-Type': 'application/json'},\n)\nresult = r.json()\nif not result['ok']:\n    raise RuntimeError(result['error']['message'])\nprint(result['data'])"},{"lang":"PHP","label":"PHP","source":"<?php\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://api.astroway.info/v1/']);\n$r = $client->get('translate/glossary/{lang}', [\n    'headers' => ['X-Api-Key' => getenv('ASTROWAY_API_KEY')],\n]);\n$result = json_decode($r->getBody(), true);\nif (!$result['ok']) throw new \\RuntimeException($result['error']['message']);\nprint_r($result['data']);"}],"responses":{"200":{"description":"Successful calculation","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"source_lang":{"type":"string","nullable":true},"target_lang":{"type":"string","nullable":true},"domain":{"type":"string","nullable":true},"entries":{"type":"array","items":{},"nullable":true},"count":{"type":"number","nullable":true}}}}},"example":{"ok":true,"data":{"source_lang":"en","target_lang":"uk","domain":"generic","entries":[],"count":0}}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_INPUT","message":"Validation failed: date: Date must be YYYY-MM-DD","details":[{"path":"date","message":"Date must be YYYY-MM-DD"}]}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_API_KEY","message":"Invalid API key"}}}}}}}},"/version":{"get":{"tags":["System"],"summary":"Version","description":"Returns the current deploy version, build commit, start time, and uptime. Free, no authentication required. SDK clients can call this on boot to diagnose unexpected behaviour: `build_commit` uniquely identifies the deploy.","operationId":"version","x-quality":"green","responses":{"200":{"description":"Current deploy metadata","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"version":{"type":"string","example":"2.157.1"},"build_commit":{"type":"string","example":"615bc336fbf"},"started_at":{"type":"string","example":"2026-08-23T13:02:28.247Z"},"uptime_seconds":{"type":"number","example":3},"docs_url":{"type":"string","example":"https://api.astroway.info/docs/api/"}}}}},"example":{"ok":true,"data":{"version":"2.157.1","build_commit":"615bc336fbf","started_at":"2026-08-23T13:02:28.247Z","uptime_seconds":3,"docs_url":"https://api.astroway.info/docs/api/"}}}}}},"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/public/chart":{"post":{"tags":["Public"],"summary":"Natal chart (public, no key)","description":"Full natal chart: planets, houses, aspects, angles. Same input and same engine as the authed POST /chart, served anonymously under the public rate limit. Responses carry the free-tier `_footer` watermark. Field names are strict: `latitude`, `longitude`, `timezoneOffset`, not `lat` / `lng` / `tz`.","x-quality":"green","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-03-15","time":"14:30:00","timezoneOffset":2,"latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"cURL","source":"curl -X POST 'https://api.astroway.info/v1/public/chart' -H 'Content-Type: application/json' -d '{\"date\":\"1990-03-15\",\"time\":\"14:30:00\",\"timezoneOffset\":2,\"latitude\":50.45,\"longitude\":30.52}'"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"input":{"type":"object","properties":{"name":{"type":"string","nullable":true},"date":{"type":"string","nullable":true},"time":{"type":"string","nullable":true},"timezoneOffset":{"type":"number","nullable":true},"latitude":{"type":"number","nullable":true},"longitude":{"type":"number","nullable":true},"houseSystem":{"type":"string","nullable":true},"city":{"type":"string","nullable":true},"cosmogram":{"type":"boolean","nullable":true}},"nullable":true},"julianDay":{"type":"number","nullable":true},"siderealTime":{"type":"number","nullable":true},"planets":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"longitude":{"type":"number","nullable":true},"latitude":{"type":"number","nullable":true},"distance":{"type":"number","nullable":true},"speedLong":{"type":"number","nullable":true},"speedLat":{"type":"number","nullable":true},"speedDist":{"type":"number","nullable":true},"isRetrograde":{"type":"boolean","nullable":true},"declination":{"type":"number","nullable":true},"rightAscension":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"houses":{"type":"object","properties":{"system":{"type":"string","nullable":true},"cusps":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"ascendant":{"type":"number","nullable":true},"mc":{"type":"number","nullable":true},"armc":{"type":"number","nullable":true},"vertex":{"type":"number","nullable":true},"equatorialAsc":{"type":"number","nullable":true},"coAscWK":{"type":"number","nullable":true},"coAscMunkasey":{"type":"number","nullable":true},"polarAsc":{"type":"number","nullable":true}},"nullable":true},"aspects":{"type":"array","items":{"type":"object","properties":{"planet1":{"type":"string","nullable":true},"planet2":{"type":"string","nullable":true},"planet1Id":{"type":"number","nullable":true},"planet2Id":{"type":"number","nullable":true},"type":{"type":"object","properties":{"name":{"type":"string","nullable":true},"i18nKey":{"type":"string","nullable":true},"angle":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true},"symbol":{"type":"string","nullable":true},"isMajor":{"type":"boolean","nullable":true},"color":{"type":"string","nullable":true}},"nullable":true},"exactAngle":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true},"isApplying":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true},"houseAspects":{"type":"array","items":{"type":"object","properties":{"planetName":{"type":"string","nullable":true},"planetId":{"type":"number","nullable":true},"houseIndex":{"type":"number","nullable":true},"cuspLongitude":{"type":"number","nullable":true},"type":{"type":"object","properties":{"name":{"type":"string","nullable":true},"i18nKey":{"type":"string","nullable":true},"angle":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true},"symbol":{"type":"string","nullable":true},"isMajor":{"type":"boolean","nullable":true},"color":{"type":"string","nullable":true}},"nullable":true},"exactAngle":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true},"isApplying":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true},"parallelAspects":{"type":"array","items":{"type":"object","properties":{"planet1":{"type":"string","nullable":true},"planet2":{"type":"string","nullable":true},"planet1Id":{"type":"number","nullable":true},"planet2Id":{"type":"number","nullable":true},"type":{"type":"string","nullable":true},"exactDiff":{"type":"number","nullable":true},"orb":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"antiscia":{"type":"array","items":{"type":"object","properties":{"planetId":{"type":"number","nullable":true},"planetName":{"type":"string","nullable":true},"antiscion":{"type":"number","nullable":true},"contraAntiscion":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"antisciaAspects":{"type":"array","items":{},"nullable":true},"chartSect":{"type":"string","nullable":true},"meta":{"type":"object","properties":{"engineVersion":{"type":"string","nullable":true},"calculatedAt":{"type":"string","nullable":true}},"nullable":true},"localized":{"type":"object","properties":{"planets":{"type":"object","properties":{"Sun":{"type":"string","nullable":true},"Moon":{"type":"string","nullable":true}},"nullable":true},"signs":{"type":"object","properties":{"aries":{"type":"string","nullable":true},"taurus":{"type":"string","nullable":true}},"nullable":true},"aspects":{"type":"object","properties":{"Trine":{"type":"string","nullable":true}},"nullable":true}},"nullable":true}}},"_footer":{"type":"string","description":"Free-tier watermark, present on every public response.","example":"Powered by astroway.api - get your own key at https://api.astroway.info"}}},"example":{"ok":true,"data":{"input":{"name":"","date":"1990-05-15","time":"15:30:00","timezoneOffset":4,"latitude":50.45,"longitude":30.52,"houseSystem":"P","city":"","cosmogram":false},"julianDay":2448026.9791666665,"siderealTime":3.029043551629416,"planets":[{"id":0,"name":"Sun","longitude":54.37601980167181,"latitude":-0.000020054940759470553,"distance":1.0108955908980104,"speedLong":0.9642248003676466,"speedLat":0.00003805311526169511,"speedDist":0.00022039347866615117,"isRetrograde":false,"declination":18.867035147029778,"rightAscension":52.00919841916813}],"houses":{"system":"P","cusps":[169.9679500481848],"ascendant":169.9679500481848,"mc":77.07426201523143,"armc":75.95565327444125,"vertex":336.6271586045666,"equatorialAsc":164.74875654391414,"coAscWK":149.27468505332592,"coAscMunkasey":168.73706704232438,"polarAsc":329.2746850533259},"aspects":[{"planet1":"Sun","planet2":"Moon","planet1Id":0,"planet2Id":1,"type":{"name":"Trine","i18nKey":"aspect_trine","angle":120,"orb":12,"symbol":"△","isMajor":true,"color":"#3366cc"},"exactAngle":117.47133202515602,"orb":2.5286679748439838,"isApplying":false}],"houseAspects":[{"planetName":"Sun","planetId":0,"houseIndex":0,"cuspLongitude":169.9679500481848,"type":{"name":"Trine","i18nKey":"aspect_trine","angle":120,"orb":12,"symbol":"△","isMajor":true,"color":"#3366cc"},"exactAngle":115.59193024651299,"orb":4.408069753487013,"isApplying":false}],"parallelAspects":[{"planet1":"Moon","planet2":"Saturn","planet1Id":1,"planet2Id":6,"type":"parallel","exactDiff":0.9889902750346735,"orb":0.9889902750346735}],"antiscia":[{"planetId":0,"planetName":"Sun","antiscion":125.62398019832818,"contraAntiscion":305.6239801983282}],"antisciaAspects":[],"chartSect":"diurnal","meta":{"engineVersion":"2.10.03","calculatedAt":"2026-08-23T22:03:43.067Z"},"localized":{"planets":{"Sun":"Sonne","Moon":"Mond"},"signs":{"aries":"Widder","taurus":"Stier"},"aspects":{"Trine":"Trigon"}}},"_footer":"Powered by astroway.api - get your own key at https://api.astroway.info"}}}},"400":{"description":"Invalid input","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_FIELD","message":"Unsupported fields: \"tz\", \"lat\", \"lng\". Rename them to \"timezoneOffset\", \"latitude\", \"longitude\". See details for what each one expects.","details":[{"path":"tz","expected":"timezoneOffset","message":"numeric hours from UTC, e.g. 5.75; a zone name goes in timezone"},{"path":"lat","expected":"latitude","message":"decimal degrees, north positive"},{"path":"lng","expected":"longitude","message":"decimal degrees, east positive"}],"docs":"https://api.astroway.info/en/errors/#invalid_field"}}}}}},"security":[],"parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}]}},"/public/human-design":{"post":{"parameters":[{"name":"Accept-Language","in":"header","required":false,"description":"BCP-47 language (e.g. `uk`, `en`, `de`). Set it once on your HTTP client as its default; for a single call, `?lang=` overrides it. Unknown or inactive codes fall back to `uk`.","schema":{"type":"string"}},{"name":"lang","in":"query","required":false,"description":"Language for this call, overriding `Accept-Language`. The canonical per-call form: a page that renders in one language passes it here rather than reconfiguring its client. Unknown or inactive codes fall back to `uk`.","schema":{"type":"string","example":"en"}},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"tags":["Public"],"summary":"Human Design bodygraph (public, no key)","description":"Type, strategy, authority, profile, defined centres, channels and gates. Same input and same engine as the authed POST /human-design, served anonymously under the public rate limit. Responses carry the free-tier `_footer` watermark. Centre identifiers are PascalCase with no separator and are stable: `Head`, `Ajna`, `Throat`, `G`, `Heart`, `SolarPlexus`, `Spleen`, `Sacral`, `Root`; `channels[].centerA` and `centerB` use the same nine. `localized` carries type, strategy, authority and the centre names in the requested language, keyed by the same identifiers, so a caller reads `localized.centers.SolarPlexus` and never matches on a translated string. The English values above it are the stable ones and never change. Channel and gate names are prose rather than a closed set and stay English.","x-quality":"green","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartInput"},"example":{"date":"1990-03-15","time":"14:30:00","timezoneOffset":2,"latitude":50.45,"longitude":30.52}}}},"x-codeSamples":[{"lang":"cURL","source":"curl -X POST 'https://api.astroway.info/v1/public/human-design' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"date\":\"1990-03-15\",\"time\":\"14:30:00\",\"timezoneOffset\":2,\"latitude\":50.45,\"longitude\":30.52}'"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"input":{"type":"object","properties":{"name":{"type":"string","nullable":true},"date":{"type":"string","nullable":true},"time":{"type":"string","nullable":true},"timezoneOffset":{"type":"number","nullable":true},"latitude":{"type":"number","nullable":true},"longitude":{"type":"number","nullable":true},"houseSystem":{"type":"string","nullable":true},"city":{"type":"string","nullable":true},"cosmogram":{"type":"boolean","nullable":true}},"nullable":true},"type":{"type":"string","nullable":true},"strategy":{"type":"string","nullable":true},"notSelfTheme":{"type":"string","nullable":true},"authority":{"type":"string","nullable":true},"profile":{"type":"object","properties":{"profile":{"type":"string","nullable":true},"personalityLine":{"type":"number","nullable":true},"designLine":{"type":"number","nullable":true},"geometry":{"type":"string","nullable":true}},"nullable":true},"definition":{"type":"string","nullable":true},"cross":{"type":"object","properties":{"name":{"type":"string","nullable":true},"type":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true}},"nullable":true},"activations":{"type":"array","items":{"type":"object","properties":{"planet":{"type":"string","nullable":true},"planetId":{"type":"number","nullable":true},"gate":{"type":"number","nullable":true},"line":{"type":"number","nullable":true},"color":{"type":"number","nullable":true},"tone":{"type":"number","nullable":true},"base":{"type":"number","nullable":true},"longitude":{"type":"number","nullable":true},"isPersonality":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true},"personalityActivations":{"type":"array","items":{"type":"object","properties":{"planet":{"type":"string","nullable":true},"planetId":{"type":"number","nullable":true},"gate":{"type":"number","nullable":true},"line":{"type":"number","nullable":true},"color":{"type":"number","nullable":true},"tone":{"type":"number","nullable":true},"base":{"type":"number","nullable":true},"longitude":{"type":"number","nullable":true},"isPersonality":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true},"designActivations":{"type":"array","items":{"type":"object","properties":{"planet":{"type":"string","nullable":true},"planetId":{"type":"number","nullable":true},"gate":{"type":"number","nullable":true},"line":{"type":"number","nullable":true},"color":{"type":"number","nullable":true},"tone":{"type":"number","nullable":true},"base":{"type":"number","nullable":true},"longitude":{"type":"number","nullable":true},"isPersonality":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true},"centers":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","nullable":true},"defined":{"type":"boolean","nullable":true},"open":{"type":"boolean","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"activeGates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true}},"nullable":true},"nullable":true},"channels":{"type":"array","items":{"type":"object","properties":{"gate1":{"type":"number","nullable":true},"gate2":{"type":"number","nullable":true},"centerA":{"type":"string","nullable":true},"centerB":{"type":"string","nullable":true},"activatedBy":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}},"nullable":true},"nullable":true},"designJd":{"type":"number","nullable":true},"personalityJd":{"type":"number","nullable":true},"localized":{"type":"object","description":"Type, strategy, authority and centre names in the requested language. Centres key by the same identifiers as `centers[].name`.","properties":{"type":{"type":"string"},"strategy":{"type":"string"},"authority":{"type":"string"},"centers":{"type":"object","additionalProperties":{"type":"string"}},"geometry":{"type":"string"},"defined":{"type":"string"},"open":{"type":"string"}}}}},"_footer":{"type":"string","description":"Free-tier watermark, present on every public response.","example":"Powered by astroway.api - get your own key at https://api.astroway.info"}}},"example":{"ok":true,"data":{"input":{"name":"","date":"1990-05-15","time":"15:30:00","timezoneOffset":4,"latitude":50.45,"longitude":30.52,"houseSystem":"P","city":"","cosmogram":false},"type":"Projector","strategy":"Wait for the Invitation","notSelfTheme":"Bitterness","authority":"Emotional (Solar Plexus)","profile":{"profile":"6/3","personalityLine":6,"designLine":3,"geometry":"Left Angle"},"definition":"Split","cross":{"name":"Left Angle Cross of Dedication","type":"LAC","gates":[23]},"activations":[{"planet":"Sun","planetId":0,"gate":23,"line":6,"color":6,"tone":2,"base":2,"longitude":54.37601980167181,"isPersonality":true}],"personalityActivations":[{"planet":"Sun","planetId":0,"gate":23,"line":6,"color":6,"tone":2,"base":2,"longitude":54.37601980167181,"isPersonality":true}],"designActivations":[{"planet":"Sun","planetId":0,"gate":30,"line":3,"color":1,"tone":1,"base":1,"longitude":326.37601741834976,"isPersonality":false}],"centers":[{"name":"Head","defined":true,"open":false,"gates":[61],"activeGates":[61]}],"channels":[{"gate1":13,"gate2":33,"centerA":"G","centerB":"Throat","activatedBy":["personality"]}],"designJd":2447937.835688273,"personalityJd":2448026.9791666665,"localized":{"type":"Генератор","strategy":"Чекай на сакральний відгук","authority":"Емоційний (сонячне сплетіння)","centers":{"Head":"Голова","Ajna":"Аджна","Throat":"Горло","G":"G-центр","Heart":"Серце (Его)","SolarPlexus":"Сонячне сплетіння","Sacral":"Сакральний центр","Spleen":"Селезінка","Root":"Корінь"},"geometry":"Прямий кут","defined":"визначений","open":"відкритий"}},"_footer":"Powered by astroway.api - get your own key at https://api.astroway.info"}}}},"400":{"description":"Invalid input","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_FIELD","message":"Unsupported fields: \"tz\", \"lat\", \"lng\". Rename them to \"timezoneOffset\", \"latitude\", \"longitude\". See details for what each one expects.","details":[{"path":"tz","expected":"timezoneOffset","message":"numeric hours from UTC, e.g. 5.75; a zone name goes in timezone"},{"path":"lat","expected":"latitude","message":"decimal degrees, north positive"},{"path":"lng","expected":"longitude","message":"decimal degrees, east positive"}],"docs":"https://api.astroway.info/en/errors/#invalid_field"}}}}}},"security":[]}},"/public/synastry":{"post":{"parameters":[{"name":"Accept-Language","in":"header","required":false,"description":"BCP-47 language (e.g. `uk`, `en`, `de`). Set it once on your HTTP client as its default; for a single call, `?lang=` overrides it. Unknown or inactive codes fall back to `uk`.","schema":{"type":"string"}},{"name":"lang","in":"query","required":false,"description":"Language for this call, overriding `Accept-Language`. The canonical per-call form: a page that renders in one language passes it here rather than reconfiguring its client. Unknown or inactive codes fall back to `uk`.","schema":{"type":"string","example":"en"}},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"tags":["Public"],"summary":"Synastry score and cross-aspects (public, no key)","description":"Compatibility score and the planet-to-planet aspect grid for two birth charts, served anonymously. Aspects come back sorted by orb, tightest first, so taking the first six gives the six an embed would show. `applying` is true when the aspect is still closing. `spheres` splits the same score by area of life: each sphere is the subset of cross-aspects that touch its body (identity: Sun, emotional: Moon, communication: Mercury, love: Venus, passion: Mars, commitment: Saturn), scored by the same model as `score`. An aspect between two sphere bodies counts in both. A sphere with no aspect has `score: null` and `count: 0`, not 50. The six keys are a closed list; new ones may be added, existing ones are not renamed. `strength` (0-100) is the weight the score is summed from (aspect type, the two bodies, orb), over its ceiling, an exact Sun-Moon conjunction; `tone` is the side of the score it lands on, `harmonious` or `challenging`, by the same rule (Venus-Mars counts as harmonious in any aspect). `chart1` and `chart2` are the two natal charts in the shape of POST /public/chart, so houses of one partner can be read against the other without two more calls; a partner with `timeUnknown: true` has no houses or angles. What stays behind a key: the per-aspect interpretations, the house overlay, composite and Davison charts, all of which the authed POST /synastry returns. Either partner may set `timeUnknown: true`; cross-aspects survive an unknown time because they are planet to planet. **This call costs 3 units** of the public rate-limit bucket rather than 1, because it computes two charts and the full matrix: 10 an hour on an undeclared address, 100 per declared site, 200 per address. The response carries `X-RateLimit-Cost: 3`. `localized` (follows `?lang=` / `Accept-Language`) carries display names beside the English identifiers, which stay as they are: `label` translated, `labels` and `spheres` as lookup tables keyed by the identifiers, `aspects` and `planets` keyed exactly as the `aspects` rows spell them.","x-quality":"green","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwoChartUnknownTime"},"example":{"chart1":{"date":"1990-07-14","time":"14:30:00","timezoneOffset":3,"latitude":50.45,"longitude":30.52},"chart2":{"date":"1992-03-22","time":"09:15:00","timezoneOffset":2,"latitude":48.85,"longitude":2.35}}}}},"x-codeSamples":[{"lang":"cURL","source":"curl -X POST 'https://api.astroway.info/v1/public/synastry' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"chart1\":{\"date\":\"1990-07-14\",\"time\":\"14:30:00\",\"timezoneOffset\":3,\"latitude\":50.45,\"longitude\":30.52},\"chart2\":{\"date\":\"1992-03-22\",\"time\":\"09:15:00\",\"timezoneOffset\":2,\"latitude\":48.85,\"longitude\":2.35}}'"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"score":{"type":"number","nullable":true},"label":{"type":"string","nullable":true},"aspects":{"type":"array","items":{"type":"object","properties":{"planetA":{"type":"string","nullable":true},"planetB":{"type":"string","nullable":true},"aspect":{"type":"string","nullable":true},"orb":{"type":"number","nullable":true},"applying":{"type":"boolean","nullable":true},"strength":{"type":"number","nullable":true},"tone":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"count":{"type":"number","nullable":true},"spheres":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string","nullable":true},"score":{"type":"number","nullable":true},"label":{"type":"string","nullable":true},"count":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"localized":{"type":"object","properties":{"label":{"type":"string","nullable":true},"labels":{"type":"object","properties":{"harmonious":{"type":"string","nullable":true},"balanced":{"type":"string","nullable":true},"mixed":{"type":"string","nullable":true},"challenging":{"type":"string","nullable":true}},"nullable":true},"spheres":{"type":"object","properties":{"identity":{"type":"string","nullable":true},"emotional":{"type":"string","nullable":true},"communication":{"type":"string","nullable":true},"love":{"type":"string","nullable":true},"passion":{"type":"string","nullable":true},"commitment":{"type":"string","nullable":true}},"nullable":true},"aspects":{"type":"object","properties":{"Square":{"type":"string","nullable":true},"Trine":{"type":"string","nullable":true},"Opposition":{"type":"string","nullable":true}},"nullable":true},"planets":{"type":"object","properties":{"Pluto":{"type":"string","nullable":true},"Saturn":{"type":"string","nullable":true},"Uranus":{"type":"string","nullable":true},"Jupiter":{"type":"string","nullable":true},"Chiron":{"type":"string","nullable":true},"Neptune":{"type":"string","nullable":true}},"nullable":true}},"nullable":true}}},"_footer":{"type":"string","description":"Free-tier watermark, present on every public response. Keys on a paid plan do not receive it.","example":"Powered by astroway.api - get your own key at https://api.astroway.info"}}},"example":{"ok":true,"data":{"score":59,"label":"balanced","aspects":[{"planetA":"Pluto","planetB":"Saturn","aspect":"Square","orb":0.0509,"applying":false,"strength":24,"tone":"challenging"},{"planetA":"Uranus","planetB":"Jupiter","aspect":"Trine","orb":0.0787,"applying":true,"strength":22,"tone":"harmonious"},{"planetA":"Chiron","planetB":"Neptune","aspect":"Opposition","orb":0.3942,"applying":false,"strength":19,"tone":"challenging"}],"count":45,"spheres":[{"key":"identity","score":67,"label":"harmonious","count":8},{"key":"emotional","score":72,"label":"harmonious","count":9},{"key":"communication","score":68,"label":"harmonious","count":8},{"key":"love","score":68,"label":"harmonious","count":4},{"key":"passion","score":56,"label":"balanced","count":4},{"key":"commitment","score":43,"label":"mixed","count":5}],"localized":{"label":"Збалансована","labels":{"harmonious":"Гармонійна","balanced":"Збалансована","mixed":"Змішана","challenging":"Напружена"},"spheres":{"identity":"Особистість","emotional":"Емоції","communication":"Спілкування","love":"Кохання","passion":"Пристрасть","commitment":"Зобов’язання"},"aspects":{"Square":"Квадратура","Trine":"Трин","Opposition":"Опозиція"},"planets":{"Pluto":"Плутон","Saturn":"Сатурн","Uranus":"Уран","Jupiter":"Юпітер","Chiron":"Хірон","Neptune":"Нептун"}}},"_footer":"Powered by astroway.api - get your own key at https://api.astroway.info"}}}},"400":{"description":"Invalid input","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_FIELD","message":"Unsupported fields: \"tz\", \"lat\", \"lng\". Rename them to \"timezoneOffset\", \"latitude\", \"longitude\". See details for what each one expects.","details":[{"path":"tz","expected":"timezoneOffset","message":"numeric hours from UTC, e.g. 5.75; a zone name goes in timezone"},{"path":"lat","expected":"latitude","message":"decimal degrees, north positive"},{"path":"lng","expected":"longitude","message":"decimal degrees, east positive"}],"docs":"https://api.astroway.info/en/errors/#invalid_field"}}}}}},"security":[]}},"/public/compatibility/matrix":{"get":{"tags":["Public"],"summary":"Zodiac sign pair relations (public, no key)","description":"All 78 unordered pairs of zodiac signs (each sign with itself included), each with the classical whole-sign relation: `same`, `sextile`, `square`, `trine`, `opposition`, or `aversion` for signs one or five apart, which classically do not see each other. `tone` follows Ptolemy (Tetrabiblos I.13): trine, sextile and same sign are `harmonious`, square and opposition `challenging`, aversion `neutral`. There is deliberately no 0-100 score: a pair of signs has no orb and no bodies for the synastry model to weigh, so any number would be invented. For a score, send two birth charts to POST /public/synastry. Static data, `Cache-Control: public, max-age=604800`, `Vary: Accept-Language`. `localized` (follows `?lang=` / `Accept-Language`) holds lookup tables from the English identifiers in `pairs` to display names: signs, relations, tones, elements, modalities. The identifiers themselves never change.","parameters":[{"name":"lang","in":"query","required":false,"description":"Language for this call, overriding `Accept-Language`. The canonical per-call form: a page that renders in one language passes it here rather than reconfiguring its client. Unknown or inactive codes fall back to `uk`.","schema":{"type":"string","example":"en"}},{"name":"Accept-Language","in":"header","required":false,"description":"BCP-47 language (e.g. `uk`, `en`, `de`). Set it once on your HTTP client as its default; for a single call, `?lang=` overrides it. Unknown or inactive codes fall back to `uk`.","schema":{"type":"string"}},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"x-quality":"green","x-codeSamples":[{"lang":"cURL","source":"curl 'https://api.astroway.info/v1/public/compatibility/matrix'"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"pairs":{"type":"array","items":{"type":"object","properties":{"signA":{"type":"string","nullable":true},"signB":{"type":"string","nullable":true},"distance":{"type":"number","nullable":true},"relation":{"type":"string","nullable":true},"tone":{"type":"string","nullable":true},"elements":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"modalities":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"samePolarity":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true},"count":{"type":"number","nullable":true},"localized":{"type":"object","properties":{"signs":{"type":"object","properties":{"aries":{"type":"string","nullable":true},"taurus":{"type":"string","nullable":true},"gemini":{"type":"string","nullable":true},"cancer":{"type":"string","nullable":true},"leo":{"type":"string","nullable":true},"virgo":{"type":"string","nullable":true},"libra":{"type":"string","nullable":true},"scorpio":{"type":"string","nullable":true},"sagittarius":{"type":"string","nullable":true},"capricorn":{"type":"string","nullable":true},"aquarius":{"type":"string","nullable":true},"pisces":{"type":"string","nullable":true}},"nullable":true},"relations":{"type":"object","properties":{"same":{"type":"string","nullable":true},"aversion":{"type":"string","nullable":true},"sextile":{"type":"string","nullable":true},"square":{"type":"string","nullable":true},"trine":{"type":"string","nullable":true},"opposition":{"type":"string","nullable":true}},"nullable":true},"tones":{"type":"object","properties":{"harmonious":{"type":"string","nullable":true},"neutral":{"type":"string","nullable":true},"challenging":{"type":"string","nullable":true}},"nullable":true},"elements":{"type":"object","properties":{"fire":{"type":"string","nullable":true},"earth":{"type":"string","nullable":true},"air":{"type":"string","nullable":true},"water":{"type":"string","nullable":true}},"nullable":true},"modalities":{"type":"object","properties":{"cardinal":{"type":"string","nullable":true},"fixed":{"type":"string","nullable":true},"mutable":{"type":"string","nullable":true}},"nullable":true}},"nullable":true}}},"_footer":{"type":"string","description":"Free-tier watermark, present on every public response. Keys on a paid plan do not receive it.","example":"Powered by astroway.api - get your own key at https://api.astroway.info"}}},"example":{"ok":true,"data":{"pairs":[{"signA":"aries","signB":"aries","distance":0,"relation":"same","tone":"harmonious","elements":["fire","fire"],"modalities":["cardinal","cardinal"],"samePolarity":true},{"signA":"aries","signB":"taurus","distance":1,"relation":"aversion","tone":"neutral","elements":["fire","earth"],"modalities":["cardinal","fixed"],"samePolarity":false}],"count":78,"localized":{"signs":{"aries":"Widder","taurus":"Stier","gemini":"Zwillinge","cancer":"Krebs","leo":"Löwe","virgo":"Jungfrau","libra":"Waage","scorpio":"Skorpion","sagittarius":"Schütze","capricorn":"Steinbock","aquarius":"Wassermann","pisces":"Fische"},"relations":{"same":"Gleiches Zeichen","aversion":"Aversion","sextile":"Sextil","square":"Quadrat","trine":"Trigon","opposition":"Opposition"},"tones":{"harmonious":"Harmonisch","neutral":"Neutral","challenging":"Herausfordernd"},"elements":{"fire":"Feuer","earth":"Erde","air":"Luft","water":"Wasser"},"modalities":{"cardinal":"Kardinal","fixed":"Fix","mutable":"Veränderlich"}}},"_footer":"Powered by astroway.api - get your own key at https://api.astroway.info"}}}},"400":{"description":"Invalid sign or date","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_SIGN","message":"sign must be one of the 12 zodiac signs"}}}}}},"security":[]}},"/public/horoscope/daily":{"get":{"tags":["Public"],"summary":"Daily Horoscope (public, no key)","description":"Sun-sign daily horoscope. No authentication, IP-rate-limited (30/hr). Cached per (sign, date, language); every response carries the `_footer` watermark. The text comes in `sections` (overview, love, career, health, finance, advice; null in the rare answer that missed one) and as `horoscope`, the same sections as plain paragraphs, without headings or markup. Computed beside it, from the sky at noon UTC of `date`: `transits` (each planet with its sign and solar house counted from the requested sign, the sign itself being the 1st), `aspects`, `events` in the period (ingresses, stations, lunar phases, UTC), `energy` (a 1-10 score with every factor listed; a stated heuristic, not a classical technique), `lucky` (the sign's traditional ruler, its weekday and Cheiro number) and `compatibleSigns` (same element and the complementary one). When the text cannot be written right now (`reason: \"ai_unavailable\"`) or is not ready within 15 s (`\"ai_slow\"`, it is still being written for the next reader), the answer is 200 with `X-AI-Cache: STALE` and `fallback: { reason, textDate, textLanguage }`: the most recent text for this sign in the requested language from up to two periods back, otherwise the English one. The computed fields are always for `date`. 503 `AI_UNAVAILABLE` only when no such text exists.","parameters":[{"name":"sign","in":"query","required":true,"description":"Zodiac sun sign.","schema":{"type":"string","enum":["aries","taurus","gemini","cancer","leo","virgo","libra","scorpio","sagittarius","capricorn","aquarius","pisces"]}},{"name":"date","in":"query","required":false,"description":"Calendar date `YYYY-MM-DD` (UTC). Defaults to today.","schema":{"type":"string","format":"date"}},{"name":"lang","in":"query","required":false,"description":"Language for this call, overriding `Accept-Language`. The canonical per-call form: a page that renders in one language passes it here rather than reconfiguring its client. Unknown or inactive codes fall back to `uk`.","schema":{"type":"string","example":"en"}},{"name":"Accept-Language","in":"header","required":false,"description":"BCP-47 language (e.g. `uk`, `en`, `de`). Set it once on your HTTP client as its default; for a single call, `?lang=` overrides it. Unknown or inactive codes fall back to `uk`.","schema":{"type":"string"}},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"x-quality":"green","x-codeSamples":[{"lang":"cURL","source":"curl 'https://api.astroway.info/v1/public/horoscope/daily?sign=aries'"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"sign":{"type":"string","nullable":true},"date":{"type":"string","nullable":true},"period":{"type":"string","nullable":true},"horoscope":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true},"model":{"type":"string","nullable":true},"language":{"type":"string","nullable":true}}},"_footer":{"type":"string","description":"Free-tier watermark, present on every public response. Keys on a paid plan do not receive it.","example":"Powered by astroway.api - get your own key at https://api.astroway.info"}}},"example":{"ok":true,"data":{"sign":"aries","date":"2026-06-14","period":"daily","horoscope":"The week opens with …\n\n- Monday: …\n- Tuesday: …","disclaimer":"For entertainment purposes only.","model":"groq/llama-3.3-70b","language":"en"},"_footer":"Powered by astroway.api - get your own key at https://api.astroway.info"}}}},"400":{"description":"Invalid sign or date","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_SIGN","message":"sign must be one of the 12 zodiac signs"}}}}}},"security":[]}},"/public/horoscope/weekly":{"get":{"tags":["Public"],"summary":"Weekly Horoscope (public, no key)","description":"Sun-sign weekly horoscope. The cache key anchors to the week's Monday, so any day in the week returns the same reading (and a finite number of generations per week). `_footer` watermark. The text comes in `sections` (overview, love, career, health, finance, advice; null in the rare answer that missed one) and as `horoscope`, the same sections as plain paragraphs, without headings or markup. Computed beside it, from the sky at noon UTC of `date`: `transits` (each planet with its sign and solar house counted from the requested sign, the sign itself being the 1st), `aspects`, `events` in the period (ingresses, stations, lunar phases, UTC), `energy` (a 1-10 score with every factor listed; a stated heuristic, not a classical technique), `lucky` (the sign's traditional ruler, its weekday and Cheiro number) and `compatibleSigns` (same element and the complementary one). When the text cannot be written right now (`reason: \"ai_unavailable\"`) or is not ready within 15 s (`\"ai_slow\"`, it is still being written for the next reader), the answer is 200 with `X-AI-Cache: STALE` and `fallback: { reason, textDate, textLanguage }`: the most recent text for this sign in the requested language from up to two periods back, otherwise the English one. The computed fields are always for `date`. 503 `AI_UNAVAILABLE` only when no such text exists.","parameters":[{"name":"sign","in":"query","required":true,"description":"Zodiac sun sign.","schema":{"type":"string","enum":["aries","taurus","gemini","cancer","leo","virgo","libra","scorpio","sagittarius","capricorn","aquarius","pisces"]}},{"name":"date","in":"query","required":false,"description":"Calendar date `YYYY-MM-DD` (UTC). Defaults to today.","schema":{"type":"string","format":"date"}},{"name":"lang","in":"query","required":false,"description":"Language for this call, overriding `Accept-Language`. The canonical per-call form: a page that renders in one language passes it here rather than reconfiguring its client. Unknown or inactive codes fall back to `uk`.","schema":{"type":"string","example":"en"}},{"name":"Accept-Language","in":"header","required":false,"description":"BCP-47 language (e.g. `uk`, `en`, `de`). Set it once on your HTTP client as its default; for a single call, `?lang=` overrides it. Unknown or inactive codes fall back to `uk`.","schema":{"type":"string"}},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"x-quality":"green","x-codeSamples":[{"lang":"cURL","source":"curl 'https://api.astroway.info/v1/public/horoscope/weekly?sign=aries'"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"sign":{"type":"string","nullable":true},"date":{"type":"string","nullable":true},"period":{"type":"string","nullable":true},"horoscope":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true},"model":{"type":"string","nullable":true},"language":{"type":"string","nullable":true}}},"_footer":{"type":"string","description":"Free-tier watermark, present on every public response. Keys on a paid plan do not receive it.","example":"Powered by astroway.api - get your own key at https://api.astroway.info"}}},"example":{"ok":true,"data":{"sign":"aries","date":"2026-06-08","period":"weekly","horoscope":"The week opens with …\n\n- Monday: …\n- Tuesday: …","disclaimer":"For entertainment purposes only.","model":"groq/llama-3.3-70b","language":"en"},"_footer":"Powered by astroway.api - get your own key at https://api.astroway.info"}}}},"400":{"description":"Invalid sign or date","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_SIGN","message":"sign must be one of the 12 zodiac signs"}}}}}},"security":[]}},"/public/horoscope/monthly":{"get":{"tags":["Public"],"summary":"Monthly Horoscope (public, no key)","description":"Sun-sign monthly horoscope. The cache key anchors to the 1st of the month. `_footer` watermark. The text comes in `sections` (overview, love, career, health, finance, advice; null in the rare answer that missed one) and as `horoscope`, the same sections as plain paragraphs, without headings or markup. Computed beside it, from the sky at noon UTC of `date`: `transits` (each planet with its sign and solar house counted from the requested sign, the sign itself being the 1st), `aspects`, `events` in the period (ingresses, stations, lunar phases, UTC), `energy` (a 1-10 score with every factor listed; a stated heuristic, not a classical technique), `lucky` (the sign's traditional ruler, its weekday and Cheiro number) and `compatibleSigns` (same element and the complementary one). When the text cannot be written right now (`reason: \"ai_unavailable\"`) or is not ready within 15 s (`\"ai_slow\"`, it is still being written for the next reader), the answer is 200 with `X-AI-Cache: STALE` and `fallback: { reason, textDate, textLanguage }`: the most recent text for this sign in the requested language from up to two periods back, otherwise the English one. The computed fields are always for `date`. 503 `AI_UNAVAILABLE` only when no such text exists.","parameters":[{"name":"sign","in":"query","required":true,"description":"Zodiac sun sign.","schema":{"type":"string","enum":["aries","taurus","gemini","cancer","leo","virgo","libra","scorpio","sagittarius","capricorn","aquarius","pisces"]}},{"name":"date","in":"query","required":false,"description":"Calendar date `YYYY-MM-DD` (UTC). Defaults to today.","schema":{"type":"string","format":"date"}},{"name":"lang","in":"query","required":false,"description":"Language for this call, overriding `Accept-Language`. The canonical per-call form: a page that renders in one language passes it here rather than reconfiguring its client. Unknown or inactive codes fall back to `uk`.","schema":{"type":"string","example":"en"}},{"name":"Accept-Language","in":"header","required":false,"description":"BCP-47 language (e.g. `uk`, `en`, `de`). Set it once on your HTTP client as its default; for a single call, `?lang=` overrides it. Unknown or inactive codes fall back to `uk`.","schema":{"type":"string"}},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"x-quality":"green","x-codeSamples":[{"lang":"cURL","source":"curl 'https://api.astroway.info/v1/public/horoscope/monthly?sign=aries'"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"sign":{"type":"string","nullable":true},"date":{"type":"string","nullable":true},"period":{"type":"string","nullable":true},"horoscope":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true},"model":{"type":"string","nullable":true},"language":{"type":"string","nullable":true}}},"_footer":{"type":"string","description":"Free-tier watermark, present on every public response. Keys on a paid plan do not receive it.","example":"Powered by astroway.api - get your own key at https://api.astroway.info"}}},"example":{"ok":true,"data":{"sign":"aries","date":"2026-06-01","period":"monthly","horoscope":"The week opens with …\n\n- Monday: …\n- Tuesday: …","disclaimer":"For entertainment purposes only.","model":"groq/llama-3.3-70b","language":"en"},"_footer":"Powered by astroway.api - get your own key at https://api.astroway.info"}}}},"400":{"description":"Invalid sign or date","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_SIGN","message":"sign must be one of the 12 zodiac signs"}}}}}},"security":[]}},"/public/tarot/daily":{"get":{"tags":["Public"],"summary":"Tarot Card of the Day (public, no key)","description":"Deterministic Rider-Waite-Smith single card, seeded by date: the same date always yields the same card. No AI. `_footer` watermark. `localized` follows `?lang=` / `Accept-Language` and carries, keyed by slug, the card `name` and `suit`, `upright` and `reversed` with `keywords` and `meaning`, plus `positions` (same order and `index` as the spread), and `spread.name`, in 21 languages: uk en ru de pl es pt fr it nl cs ro hu el tr ar hi ja ko vi id. `nameLocalized` says the name is in that language; `textLocalized` (per card and for the spread) says the same for the prose. The English fields beside it are the stable identifiers and never change. ","parameters":[{"name":"date","in":"query","required":false,"description":"Calendar date `YYYY-MM-DD` (UTC). Defaults to today.","schema":{"type":"string","format":"date"}},{"name":"lang","in":"query","required":false,"description":"Language for this call, overriding `Accept-Language`. The canonical per-call form: a page that renders in one language passes it here rather than reconfiguring its client. Unknown or inactive codes fall back to `uk`.","schema":{"type":"string","example":"en"}},{"name":"Accept-Language","in":"header","required":false,"description":"BCP-47 language (e.g. `uk`, `en`, `de`). Set it once on your HTTP client as its default; for a single call, `?lang=` overrides it. Unknown or inactive codes fall back to `uk`.","schema":{"type":"string"}},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"x-quality":"green","x-codeSamples":[{"lang":"cURL","source":"curl 'https://api.astroway.info/v1/public/tarot/daily'"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"date":{"type":"string","nullable":true},"spread":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"cardCount":{"type":"number","nullable":true}},"nullable":true},"seed":{"type":"number","nullable":true},"drawn":{"type":"array","items":{"type":"object","properties":{"position":{"type":"object","properties":{"index":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"card":{"type":"object","properties":{"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"upright":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"astrology":{"type":"string","nullable":true},"numerology":{"type":"number","nullable":true},"yes":{"type":"string","nullable":true},"slug":{"type":"string","nullable":true},"category":{"type":"string","nullable":true},"image":{"type":"object","properties":{"url":{"type":"string","nullable":true},"url2x":{"type":"string","nullable":true},"urlSmall":{"type":"string","nullable":true},"width":{"type":"number","nullable":true},"height":{"type":"number","nullable":true},"art":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"reversed":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true},"back":{"type":"object","properties":{"url":{"type":"string","nullable":true},"url2x":{"type":"string","nullable":true},"urlSmall":{"type":"string","nullable":true},"width":{"type":"number","nullable":true},"height":{"type":"number","nullable":true},"art":{"type":"string","nullable":true}},"nullable":true},"localized":{"type":"object","properties":{"cards":{"type":"object","properties":{"the-devil":{"type":"object","properties":{"name":{"type":"string","nullable":true},"suit":{"type":"string","nullable":true},"nameLocalized":{"type":"boolean","nullable":true},"upright":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"textLocalized":{"type":"boolean","nullable":true}},"nullable":true}},"nullable":true},"positions":{"type":"array","items":{"type":"object","properties":{"index":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"spread":{"type":"object","properties":{"name":{"type":"string","nullable":true}},"nullable":true},"textLocalized":{"type":"boolean","nullable":true}},"nullable":true}}},"_footer":{"type":"string","description":"Free-tier watermark, present on every public response. Keys on a paid plan do not receive it.","example":"Powered by astroway.api - get your own key at https://api.astroway.info"}}},"example":{"ok":true,"data":{"date":"2026-08-21","spread":{"slug":"single-card","name":"Single Card","cardCount":1},"seed":20260821,"drawn":[{"position":{"index":0,"name":"The Card","meaning":"The essential answer or theme."},"card":{"number":15,"name":"The Devil","upright":{"keywords":["attachment","addiction","shadow","materialism"],"meaning":"Bondage by attachment or shadow content; see what holds you."},"reversed":{"keywords":["breaking free","release","detachment"],"meaning":"Breaking free of an attachment or addiction."},"astrology":"Capricorn","numerology":15,"yes":"no","slug":"the-devil","category":"major","image":{"url":"https://cdn.astroway.info/tarot/rws-1909/the-devil.webp","url2x":"https://cdn.astroway.info/tarot/rws-1909/the-devil@2x.webp","urlSmall":"https://cdn.astroway.info/tarot/rws-1909/the-devil-300.webp","width":600,"height":1039,"art":"rws-1909"}},"reversed":true}],"back":{"url":"https://cdn.astroway.info/tarot/rws-1909/back.webp","url2x":"https://cdn.astroway.info/tarot/rws-1909/back@2x.webp","urlSmall":"https://cdn.astroway.info/tarot/rws-1909/back-300.webp","width":600,"height":1039,"art":"rws-1909"},"localized":{"cards":{"the-devil":{"name":"Диявол","suit":"Старший Аркан","nameLocalized":true,"upright":{"keywords":["прив'язаність","залежність","тінь","матеріалізм"],"meaning":"Кайдани прив'язаності або тіньового змісту; побач, що тебе тримає."},"reversed":{"keywords":["звільнення","вивільнення","відстороненість"],"meaning":"Звільнення від прив'язаності або залежності."},"textLocalized":true}},"positions":[{"index":0,"name":"Карта","meaning":"Суть відповіді або головна тема."}],"spread":{"name":"Одна карта"},"textLocalized":true}},"_footer":"Powered by astroway.api - get your own key at https://api.astroway.info"}}}},"400":{"description":"Invalid sign or date","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_SIGN","message":"sign must be one of the 12 zodiac signs"}}}}}},"security":[]}},"/public/tarot/three-card":{"get":{"tags":["Public"],"summary":"Tarot three-card spread (public, no key)","description":"Past, present, future from the Rider-Waite-Smith deck, the same draw as POST /tarot/rider-waite/draw/three-card. Reversals included. Random per call unless `seed` is given, and never cached. `localized` follows `?lang=` / `Accept-Language` and carries, keyed by slug, the card `name` and `suit`, `upright` and `reversed` with `keywords` and `meaning`, plus `positions` (same order and `index` as the spread), and `spread.name`, in 21 languages: uk en ru de pl es pt fr it nl cs ro hu el tr ar hi ja ko vi id. `nameLocalized` says the name is in that language; `textLocalized` (per card and for the spread) says the same for the prose. The English fields beside it are the stable identifiers and never change. ","parameters":[{"name":"seed","in":"query","required":false,"description":"Integer 0-4294967295. The same seed always draws the same cards; without it every call is a new random draw.","schema":{"type":"integer","minimum":0,"maximum":4294967295}},{"name":"art","in":"query","required":false,"description":"Card art set: rws-1909 (default), rws-restored or rws-vector. GET /public/tarot/decks lists them.","schema":{"type":"string","enum":["rws-1909","rws-restored","rws-vector"]}},{"name":"lang","in":"query","required":false,"description":"Language for this call, overriding `Accept-Language`. The canonical per-call form: a page that renders in one language passes it here rather than reconfiguring its client. Unknown or inactive codes fall back to `uk`.","schema":{"type":"string","example":"en"}},{"name":"Accept-Language","in":"header","required":false,"description":"BCP-47 language (e.g. `uk`, `en`, `de`). Set it once on your HTTP client as its default; for a single call, `?lang=` overrides it. Unknown or inactive codes fall back to `uk`.","schema":{"type":"string"}},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"x-quality":"green","x-codeSamples":[{"lang":"cURL","source":"curl 'https://api.astroway.info/v1/public/tarot/three-card?lang=en'"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"spread":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"cardCount":{"type":"number","nullable":true}},"nullable":true},"seed":{"type":"number","nullable":true},"drawn":{"type":"array","items":{"type":"object","properties":{"position":{"type":"object","properties":{"index":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"card":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"category":{"type":"string","nullable":true},"suit":{"type":"string","nullable":true},"rank":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"upright":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"astrology":{"type":"string","nullable":true},"numerology":{"type":"number","nullable":true},"yes":{"type":"string","nullable":true},"image":{"type":"object","properties":{"url":{"type":"string","nullable":true},"url2x":{"type":"string","nullable":true},"urlSmall":{"type":"string","nullable":true},"width":{"type":"number","nullable":true},"height":{"type":"number","nullable":true},"art":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"reversed":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true},"back":{"type":"object","properties":{"url":{"type":"string","nullable":true},"url2x":{"type":"string","nullable":true},"urlSmall":{"type":"string","nullable":true},"width":{"type":"number","nullable":true},"height":{"type":"number","nullable":true},"art":{"type":"string","nullable":true}},"nullable":true},"localized":{"type":"object","properties":{"cards":{"type":"object","properties":{"queen-of-pentacles":{"type":"object","properties":{"name":{"type":"string","nullable":true},"suit":{"type":"string","nullable":true},"nameLocalized":{"type":"boolean","nullable":true},"upright":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"textLocalized":{"type":"boolean","nullable":true}},"nullable":true},"9-of-wands":{"type":"object","properties":{"name":{"type":"string","nullable":true},"suit":{"type":"string","nullable":true},"nameLocalized":{"type":"boolean","nullable":true},"upright":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"textLocalized":{"type":"boolean","nullable":true}},"nullable":true},"death":{"type":"object","properties":{"name":{"type":"string","nullable":true},"suit":{"type":"string","nullable":true},"nameLocalized":{"type":"boolean","nullable":true},"upright":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"textLocalized":{"type":"boolean","nullable":true}},"nullable":true}},"nullable":true},"positions":{"type":"array","items":{"type":"object","properties":{"index":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"spread":{"type":"object","properties":{"name":{"type":"string","nullable":true}},"nullable":true},"textLocalized":{"type":"boolean","nullable":true}},"nullable":true}}},"_footer":{"type":"string","description":"Free-tier watermark, present on every public response. Keys on a paid plan do not receive it.","example":"Powered by astroway.api - get your own key at https://api.astroway.info"}}},"example":{"ok":true,"data":{"spread":{"slug":"three-card","name":"Past / Present / Future","cardCount":3},"seed":42,"drawn":[{"position":{"index":0,"name":"Past","meaning":"Forces from the past shaping the situation."},"card":{"slug":"queen-of-pentacles","number":13,"name":"Queen of Pentacles","category":"court","suit":"pentacles","rank":"queen","element":"earth","upright":{"keywords":["nurture","practical","down-to-earth"],"meaning":"Nurturing practical energy; abundance through care."},"reversed":{"keywords":["smothering","work-life imbalance"],"meaning":"Smothering or imbalanced nurture."},"astrology":"water of earth","numerology":4,"yes":"yes","image":{"url":"https://cdn.astroway.info/tarot/rws-1909/queen-of-pentacles.webp","url2x":"https://cdn.astroway.info/tarot/rws-1909/queen-of-pentacles@2x.webp","urlSmall":"https://cdn.astroway.info/tarot/rws-1909/queen-of-pentacles-300.webp","width":600,"height":1039,"art":"rws-1909"}},"reversed":false},{"position":{"index":1,"name":"Present","meaning":"Energies active in the present."},"card":{"slug":"9-of-wands","number":9,"name":"Nine of Wands","category":"minor","suit":"wands","rank":"9","element":"fire","upright":{"keywords":["resilience","last stand","persistence"],"meaning":"You have what it takes; one more push."},"reversed":{"keywords":["exhaustion","paranoia"],"meaning":"Battle fatigue; need rest."},"astrology":"Moon in Sagittarius","numerology":9,"yes":"maybe","image":{"url":"https://cdn.astroway.info/tarot/rws-1909/9-of-wands.webp","url2x":"https://cdn.astroway.info/tarot/rws-1909/9-of-wands@2x.webp","urlSmall":"https://cdn.astroway.info/tarot/rws-1909/9-of-wands-300.webp","width":600,"height":1039,"art":"rws-1909"}},"reversed":true},{"position":{"index":2,"name":"Future","meaning":"Likely outcome if current course continues."},"card":{"number":13,"name":"Death","upright":{"keywords":["transformation","endings","transition","rebirth"],"meaning":"Major chapter ending; clear away what is finished."},"reversed":{"keywords":["resistance to change","inability to let go"],"meaning":"Refusing the end of a chapter; clinging to what is dead."},"astrology":"Scorpio","numerology":13,"yes":"no","slug":"death","category":"major","image":{"url":"https://cdn.astroway.info/tarot/rws-1909/death.webp","url2x":"https://cdn.astroway.info/tarot/rws-1909/death@2x.webp","urlSmall":"https://cdn.astroway.info/tarot/rws-1909/death-300.webp","width":600,"height":1039,"art":"rws-1909"}},"reversed":false}],"back":{"url":"https://cdn.astroway.info/tarot/rws-1909/back.webp","url2x":"https://cdn.astroway.info/tarot/rws-1909/back@2x.webp","urlSmall":"https://cdn.astroway.info/tarot/rws-1909/back-300.webp","width":600,"height":1039,"art":"rws-1909"},"localized":{"cards":{"queen-of-pentacles":{"name":"Королева Пентаклів","suit":"Пентаклі","nameLocalized":true,"upright":{"keywords":["турбота","практичність","приземленість"],"meaning":"Турботлива практична енергія; достаток через турботу."},"reversed":{"keywords":["надмірна опіка","дисбаланс роботи й життя"],"meaning":"Задушлива або незбалансована турбота."},"textLocalized":true},"9-of-wands":{"name":"Дев’ятка Жезлів","suit":"Жезли","nameLocalized":true,"upright":{"keywords":["стійкість","останній рубіж","наполегливість"],"meaning":"У тебе є все необхідне; ще одне зусилля."},"reversed":{"keywords":["виснаження","параноя"],"meaning":"Бойова втома; потрібен відпочинок."},"textLocalized":true},"death":{"name":"Смерть","suit":"Старший Аркан","nameLocalized":true,"upright":{"keywords":["трансформація","завершення","перехід","переродження"],"meaning":"Завершується великий розділ; прибери те, що вже скінчилося."},"reversed":{"keywords":["опір змінам","нездатність відпустити"],"meaning":"Небажання закрити розділ; чіпляння за те, що вже мертве."},"textLocalized":true}},"positions":[{"index":0,"name":"Минуле","meaning":"Сили з минулого, що формують ситуацію."},{"index":1,"name":"Теперішнє","meaning":"Енергії, активні зараз."},{"index":2,"name":"Майбутнє","meaning":"Ймовірний результат, якщо нинішній курс збережеться."}],"spread":{"name":"Минуле / Теперішнє / Майбутнє"},"textLocalized":true}},"_footer":"Powered by astroway.api - get your own key at https://api.astroway.info"}}}},"400":{"description":"Invalid sign or date","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_SIGN","message":"sign must be one of the 12 zodiac signs"}}}}}},"security":[]}},"/public/tarot/celtic-cross":{"get":{"tags":["Public"],"summary":"Tarot Celtic Cross (public, no key)","description":"Ten-card Celtic Cross from the Rider-Waite-Smith deck, the same draw as POST /tarot/rider-waite/draw/celtic-cross. Reversals included. Random per call unless `seed` is given, and never cached. `localized` follows `?lang=` / `Accept-Language` and carries, keyed by slug, the card `name` and `suit`, `upright` and `reversed` with `keywords` and `meaning`, plus `positions` (same order and `index` as the spread), and `spread.name`, in 21 languages: uk en ru de pl es pt fr it nl cs ro hu el tr ar hi ja ko vi id. `nameLocalized` says the name is in that language; `textLocalized` (per card and for the spread) says the same for the prose. The English fields beside it are the stable identifiers and never change. ","parameters":[{"name":"seed","in":"query","required":false,"description":"Integer 0-4294967295. The same seed always draws the same cards; without it every call is a new random draw.","schema":{"type":"integer","minimum":0,"maximum":4294967295}},{"name":"art","in":"query","required":false,"description":"Card art set: rws-1909 (default), rws-restored or rws-vector. GET /public/tarot/decks lists them.","schema":{"type":"string","enum":["rws-1909","rws-restored","rws-vector"]}},{"name":"lang","in":"query","required":false,"description":"Language for this call, overriding `Accept-Language`. The canonical per-call form: a page that renders in one language passes it here rather than reconfiguring its client. Unknown or inactive codes fall back to `uk`.","schema":{"type":"string","example":"en"}},{"name":"Accept-Language","in":"header","required":false,"description":"BCP-47 language (e.g. `uk`, `en`, `de`). Set it once on your HTTP client as its default; for a single call, `?lang=` overrides it. Unknown or inactive codes fall back to `uk`.","schema":{"type":"string"}},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"x-quality":"green","x-codeSamples":[{"lang":"cURL","source":"curl 'https://api.astroway.info/v1/public/tarot/celtic-cross?lang=en'"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"spread":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"cardCount":{"type":"number","nullable":true}},"nullable":true},"seed":{"type":"number","nullable":true},"drawn":{"type":"array","items":{"type":"object","properties":{"position":{"type":"object","properties":{"index":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"card":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"category":{"type":"string","nullable":true},"suit":{"type":"string","nullable":true},"rank":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"upright":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"astrology":{"type":"string","nullable":true},"numerology":{"type":"number","nullable":true},"yes":{"type":"string","nullable":true},"image":{"type":"object","properties":{"url":{"type":"string","nullable":true},"url2x":{"type":"string","nullable":true},"urlSmall":{"type":"string","nullable":true},"width":{"type":"number","nullable":true},"height":{"type":"number","nullable":true},"art":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"reversed":{"type":"boolean","nullable":true}},"nullable":true},"nullable":true},"back":{"type":"object","properties":{"url":{"type":"string","nullable":true},"url2x":{"type":"string","nullable":true},"urlSmall":{"type":"string","nullable":true},"width":{"type":"number","nullable":true},"height":{"type":"number","nullable":true},"art":{"type":"string","nullable":true}},"nullable":true},"localized":{"type":"object","properties":{"cards":{"type":"object","properties":{"queen-of-pentacles":{"type":"object","properties":{"name":{"type":"string","nullable":true},"suit":{"type":"string","nullable":true},"nameLocalized":{"type":"boolean","nullable":true},"upright":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"textLocalized":{"type":"boolean","nullable":true}},"nullable":true},"9-of-wands":{"type":"object","properties":{"name":{"type":"string","nullable":true},"suit":{"type":"string","nullable":true},"nameLocalized":{"type":"boolean","nullable":true},"upright":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"textLocalized":{"type":"boolean","nullable":true}},"nullable":true},"death":{"type":"object","properties":{"name":{"type":"string","nullable":true},"suit":{"type":"string","nullable":true},"nameLocalized":{"type":"boolean","nullable":true},"upright":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"textLocalized":{"type":"boolean","nullable":true}},"nullable":true},"king-of-swords":{"type":"object","properties":{"name":{"type":"string","nullable":true},"suit":{"type":"string","nullable":true},"nameLocalized":{"type":"boolean","nullable":true},"upright":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"textLocalized":{"type":"boolean","nullable":true}},"nullable":true},"the-emperor":{"type":"object","properties":{"name":{"type":"string","nullable":true},"suit":{"type":"string","nullable":true},"nameLocalized":{"type":"boolean","nullable":true},"upright":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"textLocalized":{"type":"boolean","nullable":true}},"nullable":true},"3-of-swords":{"type":"object","properties":{"name":{"type":"string","nullable":true},"suit":{"type":"string","nullable":true},"nameLocalized":{"type":"boolean","nullable":true},"upright":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"textLocalized":{"type":"boolean","nullable":true}},"nullable":true},"3-of-wands":{"type":"object","properties":{"name":{"type":"string","nullable":true},"suit":{"type":"string","nullable":true},"nameLocalized":{"type":"boolean","nullable":true},"upright":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"textLocalized":{"type":"boolean","nullable":true}},"nullable":true},"the-devil":{"type":"object","properties":{"name":{"type":"string","nullable":true},"suit":{"type":"string","nullable":true},"nameLocalized":{"type":"boolean","nullable":true},"upright":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"textLocalized":{"type":"boolean","nullable":true}},"nullable":true},"knight-of-swords":{"type":"object","properties":{"name":{"type":"string","nullable":true},"suit":{"type":"string","nullable":true},"nameLocalized":{"type":"boolean","nullable":true},"upright":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"textLocalized":{"type":"boolean","nullable":true}},"nullable":true},"the-world":{"type":"object","properties":{"name":{"type":"string","nullable":true},"suit":{"type":"string","nullable":true},"nameLocalized":{"type":"boolean","nullable":true},"upright":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"textLocalized":{"type":"boolean","nullable":true}},"nullable":true}},"nullable":true},"positions":{"type":"array","items":{"type":"object","properties":{"index":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"meaning":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"spread":{"type":"object","properties":{"name":{"type":"string","nullable":true}},"nullable":true},"textLocalized":{"type":"boolean","nullable":true}},"nullable":true}}},"_footer":{"type":"string","description":"Free-tier watermark, present on every public response. Keys on a paid plan do not receive it.","example":"Powered by astroway.api - get your own key at https://api.astroway.info"}}},"example":{"ok":true,"data":{"spread":{"slug":"celtic-cross","name":"Celtic Cross","cardCount":10},"seed":42,"drawn":[{"position":{"index":0,"name":"Present","meaning":"The heart of the matter now."},"card":{"slug":"queen-of-pentacles","number":13,"name":"Queen of Pentacles","category":"court","suit":"pentacles","rank":"queen","element":"earth","upright":{"keywords":["nurture","practical","down-to-earth"],"meaning":"Nurturing practical energy; abundance through care."},"reversed":{"keywords":["smothering","work-life imbalance"],"meaning":"Smothering or imbalanced nurture."},"astrology":"water of earth","numerology":4,"yes":"yes","image":{"url":"https://cdn.astroway.info/tarot/rws-1909/queen-of-pentacles.webp","url2x":"https://cdn.astroway.info/tarot/rws-1909/queen-of-pentacles@2x.webp","urlSmall":"https://cdn.astroway.info/tarot/rws-1909/queen-of-pentacles-300.webp","width":600,"height":1039,"art":"rws-1909"}},"reversed":false},{"position":{"index":1,"name":"Crossing","meaning":"Immediate challenge."},"card":{"slug":"9-of-wands","number":9,"name":"Nine of Wands","category":"minor","suit":"wands","rank":"9","element":"fire","upright":{"keywords":["resilience","last stand","persistence"],"meaning":"You have what it takes; one more push."},"reversed":{"keywords":["exhaustion","paranoia"],"meaning":"Battle fatigue; need rest."},"astrology":"Moon in Sagittarius","numerology":9,"yes":"maybe","image":{"url":"https://cdn.astroway.info/tarot/rws-1909/9-of-wands.webp","url2x":"https://cdn.astroway.info/tarot/rws-1909/9-of-wands@2x.webp","urlSmall":"https://cdn.astroway.info/tarot/rws-1909/9-of-wands-300.webp","width":600,"height":1039,"art":"rws-1909"}},"reversed":true},{"position":{"index":2,"name":"Crown","meaning":"Conscious goal."},"card":{"number":13,"name":"Death","upright":{"keywords":["transformation","endings","transition","rebirth"],"meaning":"Major chapter ending; clear away what is finished."},"reversed":{"keywords":["resistance to change","inability to let go"],"meaning":"Refusing the end of a chapter; clinging to what is dead."},"astrology":"Scorpio","numerology":13,"yes":"no","slug":"death","category":"major","image":{"url":"https://cdn.astroway.info/tarot/rws-1909/death.webp","url2x":"https://cdn.astroway.info/tarot/rws-1909/death@2x.webp","urlSmall":"https://cdn.astroway.info/tarot/rws-1909/death-300.webp","width":600,"height":1039,"art":"rws-1909"}},"reversed":false},{"position":{"index":3,"name":"Foundation","meaning":"Subconscious ground."},"card":{"slug":"king-of-swords","number":14,"name":"King of Swords","category":"court","suit":"swords","rank":"king","element":"air","upright":{"keywords":["intellectual authority","truth","ethical leadership"],"meaning":"Ethical authority based on truth."},"reversed":{"keywords":["manipulation","tyranny of intellect"],"meaning":"Cold or tyrannical use of mind."},"astrology":"fire of air","numerology":5,"yes":"yes","image":{"url":"https://cdn.astroway.info/tarot/rws-1909/king-of-swords.webp","url2x":"https://cdn.astroway.info/tarot/rws-1909/king-of-swords@2x.webp","urlSmall":"https://cdn.astroway.info/tarot/rws-1909/king-of-swords-300.webp","width":600,"height":1039,"art":"rws-1909"}},"reversed":true},{"position":{"index":4,"name":"Past","meaning":"Recent past."},"card":{"number":4,"name":"The Emperor","upright":{"keywords":["authority","structure","control","fatherhood"],"meaning":"Build solid structure; lead with discipline."},"reversed":{"keywords":["tyranny","rigidity","lack of self-control"],"meaning":"Authoritarian misuse of power or breakdown of structure."},"astrology":"Aries","numerology":4,"yes":"yes","slug":"the-emperor","category":"major","image":{"url":"https://cdn.astroway.info/tarot/rws-1909/the-emperor.webp","url2x":"https://cdn.astroway.info/tarot/rws-1909/the-emperor@2x.webp","urlSmall":"https://cdn.astroway.info/tarot/rws-1909/the-emperor-300.webp","width":600,"height":1039,"art":"rws-1909"}},"reversed":false},{"position":{"index":5,"name":"Near Future","meaning":"Approaching influence."},"card":{"slug":"3-of-swords","number":3,"name":"Three of Swords","category":"minor","suit":"swords","rank":"3","element":"air","upright":{"keywords":["heartbreak","sorrow","grief"],"meaning":"Painful but necessary truth; grief."},"reversed":{"keywords":["recovery","forgiveness"],"meaning":"Healing from heartbreak."},"astrology":"Saturn in Libra","numerology":3,"yes":"no","image":{"url":"https://cdn.astroway.info/tarot/rws-1909/3-of-swords.webp","url2x":"https://cdn.astroway.info/tarot/rws-1909/3-of-swords@2x.webp","urlSmall":"https://cdn.astroway.info/tarot/rws-1909/3-of-swords-300.webp","width":600,"height":1039,"art":"rws-1909"}},"reversed":true},{"position":{"index":6,"name":"Self","meaning":"How you appear."},"card":{"slug":"3-of-wands","number":3,"name":"Three of Wands","category":"minor","suit":"wands","rank":"3","element":"fire","upright":{"keywords":["expansion","foresight","overseas opportunities"],"meaning":"Expansion succeeding; outlook is good."},"reversed":{"keywords":["delays","frustration","lack of foresight"],"meaning":"Plans delayed by oversight."},"astrology":"Sun in Aries","numerology":3,"yes":"yes","image":{"url":"https://cdn.astroway.info/tarot/rws-1909/3-of-wands.webp","url2x":"https://cdn.astroway.info/tarot/rws-1909/3-of-wands@2x.webp","urlSmall":"https://cdn.astroway.info/tarot/rws-1909/3-of-wands-300.webp","width":600,"height":1039,"art":"rws-1909"}},"reversed":false},{"position":{"index":7,"name":"Environment","meaning":"Outside forces."},"card":{"number":15,"name":"The Devil","upright":{"keywords":["attachment","addiction","shadow","materialism"],"meaning":"Bondage by attachment or shadow content; see what holds you."},"reversed":{"keywords":["breaking free","release","detachment"],"meaning":"Breaking free of an attachment or addiction."},"astrology":"Capricorn","numerology":15,"yes":"no","slug":"the-devil","category":"major","image":{"url":"https://cdn.astroway.info/tarot/rws-1909/the-devil.webp","url2x":"https://cdn.astroway.info/tarot/rws-1909/the-devil@2x.webp","urlSmall":"https://cdn.astroway.info/tarot/rws-1909/the-devil-300.webp","width":600,"height":1039,"art":"rws-1909"}},"reversed":true},{"position":{"index":8,"name":"Hopes and Fears","meaning":"Inner emotional layer."},"card":{"slug":"knight-of-swords","number":12,"name":"Knight of Swords","category":"court","suit":"swords","rank":"knight","element":"air","upright":{"keywords":["decisive action","charging in"],"meaning":"Bold action; rapid pursuit."},"reversed":{"keywords":["recklessness","aggression"],"meaning":"Reckless aggression."},"astrology":"air of air","numerology":3,"yes":"yes","image":{"url":"https://cdn.astroway.info/tarot/rws-1909/knight-of-swords.webp","url2x":"https://cdn.astroway.info/tarot/rws-1909/knight-of-swords@2x.webp","urlSmall":"https://cdn.astroway.info/tarot/rws-1909/knight-of-swords-300.webp","width":600,"height":1039,"art":"rws-1909"}},"reversed":true},{"position":{"index":9,"name":"Outcome","meaning":"Likely outcome."},"card":{"number":21,"name":"The World","upright":{"keywords":["completion","integration","accomplishment","travel"],"meaning":"Cycle complete; integration achieved; world opens."},"reversed":{"keywords":["incomplete","short-cuts","lack of closure"],"meaning":"Incomplete chapter; closure pending."},"astrology":"Saturn","numerology":21,"yes":"yes","slug":"the-world","category":"major","image":{"url":"https://cdn.astroway.info/tarot/rws-1909/the-world.webp","url2x":"https://cdn.astroway.info/tarot/rws-1909/the-world@2x.webp","urlSmall":"https://cdn.astroway.info/tarot/rws-1909/the-world-300.webp","width":600,"height":1039,"art":"rws-1909"}},"reversed":false}],"back":{"url":"https://cdn.astroway.info/tarot/rws-1909/back.webp","url2x":"https://cdn.astroway.info/tarot/rws-1909/back@2x.webp","urlSmall":"https://cdn.astroway.info/tarot/rws-1909/back-300.webp","width":600,"height":1039,"art":"rws-1909"},"localized":{"cards":{"queen-of-pentacles":{"name":"Королева Пентаклів","suit":"Пентаклі","nameLocalized":true,"upright":{"keywords":["турбота","практичність","приземленість"],"meaning":"Турботлива практична енергія; достаток через турботу."},"reversed":{"keywords":["надмірна опіка","дисбаланс роботи й життя"],"meaning":"Задушлива або незбалансована турбота."},"textLocalized":true},"9-of-wands":{"name":"Дев’ятка Жезлів","suit":"Жезли","nameLocalized":true,"upright":{"keywords":["стійкість","останній рубіж","наполегливість"],"meaning":"У тебе є все необхідне; ще одне зусилля."},"reversed":{"keywords":["виснаження","параноя"],"meaning":"Бойова втома; потрібен відпочинок."},"textLocalized":true},"death":{"name":"Смерть","suit":"Старший Аркан","nameLocalized":true,"upright":{"keywords":["трансформація","завершення","перехід","переродження"],"meaning":"Завершується великий розділ; прибери те, що вже скінчилося."},"reversed":{"keywords":["опір змінам","нездатність відпустити"],"meaning":"Небажання закрити розділ; чіпляння за те, що вже мертве."},"textLocalized":true},"king-of-swords":{"name":"Король Мечів","suit":"Мечі","nameLocalized":true,"upright":{"keywords":["інтелектуальний авторитет","істина","етичне лідерство"],"meaning":"Етичний авторитет, заснований на істині."},"reversed":{"keywords":["маніпуляція","тиранія інтелекту"],"meaning":"Холодне або тиранічне використання розуму."},"textLocalized":true},"the-emperor":{"name":"Імператор","suit":"Старший Аркан","nameLocalized":true,"upright":{"keywords":["влада","структура","контроль","батьківство"],"meaning":"Будуй міцну структуру; веди за собою через дисципліну."},"reversed":{"keywords":["тиранія","негнучкість","брак самоконтролю"],"meaning":"Авторитарне зловживання владою або руйнування структури."},"textLocalized":true},"3-of-swords":{"name":"Трійка Мечів","suit":"Мечі","nameLocalized":true,"upright":{"keywords":["розбите серце","смуток","горе"],"meaning":"Болюча, але необхідна правда; горе."},"reversed":{"keywords":["одужання","прощення"],"meaning":"Зцілення після розбитого серця."},"textLocalized":true},"3-of-wands":{"name":"Трійка Жезлів","suit":"Жезли","nameLocalized":true,"upright":{"keywords":["розширення","передбачливість","можливості за кордоном"],"meaning":"Розширення вдається; перспективи добрі."},"reversed":{"keywords":["затримки","розчарування","брак передбачливості"],"meaning":"Плани затримуються через недогляд."},"textLocalized":true},"the-devil":{"name":"Диявол","suit":"Старший Аркан","nameLocalized":true,"upright":{"keywords":["прив'язаність","залежність","тінь","матеріалізм"],"meaning":"Кайдани прив'язаності або тіньового змісту; побач, що тебе тримає."},"reversed":{"keywords":["звільнення","вивільнення","відстороненість"],"meaning":"Звільнення від прив'язаності або залежності."},"textLocalized":true},"knight-of-swords":{"name":"Лицар Мечів","suit":"Мечі","nameLocalized":true,"upright":{"keywords":["рішучі дії","стрімкий натиск"],"meaning":"Сміливі дії; швидке переслідування мети."},"reversed":{"keywords":["безрозсудність","агресія"],"meaning":"Безрозсудна агресія."},"textLocalized":true},"the-world":{"name":"Світ","suit":"Старший Аркан","nameLocalized":true,"upright":{"keywords":["завершення","інтеграція","звершення","подорожі"],"meaning":"Цикл завершено; цілісність досягнуто; світ відкривається."},"reversed":{"keywords":["незавершеність","обхідні шляхи","брак завершеності"],"meaning":"Незакритий розділ; завершення ще попереду."},"textLocalized":true}},"positions":[{"index":0,"name":"Теперішнє","meaning":"Суть питання зараз."},{"index":1,"name":"Перешкода","meaning":"Безпосередній виклик."},{"index":2,"name":"Вінець","meaning":"Усвідомлена мета."},{"index":3,"name":"Основа","meaning":"Підсвідоме підґрунтя."},{"index":4,"name":"Минуле","meaning":"Недавнє минуле."},{"index":5,"name":"Найближче майбутнє","meaning":"Вплив, що наближається."},{"index":6,"name":"Я","meaning":"Яким ти постаєш."},{"index":7,"name":"Оточення","meaning":"Зовнішні сили."},{"index":8,"name":"Надії та страхи","meaning":"Внутрішній емоційний шар."},{"index":9,"name":"Результат","meaning":"Ймовірний результат."}],"spread":{"name":"Кельтський хрест"},"textLocalized":true}},"_footer":"Powered by astroway.api - get your own key at https://api.astroway.info"}}}},"400":{"description":"Invalid sign or date","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_SIGN","message":"sign must be one of the 12 zodiac signs"}}}}}},"security":[]}},"/public/tarot/decks":{"get":{"tags":["Public"],"summary":"Tarot decks and card art (public, no key)","description":"Every deck with its spreads and the public-domain card art sets: id, artist, year, licence, source, a preview image, the card back, and any card a set has no picture for. The same answer as GET /tarot/decks. Cached for a day.","parameters":[{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"x-quality":"green","x-codeSamples":[{"lang":"cURL","source":"curl 'https://api.astroway.info/v1/public/tarot/decks'"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"deck":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"cards":{"type":"number","nullable":true},"spreads":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"cardCount":{"type":"number","nullable":true}},"nullable":true},"nullable":true},"art":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"artist":{"type":"string","nullable":true},"year":{"type":"string","nullable":true},"licence":{"type":"string","nullable":true},"source":{"type":"string","nullable":true},"note":{"type":"string","nullable":true},"preview":{"type":"object","properties":{"url":{"type":"string","nullable":true},"url2x":{"type":"string","nullable":true},"urlSmall":{"type":"string","nullable":true},"width":{"type":"number","nullable":true},"height":{"type":"number","nullable":true},"art":{"type":"string","nullable":true}},"nullable":true},"back":{"type":"object","properties":{"url":{"type":"string","nullable":true},"url2x":{"type":"string","nullable":true},"urlSmall":{"type":"string","nullable":true},"width":{"type":"number","nullable":true},"height":{"type":"number","nullable":true},"art":{"type":"string","nullable":true}},"nullable":true},"missing":{"type":"array","items":{},"nullable":true}},"nullable":true},"nullable":true}},"nullable":true},"nullable":true}}},"_footer":{"type":"string","description":"Free-tier watermark, present on every public response. Keys on a paid plan do not receive it.","example":"Powered by astroway.api - get your own key at https://api.astroway.info"}}},"example":{"ok":true,"data":{"items":[{"deck":"rider-waite","name":"Rider-Waite-Smith","cards":78,"spreads":[{"slug":"single-card","name":"Single Card","cardCount":1},{"slug":"three-card","name":"Past / Present / Future","cardCount":3},{"slug":"celtic-cross","name":"Celtic Cross","cardCount":10},{"slug":"horseshoe","name":"Horseshoe","cardCount":7},{"slug":"relationship","name":"Relationship","cardCount":7},{"slug":"year-ahead","name":"Year Ahead","cardCount":13},{"slug":"decision","name":"Yes / No Decision","cardCount":1},{"slug":"chakra","name":"Chakra Spread","cardCount":7},{"slug":"career","name":"Career","cardCount":5},{"slug":"love-triangle","name":"Love Triangle","cardCount":6},{"slug":"spiritual-path","name":"Spiritual Path","cardCount":5},{"slug":"shadow-work","name":"Shadow Work","cardCount":6}],"art":[{"id":"rws-1909","name":"Rider-Waite-Smith 1909","artist":"Pamela Colman Smith","year":"1909","licence":"Public domain","source":"https://commons.wikimedia.org/wiki/Category:Rider-Waite_tarot_deck_(Roses_%26_Lilies)","note":"The first printing, with the original colouring.","preview":{"url":"https://cdn.astroway.info/tarot/rws-1909/the-fool.webp","url2x":"https://cdn.astroway.info/tarot/rws-1909/the-fool@2x.webp","urlSmall":"https://cdn.astroway.info/tarot/rws-1909/the-fool-300.webp","width":600,"height":1039,"art":"rws-1909"},"back":{"url":"https://cdn.astroway.info/tarot/rws-1909/back.webp","url2x":"https://cdn.astroway.info/tarot/rws-1909/back@2x.webp","urlSmall":"https://cdn.astroway.info/tarot/rws-1909/back-300.webp","width":600,"height":1039,"art":"rws-1909"},"missing":[]},{"id":"rws-restored","name":"Rider-Waite-Smith, restored","artist":"Pamela Colman Smith","year":"1909","licence":"Public domain","source":"https://commons.wikimedia.org/wiki/Category:Rider-Waite-Smith_tarot_deck_(Geldard)","note":"A clean restoration of the 1909 art with even colour.","preview":{"url":"https://cdn.astroway.info/tarot/rws-restored/the-fool.webp","url2x":"https://cdn.astroway.info/tarot/rws-restored/the-fool@2x.webp","urlSmall":"https://cdn.astroway.info/tarot/rws-restored/the-fool-300.webp","width":600,"height":1028,"art":"rws-restored"},"back":{"url":"https://cdn.astroway.info/tarot/rws-1909/back.webp","url2x":"https://cdn.astroway.info/tarot/rws-1909/back@2x.webp","urlSmall":"https://cdn.astroway.info/tarot/rws-1909/back-300.webp","width":600,"height":1039,"art":"rws-1909"},"missing":[]},{"id":"rws-vector","name":"Rider-Waite-Smith, vector","artist":"Pamela Colman Smith, vectorised by Immanuelle","year":"1909","licence":"Public domain","source":"https://commons.wikimedia.org/wiki/Category:Vectorized_Tarot_by_Immanuelle","note":"Flat redrawn lines and colour, crisp at any size.","preview":{"url":"https://cdn.astroway.info/tarot/rws-vector/the-fool.webp","url2x":"https://cdn.astroway.info/tarot/rws-vector/the-fool@2x.webp","urlSmall":"https://cdn.astroway.info/tarot/rws-vector/the-fool-300.webp","width":600,"height":1000,"art":"rws-vector"},"back":{"url":"https://cdn.astroway.info/tarot/rws-vector/back.webp","url2x":"https://cdn.astroway.info/tarot/rws-vector/back@2x.webp","urlSmall":"https://cdn.astroway.info/tarot/rws-vector/back-300.webp","width":600,"height":1000,"art":"rws-vector"},"missing":[]}]},{"deck":"marseille","name":"Tarot de Marseille","cards":78,"spreads":[{"slug":"single-card","name":"Single Card","cardCount":1},{"slug":"three-card","name":"Three-Card","cardCount":3},{"slug":"jodorowsky-cross","name":"Tirage Réduit (Jodorowsky Reduced Cross)","cardCount":5},{"slug":"jodorowsky-hero","name":"Tirage du Héros (Jodorowsky Hero's Journey)","cardCount":6},{"slug":"seven-card","name":"Seven-Card Pyramid","cardCount":7},{"slug":"celtic-cross","name":"Celtic Cross (Marseille)","cardCount":10},{"slug":"decision","name":"Decision","cardCount":1},{"slug":"love","name":"Love Spread","cardCount":5},{"slug":"career","name":"Career","cardCount":4},{"slug":"spiritual","name":"Spiritual Path","cardCount":4}],"art":[{"id":"arnoult-1748","name":"Tarot de Marseille, Arnoult","artist":"Arnoult","year":"1748","licence":"Public domain","source":"https://gallica.bnf.fr/ark:/12148/btv1b10510965g","note":null,"preview":{"url":"https://cdn.astroway.info/tarot/arnoult-1748/le-mat-the-fool-marseille.webp","url2x":"https://cdn.astroway.info/tarot/arnoult-1748/le-mat-the-fool-marseille@2x.webp","urlSmall":"https://cdn.astroway.info/tarot/arnoult-1748/le-mat-the-fool-marseille-300.webp","width":600,"height":1096,"art":"arnoult-1748"},"back":null,"missing":[]}]},{"deck":"lenormand","name":"Lenormand","cards":36,"spreads":[{"slug":"three-card","name":"Three-Card Line","cardCount":3},{"slug":"grand-tableau","name":"Grand Tableau","cardCount":36},{"slug":"nine-card-square","name":"9-Card Square (3×3)","cardCount":9},{"slug":"line-of-five","name":"Line of Five","cardCount":5},{"slug":"celtic-cross-lenormand","name":"Detailed 10-Card Cross (modern hybrid)","cardCount":10},{"slug":"relationship","name":"Relationship","cardCount":7}],"art":[{"id":"dondorf","name":"Lenormand, Dondorf","artist":"B. Dondorf, Frankfurt","year":"19th century","licence":"Public domain","source":"https://gallica.bnf.fr/ark:/12148/btv1b105431980","note":"The scan lacks card 32, the Moon, which has no image in this set.","preview":{"url":"https://cdn.astroway.info/tarot/dondorf/rider.webp","url2x":"https://cdn.astroway.info/tarot/dondorf/rider@2x.webp","urlSmall":"https://cdn.astroway.info/tarot/dondorf/rider-300.webp","width":600,"height":958,"art":"dondorf"},"back":{"url":"https://cdn.astroway.info/tarot/dondorf/back.webp","url2x":"https://cdn.astroway.info/tarot/dondorf/back@2x.webp","urlSmall":"https://cdn.astroway.info/tarot/dondorf/back-300.webp","width":600,"height":958,"art":"dondorf"},"missing":["moon"]}]}]},"_footer":"Powered by astroway.api - get your own key at https://api.astroway.info"}}}},"400":{"description":"Invalid sign or date","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_SIGN","message":"sign must be one of the 12 zodiac signs"}}}}}},"security":[]}},"/public/chinese/zodiac/daily":{"get":{"tags":["Public"],"summary":"Chinese sign of the day (public, no key)","description":"One animal against one day: the day pillar and the year pillar (from Li Chun), how their branches stand to the animal (`same`, `secretFriend` 六合, `trine` 三合, `clash` 六冲, `harm` 六害 or `neutral`), `benMingNian` when the year is the animal's own, and `energy`, 1-10 from 5 with every step in `factors`: a stated heuristic (day: friend or trine +2, same +1, harm -2, clash -3; year: friend or trine +1, same or harm -1, clash -2), not a classical score. Computed, no model. Animal and element names follow `?lang=`. Costs 1 unit of the public bucket.","parameters":[{"name":"animal","in":"query","required":true,"description":"One of the twelve, English, any case.","schema":{"type":"string","enum":["rat","ox","tiger","rabbit","dragon","snake","horse","goat","monkey","rooster","dog","pig"]}},{"name":"date","in":"query","required":false,"description":"Calendar date `YYYY-MM-DD` (UTC). Defaults to today.","schema":{"type":"string","format":"date"}},{"name":"lang","in":"query","required":false,"description":"Language for this call, overriding `Accept-Language`. The canonical per-call form: a page that renders in one language passes it here rather than reconfiguring its client. Unknown or inactive codes fall back to `uk`.","schema":{"type":"string","example":"en"}},{"name":"Accept-Language","in":"header","required":false,"description":"BCP-47 language (e.g. `uk`, `en`, `de`). Set it once on your HTTP client as its default; for a single call, `?lang=` overrides it. Unknown or inactive codes fall back to `uk`.","schema":{"type":"string"}},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"x-quality":"green","x-codeSamples":[{"lang":"cURL","source":"curl 'https://api.astroway.info/v1/public/chinese/zodiac/daily?animal=horse&date=2026-10-07&lang=en'"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"animal":{"type":"string","nullable":true},"animalName":{"type":"string","nullable":true},"date":{"type":"string","nullable":true},"dayPillar":{"type":"object","properties":{"stem":{"type":"string","nullable":true},"branch":{"type":"string","nullable":true},"animal":{"type":"string","nullable":true},"animalName":{"type":"string","nullable":true},"stemHanzi":{"type":"string","nullable":true},"branchHanzi":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"elementName":{"type":"string","nullable":true},"yin":{"type":"boolean","nullable":true}},"nullable":true},"yearPillar":{"type":"object","properties":{"stem":{"type":"string","nullable":true},"branch":{"type":"string","nullable":true},"animal":{"type":"string","nullable":true},"animalName":{"type":"string","nullable":true},"stemHanzi":{"type":"string","nullable":true},"branchHanzi":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"elementName":{"type":"string","nullable":true},"yin":{"type":"boolean","nullable":true},"solarYear":{"type":"number","nullable":true}},"nullable":true},"day":{"type":"object","properties":{"relation":{"type":"string","nullable":true},"chinese":{"type":"string","nullable":true}},"nullable":true},"year":{"type":"object","properties":{"relation":{"type":"string","nullable":true},"chinese":{"nullable":true}},"nullable":true},"benMingNian":{"type":"boolean","nullable":true},"energy":{"type":"object","properties":{"score":{"type":"number","nullable":true},"factors":{"type":"array","items":{"type":"object","properties":{"source":{"type":"string","nullable":true},"relation":{"type":"string","nullable":true},"chinese":{"type":"string","nullable":true},"effect":{"type":"number","nullable":true}},"nullable":true},"nullable":true}},"nullable":true}}},"_footer":{"type":"string","description":"Free-tier watermark, present on every public response. Keys on a paid plan do not receive it.","example":"Powered by astroway.api - get your own key at https://api.astroway.info"}}},"example":{"ok":true,"data":{"animal":"Horse","animalName":"Horse","date":"2026-10-07","dayPillar":{"stem":"Jia","branch":"Yin","animal":"Tiger","animalName":"Tiger","stemHanzi":"甲","branchHanzi":"寅","element":"Wood","elementName":"Wood","yin":false},"yearPillar":{"stem":"Bing","branch":"Wu","animal":"Horse","animalName":"Horse","stemHanzi":"丙","branchHanzi":"午","element":"Fire","elementName":"Fire","yin":false,"solarYear":2026},"day":{"relation":"trine","chinese":"三合"},"year":{"relation":"same","chinese":null},"benMingNian":true,"energy":{"score":6,"factors":[{"source":"day","relation":"trine","chinese":"三合","effect":2},{"source":"year","relation":"same","chinese":null,"effect":-1}]}},"_footer":"Powered by astroway.api - get your own key at https://api.astroway.info"}}}},"400":{"description":"Invalid sign or date","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_SIGN","message":"sign must be one of the 12 zodiac signs"}}}}}},"security":[]}},"/public/chinese/zodiac/daily-reading":{"get":{"tags":["Public"],"summary":"Chinese sign reading of the day (public, no key)","description":"GET /public/chinese/zodiac/daily read into prose in the requested language: the same fields plus `reading` with `overview`, `love`, `career` and `advice`, and `disclaimer`, `model`, `language`. The reading uses only the facts in the answer (pillars, branch relations, Ben Ming Nian, energy and its factors): no lucky numbers, colours or directions. Generated once per animal, date and language and cached for the day, so every site gets the same text. 503 `AI_UNAVAILABLE` if no model answers. Costs 1 unit of the public bucket.","parameters":[{"name":"animal","in":"query","required":true,"description":"One of the twelve, English, any case.","schema":{"type":"string","enum":["rat","ox","tiger","rabbit","dragon","snake","horse","goat","monkey","rooster","dog","pig"]}},{"name":"date","in":"query","required":false,"description":"Calendar date `YYYY-MM-DD` (UTC). Defaults to today.","schema":{"type":"string","format":"date"}},{"name":"lang","in":"query","required":false,"description":"Language for this call, overriding `Accept-Language`. The canonical per-call form: a page that renders in one language passes it here rather than reconfiguring its client. Unknown or inactive codes fall back to `uk`.","schema":{"type":"string","example":"en"}},{"name":"Accept-Language","in":"header","required":false,"description":"BCP-47 language (e.g. `uk`, `en`, `de`). Set it once on your HTTP client as its default; for a single call, `?lang=` overrides it. Unknown or inactive codes fall back to `uk`.","schema":{"type":"string"}},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"x-quality":"green","x-codeSamples":[{"lang":"cURL","source":"curl 'https://api.astroway.info/v1/public/chinese/zodiac/daily-reading?animal=horse&date=2026-10-07&lang=en'"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"animal":{"type":"string","nullable":true},"animalName":{"type":"string","nullable":true},"date":{"type":"string","nullable":true},"dayPillar":{"type":"object","properties":{"stem":{"type":"string","nullable":true},"branch":{"type":"string","nullable":true},"animal":{"type":"string","nullable":true},"element":{"type":"string","nullable":true},"yin":{"type":"boolean","nullable":true}},"nullable":true},"year":{"type":"object","properties":{"relation":{"type":"string","nullable":true},"chinese":{"nullable":true}},"nullable":true},"day":{"type":"object","properties":{"relation":{"type":"string","nullable":true},"chinese":{"type":"string","nullable":true}},"nullable":true},"benMingNian":{"type":"boolean","nullable":true},"energy":{"type":"object","properties":{"score":{"type":"number","nullable":true},"factors":{"type":"array","items":{"type":"object","properties":{"source":{"type":"string","nullable":true},"relation":{"type":"string","nullable":true},"chinese":{"type":"string","nullable":true},"effect":{"type":"number","nullable":true}},"nullable":true},"nullable":true}},"nullable":true},"reading":{"type":"object","properties":{"overview":{"type":"string","nullable":true},"love":{"type":"string","nullable":true},"career":{"type":"string","nullable":true},"advice":{"type":"string","nullable":true}},"nullable":true},"disclaimer":{"type":"string","nullable":true},"model":{"type":"string","nullable":true},"language":{"type":"string","nullable":true}}},"_footer":{"type":"string","description":"Free-tier watermark, present on every public response. Keys on a paid plan do not receive it.","example":"Powered by astroway.api - get your own key at https://api.astroway.info"}}},"example":{"ok":true,"data":{"animal":"Horse","animalName":"Horse","date":"2026-10-07","dayPillar":{"stem":"Jia","branch":"Yin","animal":"Tiger","element":"Wood","yin":false},"year":{"relation":"same","chinese":null},"day":{"relation":"trine","chinese":"三合"},"benMingNian":true,"energy":{"score":6,"factors":[{"source":"day","relation":"trine","chinese":"三合","effect":2},{"source":"year","relation":"same","chinese":null,"effect":-1}]},"reading":{"overview":"A yang Wood Tiger day sits in the Horse's own trine...","love":"Warmth comes easily today...","career":"Shared work moves faster than solo effort...","advice":"Say yes to one invitation you would usually postpone."},"disclaimer":"This is generated by AI for entertainment and self-reflection purposes only.","model":"gemini/gemini-2.5-flash","language":"en"},"_footer":"Powered by astroway.api - get your own key at https://api.astroway.info"}}}},"400":{"description":"Invalid sign or date","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_SIGN","message":"sign must be one of the 12 zodiac signs"}}}}}},"security":[]}},"/public/chinese/zodiac/animal":{"post":{"parameters":[{"name":"lang","in":"query","required":false,"description":"Language for this call, overriding `Accept-Language`. The canonical per-call form: a page that renders in one language passes it here rather than reconfiguring its client. Unknown or inactive codes fall back to `uk`.","schema":{"type":"string","example":"en"}},{"name":"Accept-Language","in":"header","required":false,"description":"BCP-47 language (e.g. `uk`, `en`, `de`). Set it once on your HTTP client as its default; for a single call, `?lang=` overrides it. Unknown or inactive codes fall back to `uk`.","schema":{"type":"string"}},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"tags":["Public"],"summary":"Chinese zodiac animal for a birth date (public, no key)","description":"The same answer as POST /chinese/zodiac/animal, served anonymously: animal, stem, branch and element of the solar year the date falls in. The year turns at Li Chun (around 4 February), not on 1 January, so send `time` and `timezoneOffset` for a birth near that boundary. `animalName`, `fixedName` and `cyclingName` follow `?lang=`; the English identifiers stay as they are. Costs 1 unit of the public bucket. Characters (simplified, traditional beside the animal) and Hanyu Pinyin with tone marks for the animal, stem and branch; `hours` is the double hour of the branch in local clock time (Rat 23:00-01:00); `trine` (三合), `secretFriend` (六合), `clash` (六冲) and `harm` (六害) are the fixed branch relations, the same arithmetic the BaZi interactions use. Pair it with GET /public/chinese/zodiac/texts for the reading.","x-quality":"green","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChineseDateTimeInput"},"example":{"date":"1990-05-15"}}}},"x-codeSamples":[{"lang":"cURL","source":"curl -X POST 'https://api.astroway.info/v1/public/chinese/zodiac/animal?lang=en' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"date\":\"1990-05-15\"}'"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"solarYear":{"type":"number","nullable":true},"animal":{"type":"string","nullable":true},"animalName":{"type":"string","nullable":true},"glyph":{"type":"string","nullable":true},"animalHanzi":{"type":"string","nullable":true},"animalHanziTraditional":{"type":"string","nullable":true},"animalPinyin":{"type":"string","nullable":true},"stemHanzi":{"type":"string","nullable":true},"stemPinyin":{"type":"string","nullable":true},"branchHanzi":{"type":"string","nullable":true},"branchPinyin":{"type":"string","nullable":true},"hours":{"type":"object","properties":{"start":{"type":"string","nullable":true},"end":{"type":"string","nullable":true}},"nullable":true},"trine":{"type":"object","properties":{"element":{"type":"string","nullable":true},"elementName":{"type":"string","nullable":true},"chinese":{"type":"string","nullable":true},"animals":{"type":"array","items":{"type":"object","properties":{"animal":{"type":"string","nullable":true},"animalName":{"type":"string","nullable":true}},"nullable":true},"nullable":true}},"nullable":true},"secretFriend":{"type":"object","properties":{"animal":{"type":"string","nullable":true},"animalName":{"type":"string","nullable":true},"branch":{"type":"string","nullable":true},"chinese":{"type":"string","nullable":true}},"nullable":true},"clash":{"type":"object","properties":{"animal":{"type":"string","nullable":true},"animalName":{"type":"string","nullable":true},"branch":{"type":"string","nullable":true},"chinese":{"type":"string","nullable":true}},"nullable":true},"harm":{"type":"object","properties":{"animal":{"type":"string","nullable":true},"animalName":{"type":"string","nullable":true},"branch":{"type":"string","nullable":true},"chinese":{"type":"string","nullable":true}},"nullable":true},"branch":{"type":"string","nullable":true},"stem":{"type":"string","nullable":true},"element":{"type":"object","properties":{"fixed":{"type":"string","nullable":true},"fixedName":{"type":"string","nullable":true},"cycling":{"type":"string","nullable":true},"cyclingName":{"type":"string","nullable":true},"yin":{"type":"boolean","nullable":true}},"nullable":true},"pillar":{"type":"string","nullable":true},"yearStart":{"type":"object","properties":{"utc":{"type":"string","nullable":true},"beijing":{"type":"string","nullable":true}},"nullable":true},"yearEnd":{"type":"object","properties":{"utc":{"type":"string","nullable":true},"beijing":{"type":"string","nullable":true}},"nullable":true}}},"_footer":{"type":"string","description":"Free-tier watermark, present on every public response. Keys on a paid plan do not receive it.","example":"Powered by astroway.api - get your own key at https://api.astroway.info"}}},"example":{"ok":true,"data":{"solarYear":1990,"animal":"Horse","animalName":"Horse","glyph":"🐎","animalHanzi":"马","animalHanziTraditional":"馬","animalPinyin":"mǎ","stemHanzi":"庚","stemPinyin":"gēng","branchHanzi":"午","branchPinyin":"wǔ","hours":{"start":"11:00","end":"13:00"},"trine":{"element":"Fire","elementName":"Fire","chinese":"三合","animals":[{"animal":"Tiger","animalName":"Tiger"},{"animal":"Horse","animalName":"Horse"},{"animal":"Dog","animalName":"Dog"}]},"secretFriend":{"animal":"Goat","animalName":"Goat","branch":"Wei","chinese":"六合"},"clash":{"animal":"Rat","animalName":"Rat","branch":"Zi","chinese":"六冲"},"harm":{"animal":"Ox","animalName":"Ox","branch":"Chou","chinese":"六害"},"branch":"Wu","stem":"Geng","element":{"fixed":"Fire","fixedName":"Fire","cycling":"Metal","cyclingName":"Metal","yin":false},"pillar":"Geng-Wu","yearStart":{"utc":"1990-02-04T02:14:00Z","beijing":"1990-02-04T10:14:00+08:00"},"yearEnd":{"utc":"1991-02-04T08:08:24Z","beijing":"1991-02-04T16:08:24+08:00"}},"_footer":"Powered by astroway.api - get your own key at https://api.astroway.info"}}}},"400":{"description":"Invalid input","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_FIELD","message":"Unsupported fields: \"tz\", \"lat\", \"lng\". Rename them to \"timezoneOffset\", \"latitude\", \"longitude\". See details for what each one expects.","details":[{"path":"tz","expected":"timezoneOffset","message":"numeric hours from UTC, e.g. 5.75; a zone name goes in timezone"},{"path":"lat","expected":"latitude","message":"decimal degrees, north positive"},{"path":"lng","expected":"longitude","message":"decimal degrees, east positive"}],"docs":"https://api.astroway.info/en/errors/#invalid_field"}}}}}},"security":[]}},"/public/chinese/zodiac/texts":{"get":{"tags":["Public"],"summary":"Chinese zodiac sign texts (public, no key)","description":"Short reading for each of the 12 animals (`character`, `strengths`, `caution`) and one paragraph per element on how it colours the sign, in 21 languages. Join `animals[animal]` and `elements[element.cycling]` from POST /chinese/zodiac/animal. Names are the same forms the Chinese endpoints return. `lang` is the language served; unknown codes resolve to `uk` like everywhere. Static data, `Cache-Control: public, max-age=604800`: fetch once per language.","parameters":[{"name":"lang","in":"query","required":false,"description":"Language for this call, overriding `Accept-Language`. The canonical per-call form: a page that renders in one language passes it here rather than reconfiguring its client. Unknown or inactive codes fall back to `uk`.","schema":{"type":"string","example":"en"}},{"name":"Accept-Language","in":"header","required":false,"description":"BCP-47 language (e.g. `uk`, `en`, `de`). Set it once on your HTTP client as its default; for a single call, `?lang=` overrides it. Unknown or inactive codes fall back to `uk`.","schema":{"type":"string"}},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"x-quality":"green","x-codeSamples":[{"lang":"cURL","source":"curl 'https://api.astroway.info/v1/public/chinese/zodiac/texts?lang=en'"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"lang":{"type":"string","nullable":true},"textLocalized":{"type":"boolean","nullable":true},"animals":{"type":"object","properties":{"rat":{"type":"object","properties":{"name":{"type":"string","nullable":true},"character":{"type":"string","nullable":true},"strengths":{"type":"string","nullable":true},"caution":{"type":"string","nullable":true}},"nullable":true},"ox":{"type":"object","properties":{"name":{"type":"string","nullable":true},"character":{"type":"string","nullable":true},"strengths":{"type":"string","nullable":true},"caution":{"type":"string","nullable":true}},"nullable":true},"tiger":{"type":"object","properties":{"name":{"type":"string","nullable":true},"character":{"type":"string","nullable":true},"strengths":{"type":"string","nullable":true},"caution":{"type":"string","nullable":true}},"nullable":true},"rabbit":{"type":"object","properties":{"name":{"type":"string","nullable":true},"character":{"type":"string","nullable":true},"strengths":{"type":"string","nullable":true},"caution":{"type":"string","nullable":true}},"nullable":true},"dragon":{"type":"object","properties":{"name":{"type":"string","nullable":true},"character":{"type":"string","nullable":true},"strengths":{"type":"string","nullable":true},"caution":{"type":"string","nullable":true}},"nullable":true},"snake":{"type":"object","properties":{"name":{"type":"string","nullable":true},"character":{"type":"string","nullable":true},"strengths":{"type":"string","nullable":true},"caution":{"type":"string","nullable":true}},"nullable":true},"horse":{"type":"object","properties":{"name":{"type":"string","nullable":true},"character":{"type":"string","nullable":true},"strengths":{"type":"string","nullable":true},"caution":{"type":"string","nullable":true}},"nullable":true},"goat":{"type":"object","properties":{"name":{"type":"string","nullable":true},"character":{"type":"string","nullable":true},"strengths":{"type":"string","nullable":true},"caution":{"type":"string","nullable":true}},"nullable":true},"monkey":{"type":"object","properties":{"name":{"type":"string","nullable":true},"character":{"type":"string","nullable":true},"strengths":{"type":"string","nullable":true},"caution":{"type":"string","nullable":true}},"nullable":true},"rooster":{"type":"object","properties":{"name":{"type":"string","nullable":true},"character":{"type":"string","nullable":true},"strengths":{"type":"string","nullable":true},"caution":{"type":"string","nullable":true}},"nullable":true},"dog":{"type":"object","properties":{"name":{"type":"string","nullable":true},"character":{"type":"string","nullable":true},"strengths":{"type":"string","nullable":true},"caution":{"type":"string","nullable":true}},"nullable":true},"pig":{"type":"object","properties":{"name":{"type":"string","nullable":true},"character":{"type":"string","nullable":true},"strengths":{"type":"string","nullable":true},"caution":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"elements":{"type":"object","properties":{"wood":{"type":"object","properties":{"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"fire":{"type":"object","properties":{"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"earth":{"type":"object","properties":{"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"metal":{"type":"object","properties":{"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"water":{"type":"object","properties":{"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true}},"nullable":true}}},"_footer":{"type":"string","description":"Free-tier watermark, present on every public response. Keys on a paid plan do not receive it.","example":"Powered by astroway.api - get your own key at https://api.astroway.info"}}},"example":{"ok":true,"data":{"lang":"en","textLocalized":true,"animals":{"rat":{"name":"Rat","character":"Quick-witted and observant, the Rat reads a room faster than anyone in it and is rarely caught unprepared.","strengths":"Resourceful, charming and thrifty; turns scarce means into an opportunity and keeps a cool head under pressure.","caution":"Restlessness and a habit of hoarding, whether money or information. Opportunism can cost trust that took years to build."},"ox":{"name":"Ox","character":"Steady and methodical, the Ox moves at its own pace and finishes what it starts.","strengths":"Patient, dependable and hard-working; people lean on its word because it keeps it.","caution":"Stubbornness and a slow thaw after being hurt. A plan held too long can outlive the reasons for it."},"tiger":{"name":"Tiger","character":"Bold and magnetic, the Tiger leads from the front and acts on conviction.","strengths":"Brave, generous and idealistic; protects the weaker side and brings energy to anything new.","caution":"Impulsiveness and friction with authority. Energy spent in bursts leaves projects half done."},"rabbit":{"name":"Rabbit","character":"Gentle and refined, the Rabbit prefers harmony and handles people with tact.","strengths":"Diplomatic, attentive and cultured; a careful judge of character and a calm presence.","caution":"Avoiding conflict at any cost and over-caution. Retreating from a hard choice does not make it go away."},"dragon":{"name":"Dragon","character":"Confident and energetic, the Dragon aims high and draws people into its plans.","strengths":"Ambitious, enthusiastic and decisive; at its best when a situation calls for a leader.","caution":"Pride and impatience with slower minds. Demanding a lot of others without asking what they need."},"snake":{"name":"Snake","character":"Calm and perceptive, the Snake thinks before it moves and sees what others miss.","strengths":"Wise, intuitive and elegant; discreet with secrets and precise in its judgement.","caution":"Secrecy, suspicion and possessiveness. Holding a grudge quietly is still holding it."},"horse":{"name":"Horse","character":"Lively and independent, the Horse needs space, movement and a goal to run towards.","strengths":"Energetic, sociable and hard-working; quick to learn and good at getting others moving.","caution":"Impatience and fickleness. Dropping a project the moment it stops being exciting."},"goat":{"name":"Goat","character":"Kind and imaginative, the Goat, also called the Sheep, lives through feeling and beauty.","strengths":"Compassionate, artistic and gentle; creates warmth and cares for the people around it.","caution":"Worry and indecision, and leaning on others for security. Needs to trust its own choices."},"monkey":{"name":"Monkey","character":"Clever and playful, the Monkey solves problems in ways nobody else thought of.","strengths":"Inventive, adaptable and witty; learns fast and handles change with ease.","caution":"Scattered attention and a taste for shortcuts. Cleverness used to outsmart people wears out goodwill."},"rooster":{"name":"Rooster","character":"Observant and precise, the Rooster notices details and says what it thinks.","strengths":"Honest, diligent and organised; takes pride in doing things properly.","caution":"Bluntness and perfectionism. Criticism that is accurate can still be more than a person needs to hear."},"dog":{"name":"Dog","character":"Loyal and principled, the Dog stands by its people and by what it believes is right.","strengths":"Honest, protective and fair; a trustworthy friend who defends the underdog.","caution":"Anxiety and pessimism, and a fixed first judgement of people. Not every risk needs guarding against."},"pig":{"name":"Pig","character":"Warm and sincere, the Pig enjoys life and assumes the best of people.","strengths":"Generous, easygoing and honest; a reliable friend who shares what it has.","caution":"Naivety and overindulgence. Avoiding confrontation until a small problem has grown."}},"elements":{"wood":{"name":"Wood","text":"Wood adds growth and cooperation: more idealistic and patient, drawn to building things with other people."},"fire":{"name":"Fire","text":"Fire adds passion and drive: more expressive and daring, a natural at inspiring others, quicker to flare up."},"earth":{"name":"Earth","text":"Earth adds stability: more practical and reliable, careful with resources and slower to change course."},"metal":{"name":"Metal","text":"Metal adds resolve: more principled and disciplined, sets firm goals and holds to them, sometimes rigidly."},"water":{"name":"Water","text":"Water adds intuition and flexibility: more perceptive and persuasive, good at reading people and finding a way around obstacles."}}},"_footer":"Powered by astroway.api - get your own key at https://api.astroway.info"}}}},"400":{"description":"Invalid sign or date","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_SIGN","message":"sign must be one of the 12 zodiac signs"}}}}}},"security":[]}},"/public/tarot/daily-reading":{"get":{"tags":["Public"],"summary":"Tarot reading of the day (public, no key)","description":"The Rider-Waite-Smith three-card spread of the day (the same cards for every caller on a date) read as a whole, in the requested language: each position in context, `synthesis` and `advice`. The same answer shape as POST /interpret/tarot, plus `back` (the card back). In a language other than English each position carries `positionMeaningLocalized` and each card `suitLocalized` and `meaningLocalized` (keywords and meaning of the side drawn); the long card texts are GET /public/tarot/texts by slug. Generated once per date and language and cached for a day, `Cache-Control: public, max-age=3600`.","parameters":[{"name":"date","in":"query","required":false,"description":"Calendar date `YYYY-MM-DD` (UTC). Defaults to today.","schema":{"type":"string","format":"date"}},{"name":"lang","in":"query","required":false,"description":"Language for this call, overriding `Accept-Language`. The canonical per-call form: a page that renders in one language passes it here rather than reconfiguring its client. Unknown or inactive codes fall back to `uk`.","schema":{"type":"string","example":"en"}},{"name":"Accept-Language","in":"header","required":false,"description":"BCP-47 language (e.g. `uk`, `en`, `de`). Set it once on your HTTP client as its default; for a single call, `?lang=` overrides it. Unknown or inactive codes fall back to `uk`.","schema":{"type":"string"}},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"x-quality":"green","x-codeSamples":[{"lang":"cURL","source":"curl 'https://api.astroway.info/v1/public/tarot/daily-reading?lang=en'"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"date":{"type":"string","nullable":true},"deck":{"type":"string","nullable":true},"spread":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"name":{"type":"string","nullable":true}},"nullable":true},"question":{"nullable":true},"positions":{"type":"array","items":{"type":"object","properties":{"index":{"type":"number","nullable":true},"position":{"type":"string","nullable":true},"positionMeaning":{"type":"string","nullable":true},"card":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"name":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"boolean","nullable":true},"reading":{"type":"string","nullable":true}},"nullable":true},"nullable":true},"synthesis":{"type":"string","nullable":true},"advice":{"type":"string","nullable":true},"disclaimer":{"type":"string","nullable":true},"model":{"type":"string","nullable":true},"language":{"type":"string","nullable":true}}},"_footer":{"type":"string","description":"Free-tier watermark, present on every public response. Keys on a paid plan do not receive it.","example":"Powered by astroway.api - get your own key at https://api.astroway.info"}}},"example":{"ok":true,"data":{"date":"2026-10-07","deck":"rider-waite","spread":{"slug":"three-card","name":"Past / Present / Future"},"question":null,"positions":[{"index":0,"position":"Past","positionMeaning":"Forces from the past shaping the situation.","card":{"slug":"the-star","name":"The Star"},"reversed":false,"reading":"A period of renewed hope is behind this day..."}],"synthesis":"Taken together, the cards...","advice":"Give the plan one quiet hour today.","disclaimer":"This is generated by AI for entertainment and self-reflection purposes only.","model":"groq/llama-3.3-70b","language":"en"},"_footer":"Powered by astroway.api - get your own key at https://api.astroway.info"}}}},"400":{"description":"Invalid sign or date","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_SIGN","message":"sign must be one of the 12 zodiac signs"}}}}}},"security":[]}},"/public/tarot/texts":{"get":{"tags":["Public"],"summary":"Tarot card texts (public, no key)","description":"Long-form readings for the 78 Rider-Waite-Smith cards: a three-paragraph `description` (the imagery, the upright meaning, the reversed meaning), and for `upright` and `reversed` one text each on `love`, `career`, `finance`, `health` and `spirit`, plus `name` and up to five `keywords` per side. `cards` is a comma-separated list of slugs (as in GET /public/tarot/decks); omit it for all 78; an unknown slug is a 400 `INVALID_CARD`. Our own prose. A language without its table yet answers English text with `textLocalized: false`; names and keywords are localised either way. Static data, `Cache-Control: public, max-age=604800`.","parameters":[{"name":"cards","in":"query","required":false,"schema":{"type":"string"},"example":"the-fool,9-of-swords"},{"name":"lang","in":"query","required":false,"description":"Language for this call, overriding `Accept-Language`. The canonical per-call form: a page that renders in one language passes it here rather than reconfiguring its client. Unknown or inactive codes fall back to `uk`.","schema":{"type":"string","example":"en"}},{"name":"Accept-Language","in":"header","required":false,"description":"BCP-47 language (e.g. `uk`, `en`, `de`). Set it once on your HTTP client as its default; for a single call, `?lang=` overrides it. Unknown or inactive codes fall back to `uk`.","schema":{"type":"string"}},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"x-quality":"green","x-codeSamples":[{"lang":"cURL","source":"curl 'https://api.astroway.info/v1/public/tarot/texts?cards=the-fool,9-of-swords&lang=en'"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"lang":{"type":"string","nullable":true},"textLocalized":{"type":"boolean","nullable":true},"cards":{"type":"object","properties":{"9-of-swords":{"type":"object","properties":{"name":{"type":"string","nullable":true},"keywords":{"type":"object","properties":{"upright":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"reversed":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}},"nullable":true},"description":{"type":"string","nullable":true},"upright":{"type":"object","properties":{"love":{"type":"string","nullable":true},"career":{"type":"string","nullable":true},"finance":{"type":"string","nullable":true},"health":{"type":"string","nullable":true},"spirit":{"type":"string","nullable":true}},"nullable":true},"reversed":{"type":"object","properties":{"love":{"type":"string","nullable":true},"career":{"type":"string","nullable":true},"finance":{"type":"string","nullable":true},"health":{"type":"string","nullable":true},"spirit":{"type":"string","nullable":true}},"nullable":true}},"nullable":true}},"nullable":true}}},"_footer":{"type":"string","description":"Free-tier watermark, present on every public response. Keys on a paid plan do not receive it.","example":"Powered by astroway.api - get your own key at https://api.astroway.info"}}},"example":{"ok":true,"data":{"lang":"en","textLocalized":true,"cards":{"9-of-swords":{"name":"Nine of Swords","keywords":{"upright":["anxiety","nightmare","mental anguish"],"reversed":["hopelessness","mental health crisis"]},"description":"A woman sits up in bed in the dark, her face buried in her hands. Nine swords hang in horizontal rows on the black wall behind her. Her quilt is patterned with roses and astrological signs, and the bed is carved with a scene of combat. The danger is not in the room; it is in her thoughts.\n\nUpright, this is the card of worry and sleepless nights, when anxious thoughts run ahead of the facts. Linked to Mars in Gemini, it shows the mind turning on itself. Ask what is actually happening, as opposed to what you fear might happen.\n\nReversed, the weight of worry can feel heavier and more isolating. This is the moment to reach out rather than carry it alone: talk to a friend, a family member or a qualified professional. Support makes the night shorter.","upright":{"love":"Worry about the relationship may be bigger than the problem itself. Share your fears calmly with your partner rather than replaying them alone at night.","career":"Anxiety about work keeps you awake or distracted. Write down the specific concern, separate facts from fears, and choose one action you can take tomorrow.","finance":"Money worries can loop endlessly. Look at the actual figures in daylight, make one small plan, and talk to someone with practical experience if you need guidance.","health":"Stress may be disturbing your sleep. Build a calm evening routine, limit late-night screens, and talk with someone you trust about what is weighing on you.","spirit":"The mind's darkest stories are not the whole truth. Gentle practices such as slow breathing or prayer can steady you while the night passes."},"reversed":{"love":"Do not carry relationship worries in silence. Reach out to a friend or a counsellor, and let the people close to you know you need support.","career":"Pressure at work may feel overwhelming. Tell a manager or colleague what is happening, ask for help, and remember that your wellbeing comes before any deadline.","finance":"Financial stress feels heavy. Contact a trusted adviser or support service, and share the load with someone instead of facing the numbers alone.","health":"When worry feels too heavy, reach for support from people you trust or a qualified professional. You do not have to manage this by yourself.","spirit":"Even the longest night ends. Let others hold a light for you now; accepting help is a strength, not a failure."}}}},"_footer":"Powered by astroway.api - get your own key at https://api.astroway.info"}}}},"400":{"description":"Invalid sign or date","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_SIGN","message":"sign must be one of the 12 zodiac signs"}}}}}},"security":[]}},"/public/human-design/texts":{"get":{"tags":["Public"],"summary":"Human Design texts (public, no key)","description":"Reference prose for every closed set POST /human-design returns, in 21 languages: the five types (summary, strategy, signature, not-self theme), eight authorities, five definition kinds, twelve profiles, six lines, nine centres (theme, defined, open), 36 channels and 64 gates. Keys are the English identifiers the chart answer carries: `types[type]`, `authorities[authority]`, `definition[definition]`, `profiles[profile.profile]`, `centers[name]` with `defined` or `open`, `channels[\"lower-higher\"]`, `gates[gate]`. Names are the same forms the localised chart uses. `gateLines[gate][line]` holds the 384 gate lines (English until a language's table arrives, flagged by `gateLinesLocalized`). `crosses[cross.name]` holds the 112 incarnation cross themes keyed by the full English name (e.g. `Right Angle Cross of The Sphinx`), each with `angle` (`RAC`, `JC`, `LAC`), `gates` (the Personality Sun gates that give it), a localised `name` and `text`; `crossesLocalized` is false where English stands in. `lang` is the language served; unknown codes resolve to `uk` like everywhere. Static data, `Cache-Control: public, max-age=604800`: fetch once per language.","parameters":[{"name":"lang","in":"query","required":false,"description":"Language for this call, overriding `Accept-Language`. The canonical per-call form: a page that renders in one language passes it here rather than reconfiguring its client. Unknown or inactive codes fall back to `uk`.","schema":{"type":"string","example":"en"}},{"name":"Accept-Language","in":"header","required":false,"description":"BCP-47 language (e.g. `uk`, `en`, `de`). Set it once on your HTTP client as its default; for a single call, `?lang=` overrides it. Unknown or inactive codes fall back to `uk`.","schema":{"type":"string"}},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"x-quality":"green","x-codeSamples":[{"lang":"cURL","source":"curl 'https://api.astroway.info/v1/public/human-design/texts?lang=en'"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"lang":{"type":"string","nullable":true},"textLocalized":{"type":"boolean","nullable":true},"types":{"type":"object","properties":{"Manifestor":{"type":"object","properties":{"name":{"type":"string","nullable":true},"strategyName":{"type":"string","nullable":true},"summary":{"type":"string","nullable":true},"strategy":{"type":"string","nullable":true},"signature":{"type":"string","nullable":true},"notSelf":{"type":"string","nullable":true}},"nullable":true},"Generator":{"type":"object","properties":{"name":{"type":"string","nullable":true},"strategyName":{"type":"string","nullable":true},"summary":{"type":"string","nullable":true},"strategy":{"type":"string","nullable":true},"signature":{"type":"string","nullable":true},"notSelf":{"type":"string","nullable":true}},"nullable":true},"Manifesting Generator":{"type":"object","properties":{"name":{"type":"string","nullable":true},"strategyName":{"type":"string","nullable":true},"summary":{"type":"string","nullable":true},"strategy":{"type":"string","nullable":true},"signature":{"type":"string","nullable":true},"notSelf":{"type":"string","nullable":true}},"nullable":true},"Projector":{"type":"object","properties":{"name":{"type":"string","nullable":true},"strategyName":{"type":"string","nullable":true},"summary":{"type":"string","nullable":true},"strategy":{"type":"string","nullable":true},"signature":{"type":"string","nullable":true},"notSelf":{"type":"string","nullable":true}},"nullable":true},"Reflector":{"type":"object","properties":{"name":{"type":"string","nullable":true},"strategyName":{"type":"string","nullable":true},"summary":{"type":"string","nullable":true},"strategy":{"type":"string","nullable":true},"signature":{"type":"string","nullable":true},"notSelf":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"authorities":{"type":"object","properties":{"Emotional (Solar Plexus)":{"type":"object","properties":{"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Sacral":{"type":"object","properties":{"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Splenic":{"type":"object","properties":{"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Ego Manifested":{"type":"object","properties":{"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Ego Projected":{"type":"object","properties":{"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Self-Projected":{"type":"object","properties":{"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Mental/Environmental":{"type":"object","properties":{"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Lunar (None)":{"type":"object","properties":{"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"definition":{"type":"object","properties":{"Single":{"type":"string","nullable":true},"Split":{"type":"string","nullable":true},"Triple Split":{"type":"string","nullable":true},"Quadruple Split":{"type":"string","nullable":true},"None":{"type":"string","nullable":true}},"nullable":true},"profiles":{"type":"object","properties":{"1/3":{"type":"string","nullable":true},"1/4":{"type":"string","nullable":true},"2/4":{"type":"string","nullable":true},"2/5":{"type":"string","nullable":true},"3/5":{"type":"string","nullable":true},"3/6":{"type":"string","nullable":true},"4/6":{"type":"string","nullable":true},"4/1":{"type":"string","nullable":true},"5/1":{"type":"string","nullable":true},"5/2":{"type":"string","nullable":true},"6/2":{"type":"string","nullable":true},"6/3":{"type":"string","nullable":true}},"nullable":true},"lines":{"type":"object","properties":{"1":{"type":"string","nullable":true},"2":{"type":"string","nullable":true},"3":{"type":"string","nullable":true},"4":{"type":"string","nullable":true},"5":{"type":"string","nullable":true},"6":{"type":"string","nullable":true}},"nullable":true},"centers":{"type":"object","properties":{"Head":{"type":"object","properties":{"name":{"type":"string","nullable":true},"theme":{"type":"string","nullable":true},"defined":{"type":"string","nullable":true},"open":{"type":"string","nullable":true}},"nullable":true},"Ajna":{"type":"object","properties":{"name":{"type":"string","nullable":true},"theme":{"type":"string","nullable":true},"defined":{"type":"string","nullable":true},"open":{"type":"string","nullable":true}},"nullable":true},"Throat":{"type":"object","properties":{"name":{"type":"string","nullable":true},"theme":{"type":"string","nullable":true},"defined":{"type":"string","nullable":true},"open":{"type":"string","nullable":true}},"nullable":true},"G":{"type":"object","properties":{"name":{"type":"string","nullable":true},"theme":{"type":"string","nullable":true},"defined":{"type":"string","nullable":true},"open":{"type":"string","nullable":true}},"nullable":true},"Heart":{"type":"object","properties":{"name":{"type":"string","nullable":true},"theme":{"type":"string","nullable":true},"defined":{"type":"string","nullable":true},"open":{"type":"string","nullable":true}},"nullable":true},"SolarPlexus":{"type":"object","properties":{"name":{"type":"string","nullable":true},"theme":{"type":"string","nullable":true},"defined":{"type":"string","nullable":true},"open":{"type":"string","nullable":true}},"nullable":true},"Sacral":{"type":"object","properties":{"name":{"type":"string","nullable":true},"theme":{"type":"string","nullable":true},"defined":{"type":"string","nullable":true},"open":{"type":"string","nullable":true}},"nullable":true},"Spleen":{"type":"object","properties":{"name":{"type":"string","nullable":true},"theme":{"type":"string","nullable":true},"defined":{"type":"string","nullable":true},"open":{"type":"string","nullable":true}},"nullable":true},"Root":{"type":"object","properties":{"name":{"type":"string","nullable":true},"theme":{"type":"string","nullable":true},"defined":{"type":"string","nullable":true},"open":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"channels":{"type":"object","properties":{"1-8":{"type":"object","properties":{"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"centers":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"2-14":{"type":"object","properties":{"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"centers":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"3-60":{"type":"object","properties":{"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"centers":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"4-63":{"type":"object","properties":{"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"centers":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"5-15":{"type":"object","properties":{"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"centers":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"6-59":{"type":"object","properties":{"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"centers":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"7-31":{"type":"object","properties":{"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"centers":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"9-52":{"type":"object","properties":{"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"centers":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"10-20":{"type":"object","properties":{"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"centers":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"10-34":{"type":"object","properties":{"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"centers":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"10-57":{"type":"object","properties":{"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"centers":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"11-56":{"type":"object","properties":{"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"centers":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"12-22":{"type":"object","properties":{"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"centers":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"13-33":{"type":"object","properties":{"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"centers":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"16-48":{"type":"object","properties":{"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"centers":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"17-62":{"type":"object","properties":{"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"centers":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"18-58":{"type":"object","properties":{"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"centers":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"19-49":{"type":"object","properties":{"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"centers":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"20-34":{"type":"object","properties":{"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"centers":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"20-57":{"type":"object","properties":{"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"centers":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"21-45":{"type":"object","properties":{"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"centers":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"23-43":{"type":"object","properties":{"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"centers":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"24-61":{"type":"object","properties":{"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"centers":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"25-51":{"type":"object","properties":{"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"centers":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"26-44":{"type":"object","properties":{"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"centers":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"27-50":{"type":"object","properties":{"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"centers":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"28-38":{"type":"object","properties":{"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"centers":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"29-46":{"type":"object","properties":{"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"centers":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"30-41":{"type":"object","properties":{"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"centers":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"32-54":{"type":"object","properties":{"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"centers":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"34-57":{"type":"object","properties":{"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"centers":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"35-36":{"type":"object","properties":{"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"centers":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"37-40":{"type":"object","properties":{"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"centers":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"39-55":{"type":"object","properties":{"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"centers":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"42-53":{"type":"object","properties":{"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"centers":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"47-64":{"type":"object","properties":{"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"centers":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"text":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"gates":{"type":"object","properties":{"1":{"type":"object","properties":{"center":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"2":{"type":"object","properties":{"center":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"3":{"type":"object","properties":{"center":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"4":{"type":"object","properties":{"center":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"5":{"type":"object","properties":{"center":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"6":{"type":"object","properties":{"center":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"7":{"type":"object","properties":{"center":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"8":{"type":"object","properties":{"center":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"9":{"type":"object","properties":{"center":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"10":{"type":"object","properties":{"center":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"11":{"type":"object","properties":{"center":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"12":{"type":"object","properties":{"center":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"13":{"type":"object","properties":{"center":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"14":{"type":"object","properties":{"center":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"15":{"type":"object","properties":{"center":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"16":{"type":"object","properties":{"center":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"17":{"type":"object","properties":{"center":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"18":{"type":"object","properties":{"center":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"19":{"type":"object","properties":{"center":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"20":{"type":"object","properties":{"center":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"21":{"type":"object","properties":{"center":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"22":{"type":"object","properties":{"center":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"23":{"type":"object","properties":{"center":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"24":{"type":"object","properties":{"center":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"25":{"type":"object","properties":{"center":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"26":{"type":"object","properties":{"center":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"27":{"type":"object","properties":{"center":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"28":{"type":"object","properties":{"center":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"29":{"type":"object","properties":{"center":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"30":{"type":"object","properties":{"center":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"31":{"type":"object","properties":{"center":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"32":{"type":"object","properties":{"center":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"33":{"type":"object","properties":{"center":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"34":{"type":"object","properties":{"center":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"35":{"type":"object","properties":{"center":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"36":{"type":"object","properties":{"center":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"37":{"type":"object","properties":{"center":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"38":{"type":"object","properties":{"center":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"39":{"type":"object","properties":{"center":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"40":{"type":"object","properties":{"center":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"41":{"type":"object","properties":{"center":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"42":{"type":"object","properties":{"center":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"43":{"type":"object","properties":{"center":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"44":{"type":"object","properties":{"center":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"45":{"type":"object","properties":{"center":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"46":{"type":"object","properties":{"center":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"47":{"type":"object","properties":{"center":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"48":{"type":"object","properties":{"center":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"49":{"type":"object","properties":{"center":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"50":{"type":"object","properties":{"center":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"51":{"type":"object","properties":{"center":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"52":{"type":"object","properties":{"center":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"53":{"type":"object","properties":{"center":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"54":{"type":"object","properties":{"center":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"55":{"type":"object","properties":{"center":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"56":{"type":"object","properties":{"center":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"57":{"type":"object","properties":{"center":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"58":{"type":"object","properties":{"center":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"59":{"type":"object","properties":{"center":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"60":{"type":"object","properties":{"center":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"61":{"type":"object","properties":{"center":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"62":{"type":"object","properties":{"center":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"63":{"type":"object","properties":{"center":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"64":{"type":"object","properties":{"center":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"gateLines":{"type":"object","properties":{"1":{"type":"object","properties":{"1":{"type":"string","nullable":true},"2":{"type":"string","nullable":true},"3":{"type":"string","nullable":true},"4":{"type":"string","nullable":true},"5":{"type":"string","nullable":true},"6":{"type":"string","nullable":true}},"nullable":true},"2":{"type":"object","properties":{"1":{"type":"string","nullable":true},"2":{"type":"string","nullable":true},"3":{"type":"string","nullable":true},"4":{"type":"string","nullable":true},"5":{"type":"string","nullable":true},"6":{"type":"string","nullable":true}},"nullable":true},"3":{"type":"object","properties":{"1":{"type":"string","nullable":true},"2":{"type":"string","nullable":true},"3":{"type":"string","nullable":true},"4":{"type":"string","nullable":true},"5":{"type":"string","nullable":true},"6":{"type":"string","nullable":true}},"nullable":true},"4":{"type":"object","properties":{"1":{"type":"string","nullable":true},"2":{"type":"string","nullable":true},"3":{"type":"string","nullable":true},"4":{"type":"string","nullable":true},"5":{"type":"string","nullable":true},"6":{"type":"string","nullable":true}},"nullable":true},"5":{"type":"object","properties":{"1":{"type":"string","nullable":true},"2":{"type":"string","nullable":true},"3":{"type":"string","nullable":true},"4":{"type":"string","nullable":true},"5":{"type":"string","nullable":true},"6":{"type":"string","nullable":true}},"nullable":true},"6":{"type":"object","properties":{"1":{"type":"string","nullable":true},"2":{"type":"string","nullable":true},"3":{"type":"string","nullable":true},"4":{"type":"string","nullable":true},"5":{"type":"string","nullable":true},"6":{"type":"string","nullable":true}},"nullable":true},"7":{"type":"object","properties":{"1":{"type":"string","nullable":true},"2":{"type":"string","nullable":true},"3":{"type":"string","nullable":true},"4":{"type":"string","nullable":true},"5":{"type":"string","nullable":true},"6":{"type":"string","nullable":true}},"nullable":true},"8":{"type":"object","properties":{"1":{"type":"string","nullable":true},"2":{"type":"string","nullable":true},"3":{"type":"string","nullable":true},"4":{"type":"string","nullable":true},"5":{"type":"string","nullable":true},"6":{"type":"string","nullable":true}},"nullable":true},"9":{"type":"object","properties":{"1":{"type":"string","nullable":true},"2":{"type":"string","nullable":true},"3":{"type":"string","nullable":true},"4":{"type":"string","nullable":true},"5":{"type":"string","nullable":true},"6":{"type":"string","nullable":true}},"nullable":true},"10":{"type":"object","properties":{"1":{"type":"string","nullable":true},"2":{"type":"string","nullable":true},"3":{"type":"string","nullable":true},"4":{"type":"string","nullable":true},"5":{"type":"string","nullable":true},"6":{"type":"string","nullable":true}},"nullable":true},"11":{"type":"object","properties":{"1":{"type":"string","nullable":true},"2":{"type":"string","nullable":true},"3":{"type":"string","nullable":true},"4":{"type":"string","nullable":true},"5":{"type":"string","nullable":true},"6":{"type":"string","nullable":true}},"nullable":true},"12":{"type":"object","properties":{"1":{"type":"string","nullable":true},"2":{"type":"string","nullable":true},"3":{"type":"string","nullable":true},"4":{"type":"string","nullable":true},"5":{"type":"string","nullable":true},"6":{"type":"string","nullable":true}},"nullable":true},"13":{"type":"object","properties":{"1":{"type":"string","nullable":true},"2":{"type":"string","nullable":true},"3":{"type":"string","nullable":true},"4":{"type":"string","nullable":true},"5":{"type":"string","nullable":true},"6":{"type":"string","nullable":true}},"nullable":true},"14":{"type":"object","properties":{"1":{"type":"string","nullable":true},"2":{"type":"string","nullable":true},"3":{"type":"string","nullable":true},"4":{"type":"string","nullable":true},"5":{"type":"string","nullable":true},"6":{"type":"string","nullable":true}},"nullable":true},"15":{"type":"object","properties":{"1":{"type":"string","nullable":true},"2":{"type":"string","nullable":true},"3":{"type":"string","nullable":true},"4":{"type":"string","nullable":true},"5":{"type":"string","nullable":true},"6":{"type":"string","nullable":true}},"nullable":true},"16":{"type":"object","properties":{"1":{"type":"string","nullable":true},"2":{"type":"string","nullable":true},"3":{"type":"string","nullable":true},"4":{"type":"string","nullable":true},"5":{"type":"string","nullable":true},"6":{"type":"string","nullable":true}},"nullable":true},"17":{"type":"object","properties":{"1":{"type":"string","nullable":true},"2":{"type":"string","nullable":true},"3":{"type":"string","nullable":true},"4":{"type":"string","nullable":true},"5":{"type":"string","nullable":true},"6":{"type":"string","nullable":true}},"nullable":true},"18":{"type":"object","properties":{"1":{"type":"string","nullable":true},"2":{"type":"string","nullable":true},"3":{"type":"string","nullable":true},"4":{"type":"string","nullable":true},"5":{"type":"string","nullable":true},"6":{"type":"string","nullable":true}},"nullable":true},"19":{"type":"object","properties":{"1":{"type":"string","nullable":true},"2":{"type":"string","nullable":true},"3":{"type":"string","nullable":true},"4":{"type":"string","nullable":true},"5":{"type":"string","nullable":true},"6":{"type":"string","nullable":true}},"nullable":true},"20":{"type":"object","properties":{"1":{"type":"string","nullable":true},"2":{"type":"string","nullable":true},"3":{"type":"string","nullable":true},"4":{"type":"string","nullable":true},"5":{"type":"string","nullable":true},"6":{"type":"string","nullable":true}},"nullable":true},"21":{"type":"object","properties":{"1":{"type":"string","nullable":true},"2":{"type":"string","nullable":true},"3":{"type":"string","nullable":true},"4":{"type":"string","nullable":true},"5":{"type":"string","nullable":true},"6":{"type":"string","nullable":true}},"nullable":true},"22":{"type":"object","properties":{"1":{"type":"string","nullable":true},"2":{"type":"string","nullable":true},"3":{"type":"string","nullable":true},"4":{"type":"string","nullable":true},"5":{"type":"string","nullable":true},"6":{"type":"string","nullable":true}},"nullable":true},"23":{"type":"object","properties":{"1":{"type":"string","nullable":true},"2":{"type":"string","nullable":true},"3":{"type":"string","nullable":true},"4":{"type":"string","nullable":true},"5":{"type":"string","nullable":true},"6":{"type":"string","nullable":true}},"nullable":true},"24":{"type":"object","properties":{"1":{"type":"string","nullable":true},"2":{"type":"string","nullable":true},"3":{"type":"string","nullable":true},"4":{"type":"string","nullable":true},"5":{"type":"string","nullable":true},"6":{"type":"string","nullable":true}},"nullable":true},"25":{"type":"object","properties":{"1":{"type":"string","nullable":true},"2":{"type":"string","nullable":true},"3":{"type":"string","nullable":true},"4":{"type":"string","nullable":true},"5":{"type":"string","nullable":true},"6":{"type":"string","nullable":true}},"nullable":true},"26":{"type":"object","properties":{"1":{"type":"string","nullable":true},"2":{"type":"string","nullable":true},"3":{"type":"string","nullable":true},"4":{"type":"string","nullable":true},"5":{"type":"string","nullable":true},"6":{"type":"string","nullable":true}},"nullable":true},"27":{"type":"object","properties":{"1":{"type":"string","nullable":true},"2":{"type":"string","nullable":true},"3":{"type":"string","nullable":true},"4":{"type":"string","nullable":true},"5":{"type":"string","nullable":true},"6":{"type":"string","nullable":true}},"nullable":true},"28":{"type":"object","properties":{"1":{"type":"string","nullable":true},"2":{"type":"string","nullable":true},"3":{"type":"string","nullable":true},"4":{"type":"string","nullable":true},"5":{"type":"string","nullable":true},"6":{"type":"string","nullable":true}},"nullable":true},"29":{"type":"object","properties":{"1":{"type":"string","nullable":true},"2":{"type":"string","nullable":true},"3":{"type":"string","nullable":true},"4":{"type":"string","nullable":true},"5":{"type":"string","nullable":true},"6":{"type":"string","nullable":true}},"nullable":true},"30":{"type":"object","properties":{"1":{"type":"string","nullable":true},"2":{"type":"string","nullable":true},"3":{"type":"string","nullable":true},"4":{"type":"string","nullable":true},"5":{"type":"string","nullable":true},"6":{"type":"string","nullable":true}},"nullable":true},"31":{"type":"object","properties":{"1":{"type":"string","nullable":true},"2":{"type":"string","nullable":true},"3":{"type":"string","nullable":true},"4":{"type":"string","nullable":true},"5":{"type":"string","nullable":true},"6":{"type":"string","nullable":true}},"nullable":true},"32":{"type":"object","properties":{"1":{"type":"string","nullable":true},"2":{"type":"string","nullable":true},"3":{"type":"string","nullable":true},"4":{"type":"string","nullable":true},"5":{"type":"string","nullable":true},"6":{"type":"string","nullable":true}},"nullable":true},"33":{"type":"object","properties":{"1":{"type":"string","nullable":true},"2":{"type":"string","nullable":true},"3":{"type":"string","nullable":true},"4":{"type":"string","nullable":true},"5":{"type":"string","nullable":true},"6":{"type":"string","nullable":true}},"nullable":true},"34":{"type":"object","properties":{"1":{"type":"string","nullable":true},"2":{"type":"string","nullable":true},"3":{"type":"string","nullable":true},"4":{"type":"string","nullable":true},"5":{"type":"string","nullable":true},"6":{"type":"string","nullable":true}},"nullable":true},"35":{"type":"object","properties":{"1":{"type":"string","nullable":true},"2":{"type":"string","nullable":true},"3":{"type":"string","nullable":true},"4":{"type":"string","nullable":true},"5":{"type":"string","nullable":true},"6":{"type":"string","nullable":true}},"nullable":true},"36":{"type":"object","properties":{"1":{"type":"string","nullable":true},"2":{"type":"string","nullable":true},"3":{"type":"string","nullable":true},"4":{"type":"string","nullable":true},"5":{"type":"string","nullable":true},"6":{"type":"string","nullable":true}},"nullable":true},"37":{"type":"object","properties":{"1":{"type":"string","nullable":true},"2":{"type":"string","nullable":true},"3":{"type":"string","nullable":true},"4":{"type":"string","nullable":true},"5":{"type":"string","nullable":true},"6":{"type":"string","nullable":true}},"nullable":true},"38":{"type":"object","properties":{"1":{"type":"string","nullable":true},"2":{"type":"string","nullable":true},"3":{"type":"string","nullable":true},"4":{"type":"string","nullable":true},"5":{"type":"string","nullable":true},"6":{"type":"string","nullable":true}},"nullable":true},"39":{"type":"object","properties":{"1":{"type":"string","nullable":true},"2":{"type":"string","nullable":true},"3":{"type":"string","nullable":true},"4":{"type":"string","nullable":true},"5":{"type":"string","nullable":true},"6":{"type":"string","nullable":true}},"nullable":true},"40":{"type":"object","properties":{"1":{"type":"string","nullable":true},"2":{"type":"string","nullable":true},"3":{"type":"string","nullable":true},"4":{"type":"string","nullable":true},"5":{"type":"string","nullable":true},"6":{"type":"string","nullable":true}},"nullable":true},"41":{"type":"object","properties":{"1":{"type":"string","nullable":true},"2":{"type":"string","nullable":true},"3":{"type":"string","nullable":true},"4":{"type":"string","nullable":true},"5":{"type":"string","nullable":true},"6":{"type":"string","nullable":true}},"nullable":true},"42":{"type":"object","properties":{"1":{"type":"string","nullable":true},"2":{"type":"string","nullable":true},"3":{"type":"string","nullable":true},"4":{"type":"string","nullable":true},"5":{"type":"string","nullable":true},"6":{"type":"string","nullable":true}},"nullable":true},"43":{"type":"object","properties":{"1":{"type":"string","nullable":true},"2":{"type":"string","nullable":true},"3":{"type":"string","nullable":true},"4":{"type":"string","nullable":true},"5":{"type":"string","nullable":true},"6":{"type":"string","nullable":true}},"nullable":true},"44":{"type":"object","properties":{"1":{"type":"string","nullable":true},"2":{"type":"string","nullable":true},"3":{"type":"string","nullable":true},"4":{"type":"string","nullable":true},"5":{"type":"string","nullable":true},"6":{"type":"string","nullable":true}},"nullable":true},"45":{"type":"object","properties":{"1":{"type":"string","nullable":true},"2":{"type":"string","nullable":true},"3":{"type":"string","nullable":true},"4":{"type":"string","nullable":true},"5":{"type":"string","nullable":true},"6":{"type":"string","nullable":true}},"nullable":true},"46":{"type":"object","properties":{"1":{"type":"string","nullable":true},"2":{"type":"string","nullable":true},"3":{"type":"string","nullable":true},"4":{"type":"string","nullable":true},"5":{"type":"string","nullable":true},"6":{"type":"string","nullable":true}},"nullable":true},"47":{"type":"object","properties":{"1":{"type":"string","nullable":true},"2":{"type":"string","nullable":true},"3":{"type":"string","nullable":true},"4":{"type":"string","nullable":true},"5":{"type":"string","nullable":true},"6":{"type":"string","nullable":true}},"nullable":true},"48":{"type":"object","properties":{"1":{"type":"string","nullable":true},"2":{"type":"string","nullable":true},"3":{"type":"string","nullable":true},"4":{"type":"string","nullable":true},"5":{"type":"string","nullable":true},"6":{"type":"string","nullable":true}},"nullable":true},"49":{"type":"object","properties":{"1":{"type":"string","nullable":true},"2":{"type":"string","nullable":true},"3":{"type":"string","nullable":true},"4":{"type":"string","nullable":true},"5":{"type":"string","nullable":true},"6":{"type":"string","nullable":true}},"nullable":true},"50":{"type":"object","properties":{"1":{"type":"string","nullable":true},"2":{"type":"string","nullable":true},"3":{"type":"string","nullable":true},"4":{"type":"string","nullable":true},"5":{"type":"string","nullable":true},"6":{"type":"string","nullable":true}},"nullable":true},"51":{"type":"object","properties":{"1":{"type":"string","nullable":true},"2":{"type":"string","nullable":true},"3":{"type":"string","nullable":true},"4":{"type":"string","nullable":true},"5":{"type":"string","nullable":true},"6":{"type":"string","nullable":true}},"nullable":true},"52":{"type":"object","properties":{"1":{"type":"string","nullable":true},"2":{"type":"string","nullable":true},"3":{"type":"string","nullable":true},"4":{"type":"string","nullable":true},"5":{"type":"string","nullable":true},"6":{"type":"string","nullable":true}},"nullable":true},"53":{"type":"object","properties":{"1":{"type":"string","nullable":true},"2":{"type":"string","nullable":true},"3":{"type":"string","nullable":true},"4":{"type":"string","nullable":true},"5":{"type":"string","nullable":true},"6":{"type":"string","nullable":true}},"nullable":true},"54":{"type":"object","properties":{"1":{"type":"string","nullable":true},"2":{"type":"string","nullable":true},"3":{"type":"string","nullable":true},"4":{"type":"string","nullable":true},"5":{"type":"string","nullable":true},"6":{"type":"string","nullable":true}},"nullable":true},"55":{"type":"object","properties":{"1":{"type":"string","nullable":true},"2":{"type":"string","nullable":true},"3":{"type":"string","nullable":true},"4":{"type":"string","nullable":true},"5":{"type":"string","nullable":true},"6":{"type":"string","nullable":true}},"nullable":true},"56":{"type":"object","properties":{"1":{"type":"string","nullable":true},"2":{"type":"string","nullable":true},"3":{"type":"string","nullable":true},"4":{"type":"string","nullable":true},"5":{"type":"string","nullable":true},"6":{"type":"string","nullable":true}},"nullable":true},"57":{"type":"object","properties":{"1":{"type":"string","nullable":true},"2":{"type":"string","nullable":true},"3":{"type":"string","nullable":true},"4":{"type":"string","nullable":true},"5":{"type":"string","nullable":true},"6":{"type":"string","nullable":true}},"nullable":true},"58":{"type":"object","properties":{"1":{"type":"string","nullable":true},"2":{"type":"string","nullable":true},"3":{"type":"string","nullable":true},"4":{"type":"string","nullable":true},"5":{"type":"string","nullable":true},"6":{"type":"string","nullable":true}},"nullable":true},"59":{"type":"object","properties":{"1":{"type":"string","nullable":true},"2":{"type":"string","nullable":true},"3":{"type":"string","nullable":true},"4":{"type":"string","nullable":true},"5":{"type":"string","nullable":true},"6":{"type":"string","nullable":true}},"nullable":true},"60":{"type":"object","properties":{"1":{"type":"string","nullable":true},"2":{"type":"string","nullable":true},"3":{"type":"string","nullable":true},"4":{"type":"string","nullable":true},"5":{"type":"string","nullable":true},"6":{"type":"string","nullable":true}},"nullable":true},"61":{"type":"object","properties":{"1":{"type":"string","nullable":true},"2":{"type":"string","nullable":true},"3":{"type":"string","nullable":true},"4":{"type":"string","nullable":true},"5":{"type":"string","nullable":true},"6":{"type":"string","nullable":true}},"nullable":true},"62":{"type":"object","properties":{"1":{"type":"string","nullable":true},"2":{"type":"string","nullable":true},"3":{"type":"string","nullable":true},"4":{"type":"string","nullable":true},"5":{"type":"string","nullable":true},"6":{"type":"string","nullable":true}},"nullable":true},"63":{"type":"object","properties":{"1":{"type":"string","nullable":true},"2":{"type":"string","nullable":true},"3":{"type":"string","nullable":true},"4":{"type":"string","nullable":true},"5":{"type":"string","nullable":true},"6":{"type":"string","nullable":true}},"nullable":true},"64":{"type":"object","properties":{"1":{"type":"string","nullable":true},"2":{"type":"string","nullable":true},"3":{"type":"string","nullable":true},"4":{"type":"string","nullable":true},"5":{"type":"string","nullable":true},"6":{"type":"string","nullable":true}},"nullable":true}},"nullable":true},"gateLinesLocalized":{"type":"boolean","nullable":true},"crossesLocalized":{"type":"boolean","nullable":true},"crosses":{"type":"object","properties":{"Right Angle Cross of The Sphinx":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Juxtaposition Cross of Self-Expression":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Left Angle Cross of Defiance":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Juxtaposition Cross of The Driver":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Right Angle Cross of Laws":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Juxtaposition Cross of Mutation":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Left Angle Cross of Wishes":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Right Angle Cross of Explanation":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Juxtaposition Cross of Formulization":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Left Angle Cross of Revolution":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Right Angle Cross of Consciousness":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Juxtaposition Cross of Habits":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Left Angle Cross of Separation":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Right Angle Cross of Eden":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Juxtaposition Cross of Conflict":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Left Angle Cross of The Plane":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Juxtaposition Cross of Interaction":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Left Angle Cross of Masks":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Right Angle Cross of Contagion":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Juxtaposition Cross of Contribution":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Left Angle Cross of Uncertainty":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Right Angle Cross of Planning":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Juxtaposition Cross of Focus":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Left Angle Cross of Identification":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Right Angle Cross of The Vessel of Love":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Juxtaposition Cross of Behaviour":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Left Angle Cross of Prevention":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Juxtaposition Cross of Ideas":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Left Angle Cross of Education":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Juxtaposition Cross of Articulation":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Juxtaposition Cross of Listening":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Juxtaposition Cross of Empowering":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Juxtaposition Cross of Extremes":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Juxtaposition Cross of Experimentation":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Right Angle Cross of Service":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Juxtaposition Cross of Opinions":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Left Angle Cross of Upheaval":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Juxtaposition Cross of Correction":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Right Angle Cross of The Four Ways":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Juxtaposition Cross of Need":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Left Angle Cross of Refinement":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Right Angle Cross of The Sleeping Phoenix":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Juxtaposition Cross of The Now":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Left Angle Cross of Duality":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Right Angle Cross of Tension":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Juxtaposition Cross of Control":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Left Angle Cross of Endeavour":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Right Angle Cross of Rulership":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Juxtaposition Cross of Graciousness":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Left Angle Cross of Informing":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Juxtaposition Cross of Assimilation":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Left Angle Cross of Dedication":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Juxtaposition Cross of Rationalization":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Left Angle Cross of Incarnation":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Juxtaposition Cross of Innocence":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Left Angle Cross of Healing":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Juxtaposition Cross of The Trickster":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Left Angle Cross of Confrontation":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Right Angle Cross of The Unexpected":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Juxtaposition Cross of Caring":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Left Angle Cross of Alignment":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Juxtaposition Cross of Risks":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Juxtaposition Cross of Commitment":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Left Angle Cross of Industry":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Juxtaposition Cross of Fates":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Juxtaposition Cross of Influence":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Left Angle Cross of The Alpha":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Right Angle Cross of The Maya":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Juxtaposition Cross of Conservation":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Left Angle Cross of Limitation":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Juxtaposition Cross of Retreat":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Juxtaposition Cross of Power":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Juxtaposition Cross of Experience":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Juxtaposition Cross of Crisis":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Juxtaposition Cross of Bargains":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Left Angle Cross of Migration":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Juxtaposition Cross of Opposition":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Left Angle Cross of Individualism":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Juxtaposition Cross of Provocation":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Juxtaposition Cross of Denial":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Juxtaposition Cross of Fantasy":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Juxtaposition Cross of Completion":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Juxtaposition Cross of Insight":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Juxtaposition Cross of Alertness":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Juxtaposition Cross of Possession":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Juxtaposition Cross of Serendipity":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Juxtaposition Cross of Oppression":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Juxtaposition Cross of Depth":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Juxtaposition Cross of Principles":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Juxtaposition Cross of Values":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Right Angle Cross of Penetration":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Juxtaposition Cross of Shock":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Left Angle Cross of The Clarion":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Juxtaposition Cross of Stillness":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Left Angle Cross of Demands":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Juxtaposition Cross of Beginnings":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Left Angle Cross of Cycles":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Juxtaposition Cross of Ambition":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Juxtaposition Cross of Moods":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Left Angle Cross of Spirit":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Juxtaposition Cross of Stimulation":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Left Angle Cross of Distraction":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Juxtaposition Cross of Intuition":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Juxtaposition Cross of Vitality":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Juxtaposition Cross of Strategy":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Juxtaposition Cross of Limitation":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Juxtaposition Cross of Thinking":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Left Angle Cross of Obscuration":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Juxtaposition Cross of Detail":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Juxtaposition Cross of Doubts":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Left Angle Cross of Dominion":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true},"Juxtaposition Cross of Confusion":{"type":"object","properties":{"angle":{"type":"string","nullable":true},"gates":{"type":"array","items":{"type":"number","nullable":true},"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true}},"nullable":true}},"nullable":true}}},"_footer":{"type":"string","description":"Free-tier watermark, present on every public response. Keys on a paid plan do not receive it.","example":"Powered by astroway.api - get your own key at https://api.astroway.info"}}},"example":{"ok":true,"data":{"lang":"en","textLocalized":true,"types":{"Manifestor":{"name":"Manifestor","strategyName":"Inform before Acting","summary":"A Manifestor can start things on their own. Their energy moves outward in bursts, and others feel its impact even before anything is said. They are here to begin, not to wait for life to ask them.","strategy":"Inform the people your action will touch before you act. It is not asking for permission: it clears the resistance that otherwise meets a sudden move.","signature":"Peace","notSelf":"Anger"},"Generator":{"name":"Generator","strategyName":"Wait for the Sacral Response","summary":"A Generator carries a steady, renewable life force and is built to do work they love. Energy is there when something truly engages them, and it drains fast when it does not. Satisfaction comes from mastering what they respond to.","strategy":"Wait for something to respond to rather than starting from the mind. The gut answers with an immediate yes or no; follow that sound, not the reasons.","signature":"Satisfaction","notSelf":"Frustration"},"Manifesting Generator":{"name":"Manifesting Generator","strategyName":"Wait for the Sacral Response and Inform","summary":"A Manifesting Generator has the Generator's sustainable energy with a faster, multi-track pace. They often skip steps, try several things at once and go back to fix what they missed. Efficiency, not linear order, is their natural way.","strategy":"Wait for the gut response, then tell the people affected before you act. Responding keeps the energy correct; informing keeps the speed from colliding with others.","signature":"Satisfaction and peace","notSelf":"Frustration and anger"},"Projector":{"name":"Projector","strategyName":"Wait for the Invitation","summary":"A Projector is here to see others clearly and to guide how energy is used. They do not have consistent working energy of their own, so their value lies in insight, not in endurance. Recognition opens the door for what they offer.","strategy":"Wait to be invited into the big things: work, relationships, where to live. An invitation means your insight is wanted, and only then does it land.","signature":"Success","notSelf":"Bitterness"},"Reflector":{"name":"Reflector","strategyName":"Wait 28 Days (Lunar Cycle)","summary":"A Reflector has no centre consistently defined, so they mirror the health of the people and places around them. They sample life in all its variety and are deeply affected by their environment. The right place and the right people matter more for them than for anyone.","strategy":"Give big decisions a full lunar cycle of about 28 days. Talk them through with trusted people as the Moon moves through every gate, and clarity arrives by the end.","signature":"Surprise","notSelf":"Disappointment"}},"authorities":{"Emotional (Solar Plexus)":{"name":"Emotional (Solar Plexus)","text":"Clarity comes over time, never in the moment. Feelings rise and fall in a wave, so the truth of a decision shows once you have felt it from the high, the low and the calm between. Sleep on anything important."},"Sacral":{"name":"Sacral","text":"The decision is a gut response in the present moment, often a sound rather than words. It knows before the mind does whether there is energy for something. Trust the first response and do not argue it away."},"Splenic":{"name":"Splenic","text":"A quiet, instant knowing that speaks once and does not repeat itself. It is concerned with what is healthy and safe right now. Listen to the first faint hit, because the mind will talk over it a moment later."},"Ego Manifested":{"name":"Ego Manifested","text":"Decisions come from the will and what you truly want, voiced directly. If you hear yourself say \"I want\" or \"I will\", that is the authority. Commit only to what your heart is in."},"Ego Projected":{"name":"Ego Projected","text":"The will speaks through what you say when you are invited to talk. Listening to your own words in the right company reveals what you want and whether you will commit to it."},"Self-Projected":{"name":"Self-Projected","text":"Clarity comes from hearing yourself talk. Speak your decision out loud to people you trust, without asking for their advice, and notice what sounds true to your own identity and direction."},"Mental/Environmental":{"name":"Mental (Environmental)","text":"There is no inner authority, so clarity comes from the right environment and the right sounding boards. Talk the decision through in places and with people that feel correct, then let it settle before acting."},"Lunar (None)":{"name":"Lunar (Reflector)","text":"Wait through a full lunar cycle of about 28 days before a major decision. Each day the Moon brings a different perspective, and the pattern over the month shows what is right."}},"definition":{"Single":"Every defined centre is connected in one continuous circuit. You process life in your own way and at your own pace, with little need for others to complete you.","Split":"The defined centres form two separate areas. You are drawn to people who bridge the gap, and that bridging can feel like completion. Give decisions time so both parts have their say.","Triple Split":"Three separate areas of definition. You benefit from moving among different people and places, as varied contact links your parts in different ways. Decisions take time to come together.","Quadruple Split":"Four separate areas of definition, a rare configuration. You take in life slowly and thoroughly, and need time and many points of contact before you are clear.","None":"No centre is defined. This is the Reflector design: open to everything, consistent in nothing, and a mirror for the environment."},"profiles":{"1/3":"Investigator and experimenter. You need a solid foundation before you feel secure, and you learn by testing what holds and what breaks. Mistakes are research, not failure.","1/4":"Investigator with a network. You build deep knowledge, then share it through the people you already know. Security comes from foundations and friendship.","2/4":"A natural talent who needs time alone, called out by your network. Others see your gifts before you do, and the right opportunity comes through friends.","2/5":"A natural talent others project their hopes onto. You are called out to solve problems, and your reputation depends on delivering practical answers, then retreating.","3/5":"The experimenter whose discoveries help others. You learn through trial and error, and people look to you for solutions that come from what you have survived.","3/6":"Trial and error in the first part of life, then a gradual move towards the role of an example. Experience becomes wisdom, and later you lead by having lived it.","4/6":"A networker who becomes a role model over time. Relationships carry your opportunities, and life matures into a calmer, more objective vantage point.","4/1":"A fixed, steady path built on strong foundations and shared through close relationships. You are rarely moved off your own course and do best when you stay on it.","5/1":"Others project on you as the one who can fix things. When you deliver with solid knowledge behind you, your influence is wide; without it, the projection turns.","5/2":"Projected on as a problem solver, while needing time alone. You are called out to help and do best by choosing carefully when to answer.","6/2":"Three stages of life: experimenting, withdrawing to observe, then living as an example. Your natural gifts ripen into trusted perspective.","6/3":"A role model shaped by ongoing experience. Life keeps testing you, and what you learn from it becomes guidance others can trust."},"lines":{"1":"Foundation. Security through study and investigation of what lies underneath.","2":"Natural talent. Gifts that others notice, and a need for time alone to let them be.","3":"Experiment. Learning by trying, bumping into what does not work and adjusting.","4":"Network. Opportunities travel through the people you know and the bonds you keep.","5":"Projection. Others see you as the one with the solution, and expect you to deliver.","6":"Role model. Experience matures into an objective, trusted perspective over time."},"centers":{"Head":{"name":"Head","theme":"Inspiration and mental pressure","defined":"A consistent way of being inspired and of asking questions. You put mental pressure on others to think about what interests you.","open":"You take in the questions and inspirations of others and can feel pressured to answer them. Not every question needs to be yours to solve."},"Ajna":{"name":"Ajna","theme":"Conceptualising and processing","defined":"A fixed way of thinking and processing information that others can rely on. Your mind is a good researcher, not the decider.","open":"A flexible mind that can see many points of view. You do not need to be certain; pretending to be costs you."},"Throat":{"name":"Throat","theme":"Communication and manifestation","defined":"A consistent voice and way of expressing yourself. Words and action come through in a recognisable way.","open":"Your voice varies with the people around you. Waiting for the right moment to speak gives your words their weight."},"G":{"name":"G Centre","theme":"Identity, love and direction","defined":"A consistent sense of who you are and where you are going. Others may orient themselves by you.","open":"Your sense of self and direction shifts with your surroundings. The right places and people bring you to the right path."},"Heart":{"name":"Heart (Ego)","theme":"Willpower and worth","defined":"Reliable willpower and a capacity to keep promises when your heart is in it. Rest is part of keeping that will strong.","open":"Willpower is not consistent, so there is nothing to prove. Make only the promises you truly want to keep."},"SolarPlexus":{"name":"Solar Plexus","theme":"Emotions and feelings","defined":"You live on an emotional wave that rises and falls on its own. Clarity comes only with time.","open":"You take in and amplify the emotions of others. Recognising which feelings are not yours brings calm and empathy without overwhelm."},"Sacral":{"name":"Sacral","theme":"Life force and sustainable energy","defined":"Sustainable, renewable energy for work you respond to. Used correctly, it lasts all day and lets you sleep well.","open":"No consistent working energy of your own; you borrow it from others and can overdo it. Know when enough is enough."},"Spleen":{"name":"Spleen","theme":"Instinct, health and timing","defined":"A steady sense of well-being and spontaneous instinct for what is safe. You tend to feel fine and recover quickly.","open":"Sensitive to health and well-being, and inclined to hold on to what feels familiar. Let go of what is not good for you."},"Root":{"name":"Root","theme":"Pressure and adrenaline","defined":"A consistent way of handling pressure. Stress fuels you at a fixed rhythm rather than pushing you around.","open":"You feel pressure from outside and may rush to get rid of it. Not everything has to be done right now."}},"channels":{"1-8":{"gates":[1,8],"centers":["G","Throat"],"text":"Creative self-expression made visible. You contribute by being an example of something original."},"2-14":{"gates":[2,14],"centers":["G","Sacral"],"text":"Direction backed by resources. You keep the energy and means that carry others towards something new."},"3-60":{"gates":[3,60],"centers":["Sacral","Root"],"text":"Mutation in pulses. Change arrives when its time comes, not when it is pushed."},"4-63":{"gates":[4,63],"centers":["Ajna","Head"],"text":"Logical questioning that seeks answers. Doubts are tested until a pattern holds."},"5-15":{"gates":[5,15],"centers":["Sacral","G"],"text":"Living in natural rhythm. Your flow sets a pace that others can fall into."},"6-59":{"gates":[6,59],"centers":["SolarPlexus","Sacral"],"text":"Intimacy and bonding. Energy for close connection and for breaking through barriers between people."},"7-31":{"gates":[7,31],"centers":["G","Throat"],"text":"Leadership through influence. You are recognised to lead when the group invites it."},"9-52":{"gates":[9,52],"centers":["Sacral","Root"],"text":"Concentration and focus. The ability to sit with a task and go into the details."},"10-20":{"gates":[10,20],"centers":["G","Throat"],"text":"Awareness of how to behave in the present moment. Being yourself, right now, out loud."},"10-34":{"gates":[10,34],"centers":["G","Sacral"],"text":"Following your own convictions. Power expressed through behaving as yourself."},"10-57":{"gates":[10,57],"centers":["G","Spleen"],"text":"Instinct for right behaviour. An intuitive sense of how to live well and safely."},"11-56":{"gates":[11,56],"centers":["Ajna","Throat"],"text":"Ideas told as stories. Curiosity that turns experience into something others can learn from."},"12-22":{"gates":[12,22],"centers":["Throat","SolarPlexus"],"text":"Social openness tuned to mood. Speaking from feeling when the moment is right."},"13-33":{"gates":[13,33],"centers":["G","Throat"],"text":"The witness who remembers. Listening, keeping experiences, and later telling what they meant."},"16-48":{"gates":[16,48],"centers":["Throat","Spleen"],"text":"Talent built through depth and practice. Skill that grows into mastery with repetition."},"17-62":{"gates":[17,62],"centers":["Ajna","Throat"],"text":"Organising opinions into detail. Making a view understandable and well-structured."},"18-58":{"gates":[18,58],"centers":["Spleen","Root"],"text":"Joy in correcting what does not work. Vitality that seeks to improve patterns."},"19-49":{"gates":[19,49],"centers":["Root","SolarPlexus"],"text":"Sensitivity to needs and principles. Bonds formed around what people need and agree on."},"20-34":{"gates":[20,34],"centers":["Throat","Sacral"],"text":"Busy, visible power in the now. Energy that wants to be doing, immediately."},"20-57":{"gates":[20,57],"centers":["Throat","Spleen"],"text":"Intuitive awareness spoken in the moment. Sharp insight that knows what is safe now."},"21-45":{"gates":[21,45],"centers":["Heart","Throat"],"text":"Managing material resources. A drive to control and distribute what the group has."},"23-43":{"gates":[23,43],"centers":["Throat","Ajna"],"text":"Individual insight put into words. Knowing that sounds strange until its time comes."},"24-61":{"gates":[24,61],"centers":["Ajna","Head"],"text":"Inspired thinking about mysteries. A mind that returns to a question until it knows."},"25-51":{"gates":[25,51],"centers":["G","Heart"],"text":"Initiation through shock. The courage to leap and the innocence to keep the heart open."},"26-44":{"gates":[26,44],"centers":["Heart","Spleen"],"text":"Transmitting what experience taught. Instinct for patterns used to persuade and protect."},"27-50":{"gates":[27,50],"centers":["Sacral","Spleen"],"text":"Preserving and caring. Responsibility for the values and well-being of others."},"28-38":{"gates":[28,38],"centers":["Spleen","Root"],"text":"Finding purpose through struggle. Stubbornness in the fight for what makes life meaningful."},"29-46":{"gates":[29,46],"centers":["Sacral","G"],"text":"Success through commitment. Saying yes and staying the course leads to discovery."},"30-41":{"gates":[30,41],"centers":["SolarPlexus","Root"],"text":"Desire for new experience. Feelings and fantasy that open a cycle of experience."},"32-54":{"gates":[32,54],"centers":["Spleen","Root"],"text":"Transformation through ambition. Drive to rise, tempered by instinct for what endures."},"34-57":{"gates":[34,57],"centers":["Sacral","Spleen"],"text":"Instinctive power. Fast, intuitive response that keeps you safe."},"35-36":{"gates":[35,36],"centers":["Throat","SolarPlexus"],"text":"Hunger for experience and change. Learning through living things fully."},"37-40":{"gates":[37,40],"centers":["SolarPlexus","Heart"],"text":"Community and the bargain. Support given and received in fair exchange."},"39-55":{"gates":[39,55],"centers":["Root","SolarPlexus"],"text":"Emotional moodiness that stirs spirit. Provocation that brings feelings to the surface."},"42-53":{"gates":[42,53],"centers":["Sacral","Root"],"text":"Maturation through cycles. Starting things and seeing them through to completion."},"47-64":{"gates":[47,64],"centers":["Ajna","Head"],"text":"Making sense of the past. A mind that sorts images and memories into meaning."}},"gates":{"1":{"center":"G","text":"Creative self-expression. A drive to be original and to show it."},"2":{"center":"G","text":"Inner direction. A quiet knowing of where life should go."},"3":{"center":"Sacral","text":"Ordering the new. Making something workable out of initial chaos."},"4":{"center":"Ajna","text":"Formulating answers. Logical explanations offered to doubts."},"5":{"center":"Sacral","text":"Natural rhythms. Consistency, habits and patient waiting."},"6":{"center":"SolarPlexus","text":"Friction and intimacy. The emotional boundary that decides who comes close."},"7":{"center":"G","text":"The role of the self. Leadership in service of the collective direction."},"8":{"center":"Throat","text":"Contribution. Making your individuality available to others."},"9":{"center":"Sacral","text":"Focus on detail. Energy to concentrate on what matters."},"10":{"center":"G","text":"Behaviour of the self. Loving yourself as you are."},"11":{"center":"Ajna","text":"Ideas. A stream of concepts waiting to be shared."},"12":{"center":"Throat","text":"Caution in expression. Speaking only when the mood is right."},"13":{"center":"G","text":"The listener. Hearing and holding the stories of others."},"14":{"center":"Sacral","text":"Power skills. Resources and energy that empower direction."},"15":{"center":"G","text":"Extremes. Accepting the full range of human rhythms."},"16":{"center":"Throat","text":"Skills and enthusiasm. Repetition that turns talent into mastery."},"17":{"center":"Ajna","text":"Opinions. A logical point of view about the future."},"18":{"center":"Spleen","text":"Correction. The urge to fix what has gone wrong."},"19":{"center":"Root","text":"Wanting. Sensitivity to the needs of others and of oneself."},"20":{"center":"Throat","text":"The now. Awareness expressed in the present moment."},"21":{"center":"Heart","text":"Control. Managing resources and one's own territory."},"22":{"center":"SolarPlexus","text":"Openness. Grace and social sensitivity tied to mood."},"23":{"center":"Throat","text":"Assimilation. Turning insight into words others can understand."},"24":{"center":"Ajna","text":"Rationalisation. A mind that returns to an idea until it makes sense."},"25":{"center":"G","text":"Spirit of the self. Unconditional love and innocence."},"26":{"center":"Heart","text":"The persuader. Using memory and skill to sell an idea."},"27":{"center":"Sacral","text":"Caring. Nourishing and protecting others."},"28":{"center":"Spleen","text":"The game player. Looking for what makes the struggle worthwhile."},"29":{"center":"Sacral","text":"Commitment. Saying yes and seeing it through."},"30":{"center":"SolarPlexus","text":"Desire. Longing for experience and the feelings it brings."},"31":{"center":"Throat","text":"Influence. A voice that leads when it is recognised."},"32":{"center":"Spleen","text":"Continuity. Instinct for what will last."},"33":{"center":"Throat","text":"Retreat. Withdrawing to reflect and remember."},"34":{"center":"Sacral","text":"Power. Pure, independent life force."},"35":{"center":"Throat","text":"Change. Hunger to experience something new."},"36":{"center":"SolarPlexus","text":"Crisis. Emotional growth through inexperience."},"37":{"center":"SolarPlexus","text":"Friendship. Warmth, loyalty and the bonds of the family."},"38":{"center":"Root","text":"Opposition. Fighting for what is worth it."},"39":{"center":"Root","text":"Provocation. Stirring others to find their spirit."},"40":{"center":"Heart","text":"Aloneness. The need to rest after giving."},"41":{"center":"Root","text":"Contraction. The fantasy that starts a new cycle of experience."},"42":{"center":"Sacral","text":"Growth. Completing a cycle so it can bear fruit."},"43":{"center":"Ajna","text":"Insight. A sudden breakthrough of inner knowing."},"44":{"center":"Spleen","text":"Alertness. Recognising patterns from the past."},"45":{"center":"Throat","text":"The gatherer. Bringing people and resources together."},"46":{"center":"G","text":"Determination of the self. Love of the body and being in the right place."},"47":{"center":"Ajna","text":"Realisation. Sorting the past until it makes sense."},"48":{"center":"Spleen","text":"Depth. A well of knowledge that needs trust to be used."},"49":{"center":"SolarPlexus","text":"Principles. Revolution or rejection when values are broken."},"50":{"center":"Spleen","text":"Values. Guarding the rules that keep a group healthy."},"51":{"center":"Heart","text":"Shock. The courage to be first and to wake others up."},"52":{"center":"Root","text":"Stillness. Concentration that comes from holding still."},"53":{"center":"Root","text":"Beginnings. Pressure to start something new."},"54":{"center":"Root","text":"Ambition. Drive to rise and transform one's circumstances."},"55":{"center":"SolarPlexus","text":"Spirit. Abundance felt through the full range of moods."},"56":{"center":"Throat","text":"Stimulation. Telling stories that move people."},"57":{"center":"Spleen","text":"Intuitive clarity. Hearing what is right in the moment."},"58":{"center":"Root","text":"Vitality. Joy in making life better."},"59":{"center":"Sacral","text":"Intimacy. Breaking through barriers to closeness."},"60":{"center":"Root","text":"Acceptance. Working creatively within limits."},"61":{"center":"Head","text":"Inner truth. The pressure to know the unknowable."},"62":{"center":"Throat","text":"Detail. Naming facts precisely."},"63":{"center":"Head","text":"Doubt. Questioning that leads to logical proof."},"64":{"center":"Head","text":"Confusion. Images of the past waiting to make sense."}},"gateLines":{"1":{"1":"Your originality rests on what you study quietly before anyone sees it. Like the dragon lying hidden in the deep water, build your depth first and show it later.","2":"Others notice a creative signature in you that you barely think about. It shows most clearly when you are left alone to make things without an audience waiting.","3":"You find your own style by producing work, discarding what feels borrowed and trying again. Each failed attempt narrows the gap between what you imagine and what you make.","4":"Your creative work travels best through people who already know and trust you. A friend who passes your piece along does more for it than any broad announcement.","5":"People expect you to be the inventive one who will rescue a stale project. Deliver something real when that expectation lands, or the reputation quickly turns against you.","6":"Over time your sense of what is truly original becomes calm and reliable. You can judge new work, your own included, without needing to win attention for it."},"2":{"1":"When you tread on hoarfrost, solid ice is not far behind. Your inner direction starts from small early signs, so learn to read them before the path is obvious.","2":"You know where to go without being able to explain how. That knowing is clearest when nobody asks you to defend it, so keep some unclaimed time for it.","3":"You discover your direction by moving and noticing when a road feels wrong. Changing course after a misstep is how your quiet compass calibrates itself.","4":"The right direction often arrives through someone close to you: an introduction, a passing remark, a door held open. Keep those ties warm and the path tends to find you.","5":"Others assume you already know the way and will lead them there. Accept that trust only where your inner sense is actually clear, and say so plainly when it is not.","6":"With the years, your sense of direction stops being private and becomes guidance others rely on. You can point the way without needing to walk every road yourself."},"3":{"1":"New things begin in disorder, like a sprout forcing its way through hard ground. Before you organise anything, study the conditions it grows from and what it truly needs.","2":"You have a knack for staying steady while things are still unformed. Others feel calmer near you in chaos, though you need quiet time to digest each upheaval.","3":"You make order by trial: arrange things, watch them fail, arrange them again. A hunter without a guide only gets lost in the forest, so pause when the signs disappear.","4":"The help you need to sort out a messy start usually comes through people you already know. Ask them directly instead of wrestling with the confusion alone.","5":"People bring you their messes and expect you to make them workable. Be careful what you promise, because small steady fixes serve better than one grand rescue.","6":"Having lived through many rough beginnings, you can tell which confusion will settle and which will not. Your patience becomes a model for others facing fresh chaos."},"4":{"1":"A good answer stands on a solid premise. Check the foundations of your reasoning before offering explanations, because a clever formula on a weak base misleads everyone.","2":"Explanations come to you easily, often before others have finished asking. Let them form in your own time rather than rushing to fill every silence with a theory.","3":"You test your answers against reality and drop the ones that fail. Being wrong out loud is how your logic sharpens; folly only lasts when you refuse the test.","4":"Your answers carry furthest among people who already respect your thinking. A friend's honest question is the best invitation to explain what you have worked out.","5":"Others treat you as the one who has the explanation. Offer it with its limits stated, since an answer taken as certain becomes a burden when it falls short.","6":"Experience teaches you which answers hold and which only sound good. You become a fair judge of reasoning, correcting folly without punishing the person behind it."},"5":{"1":"Waiting in the open meadow, far from danger, you can build a routine that holds. Your rhythm needs a stable base of simple habits before it can carry anything larger.","2":"Your natural timing is something others sense and quietly lean on. Keep it intact by protecting parts of the day when no one pulls you out of your own pace.","3":"You find your rhythm by trying routines and noticing which ones break. Waiting in the mud only invites trouble, so change a habit when it leaves you stuck.","4":"Your sense of timing settles best alongside a few trusted people. Shared routines with them, a regular meal or an evening walk, keep your rhythm steady through busy seasons.","5":"Others expect you to be the patient, reliable one who never falters. Rest when you need to, because a rhythm imposed from outside soon feels like a cage.","6":"After many seasons you understand that every pattern has its lulls and surges. Your steadiness through change shows others that waiting can be active and wise."},"6":{"1":"Closeness starts with knowing exactly where your boundaries are. Settle small disputes early and plainly, before a minor friction hardens into a lasting quarrel.","2":"You have an instinctive feel for who belongs near you and who does not. Trust that sense, and give yourself time apart to recover after emotional encounters.","3":"You learn about intimacy by letting people in and seeing what happens. Some contact will sting, and each time you adjust where the door to your inner life stands.","4":"Your emotional life runs through a close circle. When conflict arises there, choose the relationship over being right, and the bond usually comes out stronger.","5":"People expect you to settle their disputes or ease tension in a group. Mediate only where you are truly neutral, or the friction will turn toward you instead.","6":"Experience shows you that winning every argument costs more than it gains. You become someone whose calm handling of conflict others watch, learn from and trust."},"7":{"1":"An army must set out in proper order or not at all. Leadership grows from clear structure, so learn the rules and habits of a group before trying to steer it.","2":"You can guide others without trying, simply by standing in the middle of things and staying level. Let leadership come to you instead of chasing a title.","3":"You find your style of leading by trying it, sometimes carrying a load that is not yours. Notice when you steer for ego rather than for the group, and correct course.","4":"Your influence works through a network of allies. Retreat when the ground is wrong; a sensible withdrawal keeps both your people and your standing intact.","5":"Others look to you to lead in a crisis and expect results. Appoint capable people and listen to them, since blame falls first on the most visible leader.","6":"With time you see that the best leaders serve the direction rather than themselves. Your example teaches how authority can be held lightly and later handed on."},"8":{"1":"Contribution begins with sincerity, like a full earthen bowl offered without pretence. Know what you genuinely have to give before you offer it to anyone.","2":"Your individuality has a quality that draws people toward you. Share it from the inside out, and keep time apart so it does not dissolve into the crowd.","3":"You learn what to contribute by joining groups and finding where you do not fit. Holding together with the wrong people teaches you whom to choose next time.","4":"Your contribution spreads through personal connections. Offer your work openly to those near you, and they will carry it further than you could alone.","5":"People see you as an example of someone true to themselves and expect you to inspire them. Show the way by living it, without trying to herd anyone.","6":"Over time you learn when to join and when to stand apart. Your mature example shows others how to belong to something without losing themselves in it."},"9":{"1":"Focus starts with returning to the right road. Ground your attention in the basic details of a task before chasing finer ones, and the rest follows more easily.","2":"You can concentrate deeply with surprising ease. Guard that gift by working in long uninterrupted stretches, away from people and screens that scatter your attention.","3":"You learn where to focus by getting lost in the wrong details. When the spokes fall from the wagon wheel, stop, reassess what matters, and narrow down again.","4":"Your focus works well alongside a few trusted collaborators. Sincere cooperation lets small, steady efforts add up to something real and lasting.","5":"Others count on you to catch the details they miss. Accept that role, but share the load so your careful attention does not turn into a burden.","6":"With experience you know when enough detail has been gathered. Like rain that has fallen and settled, you can rest and trust the work already done."},"10":{"1":"Loving yourself begins with simple conduct, walking your own way in plain shoes. Study how you actually behave before deciding who you think you ought to become.","2":"Others notice an ease in how you carry yourself, a calm that asks for nothing. Protect it by spending time where you do not need to perform for anyone.","3":"You learn self-acceptance by treading on the tiger's tail and getting bitten. A one-eyed man believes he sees clearly; honest humility grows out of those stumbles.","4":"Your sense of worth is reinforced by people who know you well. Move carefully and respectfully among them, and their regard helps steady you when you doubt yourself.","5":"People expect you to model confident behaviour. Resolute conduct earns respect, but watch that it does not harden into a mask that others then project onto you.","6":"Looking back over how you have walked, you can see what worked and what did not. Your self-respect becomes a quiet example of living honestly without apology."},"11":{"1":"When you pull up ribbon grass, the roots come up with it. Your ideas need a base of research, so trace each one to its source before you share it.","2":"Ideas arrive in you naturally and often. Give yourself room alone to let them form, rather than spilling each one out the moment it appears.","3":"You test ideas by voicing them and watching which ones collapse. No plain is without a slope, so expect some concepts to fail and keep moving forward.","4":"Your ideas find their audience through friends and colleagues. Share them in ordinary conversation, where people can take what fits and pass it on to others.","5":"Others expect you to have the bright idea that solves everything. Offer concepts as possibilities rather than promises, so the expectation stays reasonable for everyone.","6":"Over time you learn that most ideas are seeds rather than finished plans. You become a trusted voice who can tell a passing notion from one worth pursuing."},"12":{"1":"Caution begins with knowing what you truly feel before you speak. Hold back while the times are closed, and make sure your words are rooted in something real.","2":"You have a natural instinct for timing your words. Silence is part of the gift, and you need time alone to sense when the mood is finally ripe.","3":"You learn when to speak by speaking at the wrong moment and feeling the result. Each misjudged word teaches you more about the shape of the right moment.","4":"Your words carry weight among a small circle who understand your moods. Share with them first, and they will open doors for your voice further out.","5":"People expect you to say the moving, decisive thing at exactly the right time. Hold back when the mood is wrong, even if that disappoints them.","6":"With experience you see that a standstill never lasts forever. Your restraint becomes an example of how speaking less, at the right moment, can mean much more."},"13":{"1":"Listening starts at the open gate, ready for anyone who comes. Learn to hear stories without rushing to judge them, and the ground for trust is laid.","2":"People tell you things they have told no one else. The gift is real, but you need solitude afterwards to process everything you hold for others.","3":"You learn to listen by noticing when you hide behind suspicion or opinion, like soldiers crouched in the thicket. When you stop hearing, drop the defence and try again.","4":"The stories that reach you travel along your relationships. Through friends and their friends, you gather a wide picture of how people live and what they need.","5":"People expect you to understand them completely and keep every secret. Be honest about what you can carry, so their trust is not broken later.","6":"Over time the stories you have heard combine into perspective. You can offer others a wider view of their own lives without ever breaking a confidence."},"14":{"1":"Power begins with knowing your resources and their risks. Keep clear of harm while your means are still young, and learn exactly what sustains them.","2":"A big wagon can carry a heavy load. You manage energy and resources capably, though you need time alone to recharge after directing so much.","3":"You learn to use your power by trying ventures and sometimes misusing it. Notice when resources serve only you, and redirect them toward something wider.","4":"Your resources grow through people you trust. Keep clear lines between what is yours and what is shared, and the network stays healthy for everyone.","5":"Others look to you as a source of support and expect you to fund or fuel their plans. Give with dignity, and do not let generosity harden into obligation.","6":"With time you learn that power fulfils its purpose when it serves a direction. Your example shows how resources can be held with grace rather than a tight grip."},"15":{"1":"Accepting extremes begins with modesty about your own patterns. Watch how your moods and energy swing over weeks before you try to smooth them out.","2":"Your acceptance of all kinds of people draws others close to you. Make room for your own odd rhythms too, especially in the hours you spend alone.","3":"You learn about extremes by swinging to them yourself. A modest, steady effort after a bold excess brings you back to a rhythm that actually works.","4":"Your humane outlook reaches others through your circle. Friends from very different walks of life show you how wide the human range really is.","5":"People expect you to be endlessly tolerant and inclusive. Hold firm boundaries when someone's extremes harm others; modesty does not mean doing nothing.","6":"With experience you see the worth of both lulls and surges. You become a calm example of how to live well without forcing a single rhythm on anyone."},"16":{"1":"Mastery rests on repeating the fundamentals. Do not boast of your enthusiasm before the work is done; practise the basics until they become second nature.","2":"You have a natural flair for a skill others enjoy watching. Practise in private as well, since mastery ripens best when no audience is present.","3":"You discover your skills by trying many and dropping those that do not hold. Looking upward and hesitating costs momentum, so commit to practice once you find the right one.","4":"Your enthusiasm spreads to the people you work with. Teaching a skill to friends or colleagues deepens your own mastery while theirs grows.","5":"Others expect you to be the expert who can perform on demand. Stay honest about what you have truly practised and what is still raw.","6":"Over the years enthusiasm matures into steady, reliable skill. You become an example of how disciplined repetition turns raw talent into something others can trust."},"17":{"1":"A sound opinion starts with sound facts. Before you forecast the future, examine the evidence, and be ready to change position as the evidence shifts.","2":"You form views quickly, and they often prove useful. Share them sparingly, and keep time alone to refine them before they harden into fixed beliefs.","3":"You test opinions by voicing them and seeing which hold. Following one view means letting go of another, so choose consciously rather than by habit.","4":"Your views travel through people who trust your judgement. Listen to their opinions too, since they sharpen yours and keep your forecasts grounded.","5":"Others expect you to know where things are heading. Give your best forecast with honesty about uncertainty, so their trust survives a wrong call.","6":"With experience your opinions become more measured and less urgent. You become someone whose view of what lies ahead others actively seek out."},"18":{"1":"Correction begins with the inheritance, the things passed down and left to spoil. Understand the root of a problem before you start fixing its surface.","2":"You see flaws others overlook, and they notice your sharp eye. Use it gently, and step away to rest when the weight of criticism builds up.","3":"You learn to correct by trying to fix things, sometimes too harshly. A little regret is a fair price; adjust your approach and continue the repair.","4":"Your corrections work best where trust already exists. Tolerating a fault too long within your circle only lets it spread, so raise it kindly and early.","5":"People expect you to repair what is broken in a group or system. Do it with skill and share the credit, since praise and blame both land on you.","6":"Over time you learn which things are worth correcting and which can be left. You can stand back, offer perspective, and let others do the repair themselves."},"19":{"1":"Wanting begins with sensing what people actually need. Approach together with others, honestly, and learn what keeps the whole group fed and steady.","2":"You naturally pick up on the needs around you, often before they are spoken. Spend time apart so your own wants do not get lost under everyone else's.","3":"You learn your needs by reaching for things and discovering they do not satisfy. When a comfort turns empty, admit it, grieve it a little, and adjust.","4":"Your needs are met through close bonds. Approaching others directly about what you want strengthens the connection in both directions.","5":"People expect you to know and meet their needs. Use wisdom here, choosing support that strengthens them instead of support that creates dependence.","6":"With experience you understand the balance between your needs and those of others. Your generosity becomes an example that does not neglect yourself."},"20":{"1":"Present awareness starts with plain observation. Look the way a child looks, without bias, and see what is actually here now before you judge it.","2":"You naturally sense the present moment, and others feel it in your company. Keep space for quiet watching, since awareness thins out in constant noise.","3":"You learn about the now by acting on impulse and seeing what follows. Each mismatch between your words and the moment refines your sense of timing.","4":"Your awareness reaches others through those close to you. Viewing the light of the land, you come to know whom to speak with and when.","5":"People expect you to see clearly and say what matters right now. Speak from present truth, not from what they hope to hear from you.","6":"Over time your awareness widens beyond yourself. Having contemplated your own life and those of others, you can speak for the present with calm authority."},"21":{"1":"Control rests on clear rules set early. Feet fastened in the stocks stop a small wrong before it grows, so define your boundaries from the very start.","2":"You know how to manage resources, and others can feel that competence. Defend your territory without overreaching, and take time alone to loosen your grip.","3":"You learn control by biting into problems and finding some meat tougher than expected. A little poison along the way is a lesson, not a failure.","4":"Your control works best through alliances. Biting through dried gristle takes persistence, and trusted helpers make that hard work considerably lighter.","5":"Others expect you to take charge and resolve disputes. Act fairly and openly, since control that looks selfish quickly loses the support it depends on.","6":"With experience you know when to release control. Your example shows how firmness and restraint together keep people and resources working well."},"22":{"1":"Grace begins with simple steps. Lend grace to your toes, leave the carriage and walk; start with modest beauty rather than display meant to impress.","2":"Your charm is natural, and others notice it at once. It flows best when your mood is open, so rest in solitude when it is not.","3":"You learn grace by over-adorning and finding it hollow. Polish and elegance help, but steady character is what keeps your charm honest over time.","4":"Your openness spreads through your friendships. A white horse arrives as a plain offering; simple gestures win the deepest trust among close ones.","5":"Others expect you to be gracious and welcoming at all times. Honour your moods instead, since forced openness wears thin faster than honest reserve.","6":"Over time your sense of grace becomes simple and unadorned. You become an example of how sincerity is the finest ornament a person can wear."},"23":{"1":"Clear explanation needs a firm base. When the legs of the couch are split, comfort falls away, so test the foundation of each insight before you share it.","2":"You can turn complex thoughts into simple words. Do it in your own time, because an explanation forced out too early tends to be brittle.","3":"You learn to explain by trying and being misunderstood. Each misunderstanding shows you which words to cut and which ones carry the meaning.","4":"Your insights reach others through your network. Friends who understand your style can translate your ideas for those who do not yet follow you.","5":"People expect you to make the obscure clear on demand. Choose your words carefully, because a misunderstood insight tends to rebound on the one who said it.","6":"With experience you know which insights can be shared now and which must wait. Your voice becomes trusted precisely because it is selective."},"24":{"1":"Rationalisation begins with returning to the starting point. Go back a short distance to the first principle before building any explanation on top of it.","2":"Your mind returns to ideas naturally and slowly finds their sense. Give it quiet, unhurried time, since this kind of rumination works best undisturbed.","3":"You learn by returning to the same idea again and again, sometimes too often. Notice the loop, and step out of it when nothing new is appearing.","4":"Your thinking is refined through talk with trusted friends. Even walking among many companions, you still come back alone to your own conclusions.","5":"Others expect you to have reasoned everything through. Share your conclusions honestly, including the places where your reasoning is still incomplete.","6":"With experience you know which ideas deserve another return and which to drop. Your patient thinking becomes an example of steady, unhurried reason."},"25":{"1":"Innocence begins with acting without hidden motives. Go forward without calculation, and your conduct earns trust from the very start.","2":"You have a natural openness that people find disarming. Protect it with time alone, away from the cynicism that slowly wears it down.","3":"You learn innocence by meeting misfortune you did not cause. A tethered cow taken by a passing traveller teaches that openness always carries some risk.","4":"Your unconditional care spreads through those close to you. Stay steady in what you value, and your circle tends to reflect that steadiness back.","5":"People see you as the one who loves without conditions, and they expect it always. Accept that you sometimes need care and patience in return.","6":"Over time you understand when innocence helps and when it harms. Your example shows how to stay open-hearted without becoming naive."},"26":{"1":"Persuasion rests on knowing your material thoroughly. Halt before danger, and study the facts that make your case worth anyone's attention.","2":"You have a natural skill for presenting ideas so that people listen. Use it with care, and rest in silence when you are not selling anything.","3":"You learn persuasion by pitching ideas and seeing which land. Like a good horse running with others, practise daily until your delivery runs smoothly.","4":"Your influence works through relationships. A board fixed to the horns of a young bull prevents harm; keep your claims honest and your network keeps trusting you.","5":"Others expect you to convince people and close the deal. Use memory and skill honestly, since a hollow pitch damages your name very quickly.","6":"With experience you know when persuasion serves people and when it manipulates them. Your honest voice becomes a model of responsible influence."},"27":{"1":"Caring begins with tending your own needs. Do not let your own magic tortoise go while you stare at another's meal; nourish yourself first.","2":"You care for others naturally, and people feel fed and protected by you. Take time alone to refill, or the care turns slowly into depletion.","3":"You learn to care by giving the wrong kind of help and seeing the result. Nourishment that only feeds dependence needs to be changed.","4":"Your care spreads through your network of family and friends. Ask for help as well as offering it, since mutual nourishment lasts much longer.","5":"People expect you to always be there and take care of everything. Set limits, so your care stays a gift rather than an obligation you resent.","6":"Over time you learn the difference between helping and controlling. Your care becomes a model others can follow without depending on you."},"28":{"1":"Finding meaning starts with careful groundwork. Spread white rushes beneath what you set down; caution at the base makes later risks worth taking.","2":"You have a natural sense of which struggles matter. A withered poplar putting out fresh shoots shows that renewal is possible, so trust that instinct.","3":"You learn by fighting battles and discovering some were not worth it. A ridgepole that sags warns you when your effort has been misplaced.","4":"Your sense of purpose is strengthened by allies who share it. Together you can hold up a beam that would buckle if you carried it alone.","5":"Others expect you to fight for them and find meaning in hard times. Choose the battles worth fighting, not every one handed to you.","6":"Over time you see that struggle itself can carry meaning. Your example shows others how to face real risk without losing sight of what matters."},"29":{"1":"Commitment needs firm footing. Saying yes without knowing what you agree to is like stepping into a pit within the abyss, so learn the terms first.","2":"You naturally persist where others give up. Protect that capacity with rest, because constant commitment drains you before you notice.","3":"You learn commitment by agreeing to things and then finding you should not have. Each overcommitment teaches you what to accept next time.","4":"Your commitments are kept within trusted relationships. A jug of wine and a bowl of rice offered simply show that a sincere promise needs no ceremony.","5":"Others expect you to say yes and deliver. The water fills the pit only to the rim, so take on what you can finish and no more.","6":"With experience your commitments become wise and few. Your example shows the value of a deliberate yes and an honest, timely no."},"30":{"1":"Desire begins with seeing clearly. When footprints run crisscross, pause and examine what you truly want before you chase after it.","2":"Your passion is natural, and others feel its warmth like yellow light at midday. It needs time alone to settle, or it starts to consume you.","3":"You learn about desire by chasing experiences that burn out fast. The light of the setting sun shows how feelings fade along their natural course.","4":"Your desires are shaped by those close to you. Experiences shared with friends give your longing both grounding and a steady warmth.","5":"People expect you to bring passion and excitement wherever you go. Accept that your feelings have tides, and refuse to perform them on demand.","6":"With experience you know which desires are worth following. Your measured passion becomes a model for living fully without burning out."},"31":{"1":"Influence starts small, like a twitch in the big toe. Learn the ground you stand on and the people around you before you try to lead them.","2":"Your voice carries naturally when people are ready to hear it. Stay quiet when they are not, and rest from leading during your time alone.","3":"You learn influence by pushing too soon and being ignored. Influence felt in the thighs leads only to restless action, so wait until you are recognised.","4":"Your influence spreads through your network. A steady intention, rather than restless agitation, draws people toward your lead over time.","5":"Others expect you to speak for them and to lead. Lead with clarity, since recognition is easily withdrawn when you overreach.","6":"Over time you understand that influence is earned, not seized. Your example shows how to lead by being trusted rather than by being loud."},"32":{"1":"Continuity rests on not forcing permanence too soon. Seeking duration too hastily brings trouble, so learn what truly endures before you try to secure it.","2":"You have an instinct for what will last. Trust it in quiet moments, since the urgency of others can easily drown out that sense.","3":"You learn continuity by holding on too long or letting go too quickly. Each mistake teaches you when change is needed and when it is not.","4":"Your sense of what lasts is shaped by long relationships. Hunting in a field with no game teaches you where your time is worth investing.","5":"People expect you to protect what is stable. Accept that continuity sometimes means adapting, and avoid clinging to forms that have outlived their use.","6":"With experience you know what truly lasts and what only seems to. Your patience becomes an example of steady, unforced endurance for others."},"33":{"1":"Before you step back, find out what you are stepping back from. A retreat that rests on a clear grasp of the facts keeps you safe instead of merely hidden.","2":"You know instinctively when to leave a room or a conversation. Others notice how well you keep a secret, yet you need solitude to digest what you have witnessed.","3":"You learn the art of withdrawal by getting it wrong, leaving too late or too early. Each tangled exit teaches you how to step away cleanly next time.","4":"Your retreats affect the people around you. Step back in a way that keeps the bond intact, and those you trust will still be there when you return with your story.","5":"People expect you to know the right moment to pull out of a failing situation. Make your withdrawal timely and well explained, or the projection turns into blame.","6":"Over time you learn to retreat without fear or regret. Your quiet distance becomes a vantage point, and the memories you gather turn into calm counsel for others."},"34":{"1":"Your strength needs solid footing before it moves. Learn what your energy is actually for, otherwise force spent too early leads only to stumbling forward.","2":"Raw vitality comes naturally to you and others feel it at once. Give it periods of quiet so the power stays steady instead of pushing at everything nearby.","3":"You discover the limits of your force by testing them. Like a ram butting a hedge, you sometimes get your horns caught, and that teaches you where pushing fails.","4":"Your power moves best through steady relationships. When the people you know open a path, your energy rolls forward like a strong axle under a loaded cart.","5":"Others assume you will carry the heavy load and solve it by sheer effort. Use your strength wisely, because when force misses the target your reputation suffers quickly.","6":"With age you learn when not to push. Your example shows that real power knows how to wait, and that stubborn forcing often leaves you stuck in the hedge."},"35":{"1":"Progress rests on knowing the ground before you move. If your first steps are rebuffed, stay patient and keep learning; the experience you seek arrives once you understand it.","2":"You have a gift for finding new experiences, and people notice your appetite for them. Pause between adventures so you can feel what each one actually gave you.","3":"You try something new, see what holds and discard the rest. Mistakes are fuel here, because each failed venture sharpens your sense of what deserves your hunger next.","4":"New experiences come to you through friends and contacts. Do not hoard opportunities like a greedy marmot; shared progress keeps the network warm and the doors open.","5":"Others see you as the one who knows how to make things move. Let go of worrying about gain or loss, and lead with what you have truly lived.","6":"Having tasted many changes, you can tell which ones are worth chasing. Your example shows others how to grow through experience without being consumed by restlessness."},"36":{"1":"Before entering emotional turmoil, study it from a distance. Knowing how crises usually unfold lets you lower your wings and keep moving when the light dims.","2":"You have a natural capacity to stay humane in hard times. Others notice your resilience, yet you need withdrawal to recover after carrying them through the dark.","3":"You learn about feelings by walking straight into situations you have never met before. Some leave you bruised, and every bruise teaches what you can actually handle.","4":"Crises tend to reach you through the people close to you. Choose your allies with care, because the network that brings trouble can also show you the way out.","5":"Others expect you to stay calm when everything darkens. Like someone who hides their light to survive a harsh ruler, you may need to keep your feelings private for a time.","6":"Having passed through several storms, you know darkness does not last. Your perspective helps others see that the hardest episode is often the turning point."},"37":{"1":"A family or team holds together when everyone knows the agreements from the start. Clear house rules give your warmth a stable base instead of leaving it vague.","2":"You care for others through small, steady acts like cooking and sharing a meal. People feel at home with you, yet you need quiet time to refill that warmth.","3":"You learn about loyalty by testing the balance between strictness and indulgence. Too much of either strains a household, and trial shows you where the middle lies.","4":"Your bonds widen into a network of mutual support. The kindness you give comes back through friends of friends, enriching the whole circle and not only yourself.","5":"People expect you to lead the household and keep the peace. Lead through sincere affection rather than demands, and others will follow willingly instead of resentfully.","6":"Over time your loyalty earns quiet authority. You become the person whose sincerity and fairness show others what a healthy family or friendship looks like."},"38":{"1":"Opposition starts with knowing what you stand for. Not every conflict needs chasing; like a lost horse that returns on its own, some differences resolve once you feel secure.","2":"You have a knack for meeting resistance in unlikely places, even a narrow lane. Others admire your fighting spirit, but rest keeps it from turning into constant battle.","3":"You learn what is worth defending through trial and setback. Sometimes the cart is dragged back and the oxen stall, and those moments show which fights really matter.","4":"Struggle feels lonely until you find allies who share your cause. A single trusted companion turns isolated resistance into a stand that others can join.","5":"People see you as the one who will fight on their behalf. Make sure the battle is truly worth it, or their expectations will drag you into conflicts that are not yours.","6":"Experience teaches you that many enemies are only misunderstandings. You learn to lower the drawn bow, and your example shows others when to resist and when to reconcile."},"39":{"1":"Before you provoke anyone, understand the obstacle in front of you. Sometimes pausing and coming back later earns more respect than pushing into difficulty without a plan.","2":"You stir people without trying, poking at their mood until their spirit wakes up. Others notice this gift, and you need time alone so it does not exhaust you.","3":"You learn whom to provoke by doing it and watching what happens. Some responses inspire and others backfire, and each one sharpens your aim for the next attempt.","4":"Your provocations land best among people who know and trust you. In hard times friends gather around you, and your challenge becomes shared motivation instead of offence.","5":"Others expect you to shake things loose when everything is stuck. Provoke with care and purpose, because when the obstruction is great, people will hold you responsible for the outcome.","6":"With maturity you know which buttons to press and why. Your provocations become a kind of teaching, waking others to their own spirit rather than just disturbing them."},"40":{"1":"After giving your effort, get clear about what you owe and what you do not. Knowing the terms of the bargain makes your rest free of guilt.","2":"You naturally sense when you have given enough. Others value your contribution, yet you need long stretches alone to restore yourself before the next round of work.","3":"You learn your limits by overcommitting and paying for it. Carrying a heavy load while riding in the carriage invites robbers, and every bout of exhaustion teaches clearer terms.","4":"Rest comes easier when you release the people who drain you. Let hangers-on go, and your true allies will respect your need to withdraw and recover.","5":"Others assume you will always deliver for them. Free yourself from obligations that no longer serve anyone, and show clearly when your work is finished for now.","6":"Over time you learn to remove the one obstacle that keeps everything stuck, like shooting a hawk from a high wall. Your example shows that rest belongs to good work."},"41":{"1":"Every new experience starts as a fantasy that needs grounding. Study what is realistic before acting, and decide how much you can spend without draining your resources.","2":"Your imagination keeps producing pictures of what could come next. Others notice your dreams, yet you need solitude to let them ripen before you speak of them.","3":"You learn which fantasies hold up by testing them. When three travel together one often drops away, and fewer moving parts make the next experiment cleaner.","4":"Your dreams take shape through other people who share them. Cutting away what you do not need leaves room for friends to bring what the plan truly lacks.","5":"People cast you as the visionary who knows what is coming. Ground your fantasies in practical steps, because others may build their own plans on them.","6":"Having followed many dreams, you know which ones nourish and which ones drain. Your perspective helps others begin new cycles with restraint and a clear purpose."},"42":{"1":"Finishing a cycle well depends on knowing what it was for. Build on solid groundwork and large deeds become possible, but only when the foundation can carry them.","2":"You have a natural ability to bring things to completion. Others count on your steady finish, yet you need quiet time to let growth settle before starting more.","3":"You learn to finish things by meeting setbacks along the way. Even misfortune can increase you when you treat it as a lesson in how to complete what you began.","4":"Growth flows through the people you are connected to. Walk the middle path and keep your relationships honest, and others will trust you to carry their projects forward.","5":"Others expect you to bring every venture to fruit. A sincere heart serves you better than constant gain, because people sense when your motive is genuine kindness.","6":"With experience you recognise when a cycle should end. Your example shows that growth needs pruning, and that grasping for more without giving back leaves you unsupported."},"43":{"1":"Insights arrive suddenly, but trust rests on knowledge. Study enough so that when the breakthrough comes you can explain it, instead of stepping forward on a bare hunch.","2":"You hear inner answers before others have even asked the question. People notice your unusual clarity, yet you need solitude for those insights to come through undisturbed.","3":"You learn how to share breakthroughs by trying and sometimes failing. Speaking too early alarms people, and each misfired explanation teaches you better timing.","4":"Your insights land when you share them with people who know you. A trusted network gives your strange ideas a fair hearing, while strangers may dismiss them as nonsense.","5":"Others expect you to produce the brilliant answer on demand. Be resolute about what you know, but stay humble when your insight is still incomplete.","6":"Over time your sudden knowing becomes reliable. Your example shows that breakthroughs work best when they are calmly explained and patiently timed rather than announced too soon."},"44":{"1":"Your instinct for patterns needs grounding in facts. Hold back an impulse until you understand it, the way a brake checks a cart before it rolls downhill.","2":"You sense what will happen because you remember what happened before. Others notice how alert you are, and you need time alone to sort through what you sense.","3":"You learn to read patterns by misreading some of them. Every mistaken hunch sharpens your memory for what the next situation is really telling you.","4":"Your alertness serves the people around you. When you keep your bonds close, the network relies on your instinct to spot problems early and bring the right people together.","5":"People expect you to know who can be trusted. Use what the past has taught you, while staying open to the chance that someone has changed.","6":"Experience turns your instinct into quiet wisdom. You learn to keep a polite distance from patterns that repeat badly, and others value your calm perspective on people."},"45":{"1":"Bringing people together starts with understanding what they need. Know the available resources before you call a gathering, so the group has a real reason to stay.","2":"You naturally draw people and resources into one place. Others notice your gift for assembling a team, and you still need moments alone to rest from managing everyone.","3":"You learn how to gather people by trying and sometimes failing. A gathering that breaks up with sighs teaches what holds a group together better than any theory.","4":"Your gatherings grow through your network. Friends introduce friends and the community expands through trust, so keep those bonds alive with generosity rather than control.","5":"Others see you as the natural head of the group. Lead from shared purpose rather than position alone, because people follow sincerity longer than they follow rank.","6":"Over time you understand the cost of holding people together. Your example shows how to care for a group, even through sighs and tears when someone leaves."},"46":{"1":"Being in the right place starts with knowing your body and what it needs. Trust grows when you treat your physical self with care and steady attention.","2":"You have a natural gift for turning up where you belong. Others see luck in that, and you need quiet moments to stay connected to your body.","3":"You learn where you fit by trying different places. Some doors open as easily as an empty city, others close, and both teach you to follow your feet.","4":"The right places come to you through the people you know. A friend's invitation can lead you exactly where you should be, so stay open to it.","5":"Others expect you to be lucky and effortless. Show them the work behind it, climbing step by step, so they see the determination that underlies your good fortune.","6":"With experience you learn to keep climbing even when the way ahead is dark. Your example shows others how to trust the body and stay committed through uncertain stretches."},"47":{"1":"Making sense of the past starts with studying it carefully. Sitting under a bare tree with no answers is part of the process before the pattern comes clear.","2":"You find order in confusing memories without much effort. Others admire how you make sense of things, and you need time alone, since realisation tends to come in quiet moments.","3":"You learn to sort the past by trying different explanations. Some lead into rocks and thorns, and those dead ends show which interpretations simply do not hold.","4":"Realisations often come through conversation. A friend's question can bring a memory back, so share what puzzles you rather than carrying it in silence.","5":"Others expect you to explain what happened and why. Give them clarity only when it truly arrives, because forced meaning feels hollow and leaves people unconvinced.","6":"Over time you learn that confusion passes. Your example shows others that being tangled in vines is temporary, and that the right realisation arrives once you stop struggling."},"48":{"1":"Your knowledge needs a clean foundation. Like a well choked with mud, unexamined facts nourish nobody, so learn the basics before you call yourself an expert.","2":"You hold more knowledge than you realise. Others notice your depth, and you need time alone to let it settle, otherwise your skills leak away unused.","3":"You learn to share what you know by offering it and seeing what happens. A clean well that nobody draws from teaches you how to invite others to use it.","4":"Your knowledge reaches others through people who trust you. Keeping the well lined and maintained makes your network confident enough to draw from it.","5":"Others see you as the one with the answer. Make sure what you offer is fresh and clear, like cold spring water, since people will rely on it.","6":"Over time your depth becomes a resource for many. Like a well left uncovered, you let others draw freely, and your example shows knowledge serving a whole community."},"49":{"1":"Before rejecting anything, understand the principles at stake. Hold steady until change is truly necessary, like something bound in tough ox hide until the right day comes.","2":"You have a natural sense for when an old arrangement has outlived its use. Others notice your principled stance, and you need time to reflect before acting on it.","3":"You learn which principles deserve a fight by testing them. Talking a change over three times before acting saves you from rebellions you may later regret.","4":"Change happens through alliances. When your values are shared by people you trust, a reform gains support instead of being rejected as a personal grievance.","5":"Others see you as the reformer who will fix what is broken. Change with clarity, like a tiger whose stripes stand out, so people understand why the transformation matters.","6":"With experience you learn that lasting reforms come gradually. Your example shows that principles can be upheld through small, visible changes rather than constant upheaval."},"50":{"1":"Group values start from a clean base. Like a cauldron turned over to empty out old residue, check the foundations before pouring in new rules.","2":"You naturally sense what keeps a group healthy. Others feel your care, yet you need distance at times, since guarding values for everyone can become heavy.","3":"You learn which rules matter by watching some of them fail. When the handles of the cauldron are altered it becomes hard to carry, and experience shows which values to keep.","4":"Your values spread through the people you know. If one leg of the cauldron breaks everyone loses the meal, so keep the network strong enough to carry shared values.","5":"Others expect you to protect the rules. Lead with fairness, because people sense whether you guard values for the group or merely for your own position.","6":"Over time your sense of values becomes trusted. Like jade rings on a cauldron, your example shows that durable principles can be both firm and gentle."},"51":{"1":"Shocks hurt less when you have studied them in advance. After the first fright you may even laugh, because you understand what the thunder means.","2":"You have a natural courage that others admire. When shock strikes you may lose things, but you recover them, so give yourself time alone afterwards to absorb what happened.","3":"You learn to handle surprises by being caught off guard. Each jolt shows you a weak point and builds the courage you need to be first next time.","4":"Shocks travel through your network. If you get stuck in the mud after a jolt, the people around you can pull you free, so keep those connections alive.","5":"Others expect you to lead the way when trouble comes. Stay centred through repeated shocks, so people can rely on your steadiness while everything keeps shifting.","6":"Over time you see that not every shock needs a response. Your example shows others how to stay calm when thunder rolls around them and their neighbours."},"52":{"1":"Stillness starts at the feet. Pause before acting until you understand what you are about to do, so that movement comes from clarity rather than restlessness.","2":"You naturally hold still while others rush around you. Your concentration is a gift that people notice, so protect it with quiet time and it will stay strong.","3":"You learn your limits by trying to force stillness. Holding back too rigidly strains you like a stiff back, and experience shows you when to relax.","4":"Your focus benefits the people around you. When you calmly settle your body, your network senses it and can organise its efforts around your steady presence.","5":"Others expect you to choose your words carefully. Keep your jaw still until you know what to say, and your speech will carry real weight.","6":"With experience stillness turns into generosity. Your calm becomes noble rather than stubborn, and others learn from you how to concentrate without forcing it."},"53":{"1":"Every new project starts small, like a wild goose stepping onto the shore. Study the ground carefully before you push, because good beginnings need solid information.","2":"You have a natural instinct for starting things. Others notice your ability to launch projects, so take quiet moments and begin each one with fresh energy.","3":"You learn to start well by sometimes starting badly. Some beginnings fail, and every failure shows you what kind of start a project actually needs.","4":"New beginnings arise through your network. Like a goose finding a flat branch to rest on, you can count on support from people who know you.","5":"Others see you as the one who will get things off the ground. Be patient with them and with yourself, since some projects take years to show results.","6":"Over time you understand the cycle of beginnings and endings. Your example shows that development happens step by step, like geese crossing the sky in formation."},"54":{"1":"Rising in the world starts with knowing your place in it. Accepting a modest role while you learn the rules can be the foundation of lasting success.","2":"You have a natural drive that others recognise. Like someone with one good eye who still sees the way, you make progress, and quiet time keeps that ambition healthy.","3":"You learn the price of ambition by trying shortcuts. Some of them fail, and each failure shows you how to climb without compromising your integrity.","4":"Your ambitions rise through the people you know. Patience with your connections pays off, and waiting for the right alliance often brings more than rushing.","5":"Others expect you to climb high. Lead with modesty rather than display, since people trust ambition more when it does not dress itself in showy finery.","6":"With experience you know when ambition is empty. Your example shows others that rising without substance is like carrying a basket that holds no fruit."},"55":{"1":"Abundance rests on understanding your moods. Study how your feelings rise and fall, so that both high and low seasons can be felt fully and accepted.","2":"You feel the full range of emotions. Others notice your spirit even when the sky seems dark at noon, and you need solitude to let the moods pass.","3":"You learn what feeds your spirit by experimenting. Some attempts leave you feeling broken, and those dark moments teach you how to find the light again.","4":"Your spirit grows through meeting equals. People who share your outlook help you see abundance where others see only scarcity or gloom.","5":"Others see you as a source of light and hope. Accept that role with grace, but remember that your moods change, and so does the light you give.","6":"With experience you learn that abundance is not about filling the house. Your example shows others that spirit thrives through connection, while a full but closed house stays empty."},"56":{"1":"Good stories rest on solid material. Avoid trivial anecdotes and gather real experiences first, so that what you share has substance and holds attention.","2":"You have a natural gift for telling stories, and others love to listen. Take time alone to collect new experiences, since stories run thin without fresh material.","3":"You learn which stories work by telling them. Some fall flat or offend, like a careless traveller who sets the inn on fire, and each one shows what moves people.","4":"Your stories spread through the people you meet. Every place you stay offers new listeners, and your network becomes an audience that passes your tales along.","5":"Others expect you to entertain and inspire. Choose stories that carry meaning, like an arrow that finds its mark, so people remember you for more than diversion.","6":"Over time you learn when a story is worth telling. Your example shows others how to stimulate without destroying, avoiding the careless word that burns a nest."},"57":{"1":"Your intuition needs a base of knowledge. When you waver between advancing and retreating, steady yourself with facts, and the inner voice becomes easier to trust.","2":"You hear what is right in the moment. Others notice your sensitivity, so take quiet time, since intuition speaks most clearly when the room is calm.","3":"You learn to trust intuition by doubting it and seeing the result. Repeated second guessing can hurt, but it teaches you to recognise the true signal.","4":"Your intuition guides the people around you. When you hunt for answers alongside friends, your inner clarity can bring a good catch to the whole circle.","5":"Others expect you to sense what is coming. Trust what you hear, then review it a few days later, because intuition works best when followed by reflection.","6":"With experience you learn that too much searching dulls intuition. Your example shows others how to listen quietly without crawling under the bed and losing their axe."},"58":{"1":"Lasting joy rests on understanding what really improves life. Study what works before you try to fix things, so your enthusiasm stays grounded and your efforts make a difference.","2":"You bring cheer to those around you without trying. Others notice your vitality, so take time alone to recharge before sharing more of your energy.","3":"You learn what makes life better by testing ideas. Some pleasures prove hollow, and every disappointment shows you which improvements are worth the effort.","4":"Your joy spreads through the people you know. Weigh carefully which pleasures to share, and your network becomes a source of steady encouragement and real improvement.","5":"Others see you as the one who will lift their spirits. Be careful with anyone who drains your joy, since your vitality is not unlimited.","6":"Over time you learn the difference between passing pleasure and lasting joy. Your example shows others how to improve life without getting lost in distraction."},"59":{"1":"Closeness begins with understanding the barriers. Know what keeps people apart, and you can move in at the right moment, like a strong horse coming to the rescue.","2":"You naturally break down walls between people. Others feel the warmth you offer, yet you need time alone so you do not lose yourself in closeness.","3":"You learn intimacy by trying different ways of getting close. Some attempts fail, but even setting your pride aside for a moment teaches you something.","4":"Your bonds reach beyond one person. When you dissolve the barriers inside a group, others find connections through your example that they could not reach alone.","5":"Others expect you to make the first move toward closeness. Speak openly, because a clear word can dissolve tension that silence would only deepen.","6":"With experience you learn when to keep your distance and when to draw near. Your example shows others how to protect themselves while still remaining open to intimacy."},"60":{"1":"Working within limits starts with knowing them. Stay inside the courtyard while you learn the rules, and your creativity will have a solid frame to push against.","2":"You sense when limits can be bent. Others admire your adaptability, and stepping back at times shows you which boundaries help and which simply hold you back.","3":"You learn by pushing against limits. When you ignore them you may end up lamenting, and each lesson teaches you which rules deserve respect.","4":"Your network helps you work with limits. Accepting what you cannot change frees energy, and the people around you offer ideas that fit within real constraints.","5":"Others expect you to find the creative solution. Make limits feel sweet rather than bitter, since people follow a framework more willingly when it feels fair.","6":"Over time you learn that some limits are painful but necessary. Your example shows others how to accept bitter constraints without losing creativity or spirit."},"61":{"1":"The pressure to know is easier to bear when you build on solid knowledge. Prepare carefully, and inner truths will come as steady insights rather than restless questions.","2":"You sense truths others cannot reach. Like a crane calling from the shade, your voice finds those who answer it, and you also need solitude to hear yourself.","3":"You learn which truths are real by testing them with others. Some responses leave you weeping and some laughing, and each one teaches you to trust your inner sense.","4":"Your insights reach others through people who trust you. Sincerity binds you to them, so be honest about what you know and what you do not.","5":"Others expect you to reveal hidden truths. Speak only when you are certain, since people may treat your words as final.","6":"Over time you learn that some mysteries stay unsolved. Your example shows others how to live with open questions without crowing too loudly about answers."},"62":{"1":"Precision starts with checking facts carefully. Like a young bird that tries to fly too high too soon, details stated without groundwork can lead to costly mistakes.","2":"You notice small facts that others overlook. People rely on your precision, so take time alone to sort the details before you present them.","3":"You learn the value of detail through mistakes. Missing one small fact can cause real trouble, and each slip teaches you to double check before speaking.","4":"Your detailed knowledge serves your network. When you name facts clearly, the people around you make better decisions and trust the information you share.","5":"Others expect you to have the precise answer. Be modest about what you know, since dense clouds that bring no rain show that preparation does not always produce results.","6":"Over time you learn when detail matters and when it does not. Your example shows others how to be thorough without getting lost in endless facts."},"63":{"1":"Doubt works best when it rests on solid facts. Slow down and question carefully, like a driver braking before a ford, so your logic stands on firm ground.","2":"You notice what does not add up. Others value your questions, so take time alone to work through your doubts before sharing them, and they will lead somewhere.","3":"You learn to doubt productively by testing ideas against evidence. Some lines of questioning take a long time, but each one teaches you how to reach a proof.","4":"Your doubts are best tested with others. Sharing questions with trusted people shows whether suspicion is warranted, or whether the fine robe has truly worn to rags.","5":"Others expect you to find the flaw in their reasoning. Keep your questions simple and sincere, since a modest offering often counts for more than an elaborate one.","6":"Over time you learn when to stop questioning. Your example shows that endless doubt can soak you to the head, and that proof sometimes means accepting what is already clear."},"64":{"1":"Clarity about the past starts with patience. Like a young fox that wets its tail by crossing the stream too early, rushing to conclusions only adds to the confusion.","2":"You hold vivid images of the past in your mind. Others notice your rich imagination, so give yourself time alone and let those images arrange themselves.","3":"You learn by trying to make sense of things too soon. Early conclusions often fail, but each one teaches you to wait until the pieces fit.","4":"Your confusion clears through conversations with others. Sharing memories with trusted friends helps the images settle into a story that finally makes sense.","5":"Others see you as the one who can explain what happened. Let your understanding shine clearly, but admit what is still uncertain.","6":"Over time you learn to rest with confusion instead of fighting it. Your example shows others that the celebration can wait until the meaning is complete."}},"gateLinesLocalized":true,"crossesLocalized":true,"crosses":{"Right Angle Cross of The Sphinx":{"angle":"RAC","gates":[1,2,7,13],"name":"Right Angle Cross of The Sphinx","text":"The Sphinx is a cross of direction. Through gates 13, 2, 7 and 1 it joins listening, a quiet inner knowing of where life should go, the role of guiding others and the drive to be original. On the Right Angle this direction is found by living your own process: you discover the way by walking it, and others later orient by the path you made."},"Juxtaposition Cross of Self-Expression":{"angle":"JC","gates":[1],"name":"Juxtaposition Cross of Self-Expression","text":"Creative originality is the constant in this design. Gate 1 drives you to be original and to show it. On the Juxtaposition this keeps its shape through every season of life: your expression is distinct and recognisable, and it flourishes when you follow your own creative timing rather than the expectations of others."},"Left Angle Cross of Defiance":{"angle":"LAC","gates":[1,2],"name":"Left Angle Cross of Defiance","text":"Asserting originality against the grain is the theme of this cross. Gate 1 brings creative self-expression and gate 2 a quiet knowing of where life should go. On the Left Angle it unfolds through encounters: you challenge expectations and conventions in the groups you belong to, and your independent sense of direction encourages others to bring out their own originality."},"Juxtaposition Cross of The Driver":{"angle":"JC","gates":[2],"name":"Juxtaposition Cross of The Driver","text":"Direction is the constant here. Gate 2 carries a quiet knowing of where life should go, and in this cross that knowing is fixed rather than fleeting. The Juxtaposition holds it steady: you may not be the one who pushes, but your sense of direction steers, and resources and people tend to follow when you let that inner compass work without having to justify it."},"Right Angle Cross of Laws":{"angle":"RAC","gates":[3,50,56,60],"name":"Right Angle Cross of Laws","text":"The rules that let life grow in an orderly way are the subject of this cross. Gates 3 and 50 bring the ordering of something new and guardianship of the values that keep a group healthy, while 56 and 60 add storytelling and creative work within limits. As a Right Angle theme it is lived personally: you find out through your own experience which principles truly hold, and that lived knowledge gives your word weight."},"Juxtaposition Cross of Mutation":{"angle":"JC","gates":[3],"name":"Juxtaposition Cross of Mutation","text":"Change from within is a constant in this design. Gate 3 orders the new, making something workable out of initial chaos. On the Juxtaposition this keeps its shape throughout life: you keep meeting beginnings that look confused at first, and patience lets the new form settle in its own time instead of being forced before it is ready."},"Left Angle Cross of Wishes":{"angle":"LAC","gates":[3,50],"name":"Left Angle Cross of Wishes","text":"Hopes for a better shared life drive this cross. Gate 3 brings the work of ordering something new, and gate 50 care for the values that keep a group healthy. On the Left Angle it unfolds through others: wishes become real when they are shared, and your role is to help a community give shape and structure to what it wants for its future."},"Right Angle Cross of Explanation":{"angle":"RAC","gates":[4,23,43,49],"name":"Right Angle Cross of Explanation","text":"This cross carries the need to make sense of change and to put it into words. Gates 49 and 4 bring principles and answers to doubt, while 23 and 43 turn a sudden insight into language others can follow. As a Right Angle theme it unfolds through your own process: what you come to understand for yourself becomes the explanation that helps others accept something new."},"Juxtaposition Cross of Formulization":{"angle":"JC","gates":[4],"name":"Juxtaposition Cross of Formulization","text":"Turning questions into answers is a steady capacity in this life. Gate 4 formulates logical explanations for doubts. As a Juxtaposition it holds its line through changing interests: you find answers that make sense, and they serve best when you offer them as working formulas to be tested rather than as final truths."},"Left Angle Cross of Revolution":{"angle":"LAC","gates":[4,49],"name":"Left Angle Cross of Revolution","text":"Change in the shared order of things is the territory here. With gates 49 and 4 the theme links principled rejection of what no longer works with the ability to formulate a better answer. On the Left Angle it unfolds through other people: revolutions are never made alone, and your part often appears when a group is ready to rethink how it lives together."},"Right Angle Cross of Consciousness":{"angle":"RAC","gates":[5,35,63,64],"name":"Right Angle Cross of Consciousness","text":"Awareness of how life works, and the wish to understand it, runs through this cross. Gates 63 and 64 bring doubt and the images of the past that wait for meaning, while 35 and 5 add the hunger for new experience and the patience of natural rhythms. As a Right Angle theme it grows through your own process: questions you live with long enough turn into clarity you can share."},"Juxtaposition Cross of Habits":{"angle":"JC","gates":[5],"name":"Juxtaposition Cross of Habits","text":"Rhythm and consistency are the steady theme of this life. Gate 5 brings natural rhythms, habits and patient waiting. As a Juxtaposition it holds its line: your routines keep you balanced, and respecting your own timing gives life a reliable flow even when events around you are unsettled."},"Left Angle Cross of Separation":{"angle":"LAC","gates":[5,35],"name":"Left Angle Cross of Separation","text":"The tension between new experience and steady rhythm shapes this cross. Gate 35 seeks change, gate 5 consistency and patient habits. On the Left Angle it unfolds through others: relationships may form and part as rhythms shift, and learning to separate gracefully when the time is right, without bitterness, is part of the wisdom this cross offers."},"Right Angle Cross of Eden":{"angle":"RAC","gates":[6,11,12,36],"name":"Right Angle Cross of Eden","text":"Leaving innocence and learning through experience is the story of this cross. Gates 36 and 6 bring emotional growth through new situations and the friction that decides who comes close, while 12 and 11 add careful expression and a stream of ideas. As a Right Angle theme it is lived in your own process: each step out of the familiar teaches you something you could not have learned by staying safe."},"Juxtaposition Cross of Conflict":{"angle":"JC","gates":[6],"name":"Juxtaposition Cross of Conflict","text":"Friction in close relationships is a lasting theme here. Gate 6 sets the emotional boundary that decides who comes close. As a Juxtaposition it holds its line: conflict is not a sign of failure but a way of discovering where real intimacy is possible, and giving emotions time before reacting turns that friction into something productive."},"Left Angle Cross of The Plane":{"angle":"LAC","gates":[6,36],"name":"Left Angle Cross of The Plane","text":"This cross explores what happens when emotional experience is shared. Gate 36 brings growth through new situations and gate 6 the friction and intimacy that decide who comes close. On the Left Angle it unfolds through relationships: your experiences touch other lives, and together you find out what a more mature emotional life can look like, one honest exchange at a time."},"Juxtaposition Cross of Interaction":{"angle":"JC","gates":[7],"name":"Juxtaposition Cross of Interaction","text":"Guiding how people move together is a constant role here. Gate 7 leads in the service of a collective direction, and in this cross the role stays with you whatever the setting. On the Juxtaposition it holds steady: you shape how people work together, and your leadership is welcomed when it reflects what the group truly wants."},"Left Angle Cross of Masks":{"angle":"LAC","gates":[7,13],"name":"Left Angle Cross of Masks","text":"Behind every role people play there is a story, and this cross is drawn to it. Gate 13 listens to what others carry, and gate 7 understands how roles shape the direction of a group. As a Left Angle theme it comes alive through encounters: in relationships and community you help bring out what is real, and in turn others show you which masks you wear yourself."},"Right Angle Cross of Contagion":{"angle":"RAC","gates":[8,14,29,30],"name":"Right Angle Cross of Contagion","text":"Desire and example spread from person to person, and this cross carries both. Gates 30 and 29 bring a longing for experience and the commitment to see it through, while 8 and 14 add a personal contribution backed by real resources. As a Right Angle theme it moves through your own process: by fully living what you want, you show others what is possible, and it catches on."},"Juxtaposition Cross of Contribution":{"angle":"JC","gates":[8],"name":"Juxtaposition Cross of Contribution","text":"Offering your individuality to the world is the fixed theme of this cross. Gate 8 makes your own way of doing things available to others as an example. On the Juxtaposition it holds steady: your contribution is your style, and it is most valuable when you stay true to it rather than adapting to fit in with whatever is expected at the moment."},"Left Angle Cross of Uncertainty":{"angle":"LAC","gates":[8,14],"name":"Left Angle Cross of Uncertainty","text":"Living with an open future is the theme of this cross. Gate 8 brings the contribution of individuality and gate 14 the resources that empower a direction. On the Left Angle it unfolds through others: uncertainty becomes creative when it is shared, and your willingness to try something without guarantees can encourage the people around you to do the same."},"Right Angle Cross of Planning":{"angle":"RAC","gates":[9,16,37,40],"name":"Right Angle Cross of Planning","text":"Building something that supports a community over time is what this cross is about. Gates 37 and 40 bring warmth, loyalty and the clear terms of a fair exchange, while 16 and 9 add practised skill and focus on detail. On the Right Angle the plan grows out of your own process: you learn what works by doing it, and the structures you create give others a dependable place to stand."},"Juxtaposition Cross of Focus":{"angle":"JC","gates":[9],"name":"Juxtaposition Cross of Focus","text":"Concentrated attention is the stable resource of this cross. Gate 9 focuses energy on what matters and stays with the details. On the Juxtaposition this holds firm: you can remain with a task long after others drift away, and choosing the right focus is what turns that persistence into real progress."},"Left Angle Cross of Identification":{"angle":"LAC","gates":[9,16],"name":"Left Angle Cross of Identification","text":"Recognising what deserves attention is the gift of this cross. Gate 16 brings skill and enthusiasm, gate 9 the focus on detail. On the Left Angle it unfolds through others: you help people identify their talents and where to put their energy, and their progress becomes part of your own sense of purpose and of what you are here to do."},"Right Angle Cross of The Vessel of Love":{"angle":"RAC","gates":[10,15,25,46],"name":"Right Angle Cross of The Vessel of Love","text":"Love in its many forms is the substance of this cross. Gates 25 and 10 bring unconditional love and acceptance of yourself as you are, while 15 and 46 add love of humanity in all its extremes and love of the body. As a Right Angle theme it is lived personally: the more fully you accept yourself and your own life, the more naturally that love reaches others."},"Juxtaposition Cross of Behaviour":{"angle":"JC","gates":[10],"name":"Juxtaposition Cross of Behaviour","text":"Being yourself is the steady theme of this cross. Gate 10 brings the behaviour of loving yourself as you are. On the Juxtaposition it holds its line: your authenticity stays consistent from one setting to the next, and it quietly shows others that accepting oneself is possible without having to argue for it."},"Left Angle Cross of Prevention":{"angle":"LAC","gates":[10,15],"name":"Left Angle Cross of Prevention","text":"Guarding a healthy way of living together is the thread of this cross. Gate 15 brings acceptance of different rhythms, gate 10 the behaviour of loving yourself as you are. On the Left Angle it unfolds through others: you sense when a group is drifting in an unhealthy direction and can help steer it back before real damage is done."},"Juxtaposition Cross of Ideas":{"angle":"JC","gates":[11],"name":"Juxtaposition Cross of Ideas","text":"A stream of concepts is a constant in this cross. Gate 11 carries ideas waiting to be shared. As a Juxtaposition it keeps its shape: your mind keeps generating possibilities, and their value grows when you offer them as inspiration for others rather than treating each one as a plan you must carry out yourself."},"Left Angle Cross of Education":{"angle":"LAC","gates":[11,12],"name":"Left Angle Cross of Education","text":"Passing on ideas is the core of this cross. Gate 12 brings careful expression and gate 11 a stream of ideas waiting to be shared. On the Left Angle it unfolds through others: you teach, inspire or inform, and what you share matters most when it reaches people who are truly ready to receive it, at a time when the mood allows it."},"Juxtaposition Cross of Articulation":{"angle":"JC","gates":[12],"name":"Juxtaposition Cross of Articulation","text":"Careful, well-timed expression is the steady theme of this cross. Gate 12 speaks only when the mood is right. On the Juxtaposition this does not change from year to year: your words have real impact when they come at the right moment, and silence at the wrong one is not a failure but part of the same skill."},"Juxtaposition Cross of Listening":{"angle":"JC","gates":[13],"name":"Juxtaposition Cross of Listening","text":"Gate 13 is the listener, and here it becomes a fixed way of being in the world. People bring you their stories, and you hold them without needing to act on each one. As a Juxtaposition theme it bends little with circumstance: your steady attention is itself the gift, and it works best when you keep confidences and choose carefully what to pass on."},"Juxtaposition Cross of Empowering":{"angle":"JC","gates":[14],"name":"Juxtaposition Cross of Empowering","text":"Using resources to support a direction is a steady trait of this cross. Gate 14 brings power skills and the energy that empowers. On the Juxtaposition this holds its line: you naturally fuel what you believe in, and your resources flow best into work that genuinely engages you rather than into obligations you have outgrown."},"Juxtaposition Cross of Extremes":{"angle":"JC","gates":[15],"name":"Juxtaposition Cross of Extremes","text":"Living the full range of rhythms is the fixed theme of this cross. Gate 15 accepts the extremes of human behaviour, from long pauses to intense bursts. As a Juxtaposition it holds steady: your own rhythm may swing widely, and accepting that variation in yourself makes you tolerant and generous towards the differences you meet in others."},"Juxtaposition Cross of Experimentation":{"angle":"JC","gates":[16],"name":"Juxtaposition Cross of Experimentation","text":"Trying, repeating and refining is the steady practice of this life. Gate 16 brings enthusiasm and the repetition that turns talent into mastery. On the Juxtaposition that practice holds its line: you learn by experimenting, your skills deepen with each attempt whether it succeeds or not, and steady practice matters more than a single brilliant result."},"Right Angle Cross of Service":{"angle":"RAC","gates":[17,18,52,58],"name":"Right Angle Cross of Service","text":"Improving life for others through clear thinking is the core here. Gates 17 and 18 bring a logical view of the future and the urge to correct what has gone wrong, while 52 and 58 add focused stillness and joy in making things better. As a Right Angle cross it grows through your own process: you refine your own patterns first, and service follows from what you have learned."},"Juxtaposition Cross of Opinions":{"angle":"JC","gates":[17],"name":"Juxtaposition Cross of Opinions","text":"Having a view and stating it clearly is a constant in this life. Gate 17 forms logical opinions about where things are heading. On the Juxtaposition that trait holds steady from one situation to the next: your opinions are recognisable and consistent, and they land best when someone has asked for them and you stay open to evidence that refines them."},"Left Angle Cross of Upheaval":{"angle":"LAC","gates":[17,18],"name":"Left Angle Cross of Upheaval","text":"Questioning established patterns, in a way that shakes things up, defines this cross. Gate 17 brings opinions about the future and gate 18 the drive to correct what is not working. On the Left Angle it unfolds through others: your challenges to the usual order matter most within relationships and groups, where the disturbance you create can open space for something healthier."},"Juxtaposition Cross of Correction":{"angle":"JC","gates":[18],"name":"Juxtaposition Cross of Correction","text":"Spotting what needs fixing is a constant in this design. Gate 18 feels the urge to correct what has gone wrong. As a Juxtaposition it holds steady: you notice flaws others overlook, and your corrections are welcome when they are invited and offered with care for the people involved rather than only for the result."},"Right Angle Cross of The Four Ways":{"angle":"RAC","gates":[19,24,33,44],"name":"Right Angle Cross of The Four Ways","text":"This cross looks for ways forward by reflecting on the past and on the needs of the present. Gates 24 and 44 bring a mind that returns to ideas until they make sense and alertness to patterns from the past, while 19 and 33 add sensitivity to need and the withdrawal needed to remember. As a Right Angle theme it is lived personally: your own reflection shows which paths are worth taking."},"Juxtaposition Cross of Need":{"angle":"JC","gates":[19],"name":"Juxtaposition Cross of Need","text":"Sensitivity to needs is a constant in this cross. Gate 19 feels what others require and what you require yourself. On the Juxtaposition this holds steady: you notice what is missing and want to provide it, and including your own needs in that picture is what keeps the sensitivity balanced rather than exhausting."},"Left Angle Cross of Refinement":{"angle":"LAC","gates":[19,33],"name":"Left Angle Cross of Refinement","text":"Improving how people meet each other's needs is the core of this cross. Gate 33 reflects on the past, gate 19 senses what others need. On the Left Angle it unfolds through others: you help refine relationships and communities, drawing on what experience has shown about what truly nourishes people and what only looks like care."},"Right Angle Cross of The Sleeping Phoenix":{"angle":"RAC","gates":[20,34,55,59],"name":"Right Angle Cross of The Sleeping Phoenix","text":"Renewal is the thread through this cross, the sense that something in life keeps waking up in a new form. Gates 55 and 59 bring abundance through moods and the drive to break through to closeness, while 20 and 34 add presence and raw life force. On the Right Angle the awakening is personal: it happens as you live through your own emotional cycles and let each one teach you something."},"Juxtaposition Cross of The Now":{"angle":"JC","gates":[20],"name":"Juxtaposition Cross of The Now","text":"Presence in the moment is the fixed focus of this cross. Gate 20 expresses awareness here and now, without detours into the past or the future. As a Juxtaposition theme it stays firm: you respond to what is actually happening, and your clarity comes from being fully present rather than from plans made far ahead."},"Left Angle Cross of Duality":{"angle":"LAC","gates":[20,34],"name":"Left Angle Cross of Duality","text":"Two forces, awareness and raw power, meet in this cross. Gate 20 brings presence and gate 34 independent life force. On the Left Angle it unfolds through others: your energy and alertness come alive in partnership, where the right person complements what you bring and the two of you achieve together what neither would manage alone."},"Right Angle Cross of Tension":{"angle":"RAC","gates":[21,38,39,48],"name":"Right Angle Cross of Tension","text":"Productive pressure is the engine of this cross. Gates 21 and 48 bring control of resources and a deep well of knowledge, while 39 and 38 add provocation and the readiness to fight for what is worth it. As a Right Angle theme it is lived through your own process: struggle sharpens you, and over time you learn which tensions are worth holding and which to let go."},"Juxtaposition Cross of Control":{"angle":"JC","gates":[21],"name":"Juxtaposition Cross of Control","text":"Managing your own territory is a fixed feature of this cross. Gate 21 seeks control over resources and over the shape of one's life. As a Juxtaposition theme it stays firm: you work best with clear responsibility for your own area, and the need for control becomes a strength when it is applied to what is truly yours rather than to other people."},"Left Angle Cross of Endeavour":{"angle":"LAC","gates":[21,48],"name":"Left Angle Cross of Endeavour","text":"Effort put into shared undertakings is the core of this cross. Gate 21 brings control of resources and gate 48 a depth of knowledge that needs trust to be used. On the Left Angle it unfolds with others: your best work happens when people give you room to apply what you know, and when you take on real responsibility within a common project."},"Right Angle Cross of Rulership":{"angle":"RAC","gates":[22,26,45,47],"name":"Right Angle Cross of Rulership","text":"Leadership that looks after people and resources is the core of this cross. Gates 45 and 26 bring the gatherer and the persuader, while 22 and 47 add social grace and the ability to make sense of what has happened. On the Right Angle it is lived through your own process: authority comes once you have learned to hold resources well yourself, and others recognise it rather than being told."},"Juxtaposition Cross of Graciousness":{"angle":"JC","gates":[22],"name":"Juxtaposition Cross of Graciousness","text":"Grace in social life is a fixed trait in this design. Gate 22 brings openness and sensitivity to others, tied to mood, and this cross keeps that quality steady over the years. On the Juxtaposition it holds its line: when your mood is right you put people at ease and listen well, and knowing when to step back and be alone is part of the same grace."},"Left Angle Cross of Informing":{"angle":"LAC","gates":[22,47],"name":"Left Angle Cross of Informing","text":"Sharing what you have understood with the people around you is the thread of this cross. Gate 22 brings openness and grace, and gate 47 the effort to sort the past until it makes sense. On the Left Angle it unfolds through encounters: when you pass on what you have realised at the right moment and in the right mood, others gain a clearer view of their own situation."},"Juxtaposition Cross of Assimilation":{"angle":"JC","gates":[23],"name":"Juxtaposition Cross of Assimilation","text":"Translating insight into understandable words is a steady skill in this design. Gate 23 turns what one person has grasped into language others can follow. On the Juxtaposition that skill keeps its shape over time: you simplify the complex and make the strange familiar, and your explanations land best when the listener is ready to hear them."},"Left Angle Cross of Dedication":{"angle":"LAC","gates":[23,43],"name":"Left Angle Cross of Dedication","text":"Devotion to an insight and to getting it across marks this cross. Gate 43 brings sudden breakthroughs of knowing and gate 23 the work of putting them into words. On the Left Angle it unfolds with others: you dedicate yourself to communicating what you see to people who can use it, and patience with how they receive it is part of the task."},"Juxtaposition Cross of Rationalization":{"angle":"JC","gates":[24],"name":"Juxtaposition Cross of Rationalization","text":"Returning to a thought until it makes sense is the steady habit of this mind. Gate 24 circles an idea, turning it over again and again until a clear understanding forms. As a Juxtaposition the habit stays consistent: it can feel repetitive, yet it is also how you reach answers others trust, especially when you give the process time rather than forcing a conclusion."},"Left Angle Cross of Incarnation":{"angle":"LAC","gates":[24,44],"name":"Left Angle Cross of Incarnation","text":"Seeing life in its longer arc is the gift of this cross. Gate 24 rationalises experience until it makes sense, and gate 44 recognises patterns carried over from the past. On the Left Angle it unfolds through encounters: in conversation and in shared life you help others see the larger pattern behind events, and their questions in turn sharpen your own understanding."},"Juxtaposition Cross of Innocence":{"angle":"JC","gates":[25],"name":"Juxtaposition Cross of Innocence","text":"An open, unguarded heart is the fixed quality of this cross. Gate 25 brings the spirit of the self, unconditional love and innocence. As a Juxtaposition theme it stays constant through changing circumstances: you meet life without needing it to earn your trust first, and that steadiness can be quietly reassuring for people who have learned to be guarded."},"Left Angle Cross of Healing":{"angle":"LAC","gates":[25,46],"name":"Left Angle Cross of Healing","text":"Restoring a sense of wholeness, in yourself and in others, is the direction here, in the human sense of support and acceptance rather than treatment. Gate 25 brings unconditional love and gate 46 love of the body and of being in the right place. On the Left Angle it unfolds through encounters: something mends between people, often when you are simply present in the right place."},"Juxtaposition Cross of The Trickster":{"angle":"JC","gates":[26],"name":"Juxtaposition Cross of The Trickster","text":"Persuasion and charm are lasting tools in this design. Gate 26 uses memory and skill to sell an idea. On the Juxtaposition this stays steady: you know how to present things in their best light, and the talent works for everyone involved when what you promote is genuinely worth it and the people you persuade come out ahead."},"Left Angle Cross of Confrontation":{"angle":"LAC","gates":[26,45],"name":"Left Angle Cross of Confrontation","text":"Facing others directly about resources and values is the theme here. Gate 45 brings the gatherer, gate 26 the persuader with memory and skill. On the Left Angle it unfolds through encounters: you challenge people and groups about how things are run, and when done with respect, that confrontation clears the air and improves the common situation."},"Right Angle Cross of The Unexpected":{"angle":"RAC","gates":[27,28,31,41],"name":"Right Angle Cross of The Unexpected","text":"Surprising turns of fortune shape this cross. Gates 27 and 28 bring care for others and the search for what makes life's struggle worthwhile, while 31 and 41 add a voice that leads and the fantasy that starts a new cycle. As a Right Angle theme it is lived through your own process: unplanned events redirect your path, and meeting them with openness rather than resistance is where meaning appears."},"Juxtaposition Cross of Caring":{"angle":"JC","gates":[27],"name":"Juxtaposition Cross of Caring","text":"Looking after others is a reliable part of who you are. Gate 27 nourishes and protects, and in this cross that impulse does not come and go with circumstance. The Juxtaposition keeps it steady: your care is recognisable and dependable, and it stays healthy when you count yourself among those you look after and let others care for you in return."},"Left Angle Cross of Alignment":{"angle":"LAC","gates":[27,28],"name":"Left Angle Cross of Alignment","text":"Finding the right allies and a shared purpose is the theme of this cross. Gate 27 brings care and protection, gate 28 the search for what makes a struggle worthwhile. On the Left Angle it unfolds through others: you thrive when aligned with people whose values match yours, and the commitments you make together are what give the effort its meaning."},"Juxtaposition Cross of Risks":{"angle":"JC","gates":[28],"name":"Juxtaposition Cross of Risks","text":"Taking chances for what matters is the fixed theme of this cross. Gate 28 looks for what makes a struggle worthwhile. As a Juxtaposition it keeps its line: you are willing to take a risk when the purpose feels real, and that willingness gives your life its intensity, provided you weigh what is truly at stake before you leap."},"Juxtaposition Cross of Commitment":{"angle":"JC","gates":[29],"name":"Juxtaposition Cross of Commitment","text":"Saying yes and following through is the fixed theme of this cross. Gate 29 commits and persists until the end. On the Juxtaposition it does not soften with time: your commitments run deep, so choosing what to say yes to matters a great deal, and the right ones carry you into rich and meaningful experience."},"Left Angle Cross of Industry":{"angle":"LAC","gates":[29,30],"name":"Left Angle Cross of Industry","text":"Sustained work driven by real wanting is the signature of this cross. Gate 30 brings the hunger for experience and gate 29 the yes that carries it to the end. On the Left Angle it plays out with others: commitments made in partnership or in a team are where the energy builds, and shared effort turns desire into something that lasts."},"Juxtaposition Cross of Fates":{"angle":"JC","gates":[30],"name":"Juxtaposition Cross of Fates","text":"Some people feel their desires as a current that shapes the course of a life, and this cross makes that feeling a constant. Gate 30 longs for experience and for the feelings it brings, without knowing in advance where they lead. As a Juxtaposition the theme holds steady: you keep feeling your way towards what you want, and over time those choices form a recognisable path rather than a fixed fate."},"Juxtaposition Cross of Influence":{"angle":"JC","gates":[31],"name":"Juxtaposition Cross of Influence","text":"Leading by being recognised is the stable theme of this cross. Gate 31 is a voice that leads once others acknowledge it. On the Juxtaposition this holds firm: your influence works when people invite it rather than when you claim it, and you serve best by speaking for what the group needs instead of for your own agenda."},"Left Angle Cross of The Alpha":{"angle":"LAC","gates":[31,41],"name":"Left Angle Cross of The Alpha","text":"Leadership that opens new chapters of experience is the thread of this cross. Gate 31 brings recognised influence, gate 41 the fantasy that starts a new cycle. On the Left Angle it unfolds with others: you lead by inspiring a vision people want to follow, and the group shapes that vision as much as you do, which is what keeps it alive."},"Right Angle Cross of The Maya":{"angle":"RAC","gates":[32,42,61,62],"name":"Right Angle Cross of The Maya","text":"The world of form, made of facts and patterns that build everyday reality, is the field of this cross. Gates 42 and 32 bring the completion of cycles and an instinct for what will last, while 61 and 62 add the pressure to grasp inner truth and the precise naming of facts. As a Right Angle theme it is lived through your own process: by learning how the structures of life work for you, you become able to explain them to others."},"Juxtaposition Cross of Conservation":{"angle":"JC","gates":[32],"name":"Juxtaposition Cross of Conservation","text":"Keeping what works and letting it grow is the fixed concern of this cross. Gate 32 senses what will last, and gate 42 completes cycles so they can bear fruit. As a Juxtaposition theme it holds its course over the years: you are the one who protects what has proven itself, and that steadiness lets change happen without losing what was worth keeping."},"Left Angle Cross of Limitation":{"angle":"LAC","gates":[32,42],"name":"Left Angle Cross of Limitation","text":"Growth that respects what will endure is the theme of this cross. Gate 42 brings the completion of cycles and gate 32 an instinct for continuity. On the Left Angle it unfolds with others: you help groups recognise which of their projects can last and which have run their course, so that shared effort goes where it can truly bear fruit."},"Juxtaposition Cross of Retreat":{"angle":"JC","gates":[33],"name":"Juxtaposition Cross of Retreat","text":"Stepping back to reflect is a steady need in this design. Gate 33 withdraws in order to remember and make sense of what happened. As a Juxtaposition it keeps its line: your retreats are not avoidance but preparation, and what you bring back from them gives your stories and advice their depth and their honesty."},"Juxtaposition Cross of Power":{"angle":"JC","gates":[34],"name":"Juxtaposition Cross of Power","text":"Pure, independent life force is the constant here. Gate 34 carries strength that works best on its own terms. As a Juxtaposition it keeps steady: your power is visible and consistent, and it achieves most when you respond to what truly engages you instead of trying to push everything forward at once."},"Juxtaposition Cross of Experience":{"angle":"JC","gates":[35],"name":"Juxtaposition Cross of Experience","text":"Hunger for the new is a constant in this life. Gate 35 seeks change and fresh experience, and here that appetite does not fade with age or setting. As a Juxtaposition it stays steady: you are drawn to try things, and wisdom comes from reflecting on what each experience taught you rather than from collecting experiences for their own sake."},"Juxtaposition Cross of Crisis":{"angle":"JC","gates":[36],"name":"Juxtaposition Cross of Crisis","text":"Emotional intensity, and the growth it brings, is a lasting feature of this cross. Gate 36 grows through inexperience, by entering situations it does not yet know. On the Juxtaposition the pattern stays put: hard moments come and pass, and each one leaves you more capable, especially when you give feelings time before acting on them."},"Juxtaposition Cross of Bargains":{"angle":"JC","gates":[37],"name":"Juxtaposition Cross of Bargains","text":"Fair exchange is the fixed ground of this cross. Gate 37 brings friendship, warmth and the bonds that hold a family or group together, and those bonds rest on agreements both sides honour. As a Juxtaposition the theme does not waver: you keep your side of a deal and expect the same in return, and that reliability is what makes people trust you."},"Left Angle Cross of Migration":{"angle":"LAC","gates":[37,40],"name":"Left Angle Cross of Migration","text":"Movement between communities shapes this cross, the urge to find or build a place where people belong. Gates 37 and 40 bring warmth and loyalty on one side and the need to rest after giving on the other. On the Left Angle the theme unfolds with others: you may move between groups, and each move teaches what a healthy exchange between a person and a community looks like."},"Juxtaposition Cross of Opposition":{"angle":"JC","gates":[38],"name":"Juxtaposition Cross of Opposition","text":"Standing against what feels wrong is a steady trait of this cross. Gate 38 fights for what is worth it. On the Juxtaposition this keeps its line: resistance gives you strength and clarity, and it is most meaningful when you choose battles that truly reflect your values rather than fighting out of habit."},"Left Angle Cross of Individualism":{"angle":"LAC","gates":[38,39],"name":"Left Angle Cross of Individualism","text":"Standing as an individual among others is the core here. Gate 39 provokes and gate 38 fights for what is worth it. On the Left Angle it unfolds through encounters: you hold your own position within groups, and your stubborn independence can give others the strength to find and defend their own position too."},"Juxtaposition Cross of Provocation":{"angle":"JC","gates":[39],"name":"Juxtaposition Cross of Provocation","text":"Stirring things up is a steady trait of this cross. Gate 39 provokes others into finding their own spirit. On the Juxtaposition it keeps its line: you naturally test people's moods and resolve, and the provocation is useful when it aims at waking something alive in them rather than starting a conflict for its own sake."},"Juxtaposition Cross of Denial":{"angle":"JC","gates":[40],"name":"Juxtaposition Cross of Denial","text":"Knowing when to say no is a lasting strength in this design. Gate 40 needs rest and solitude after giving. On the Juxtaposition this holds firm: you protect your energy and your time alone, and refusing what does not serve you keeps your contribution sustainable instead of draining you to the point of resentment."},"Juxtaposition Cross of Fantasy":{"angle":"JC","gates":[41],"name":"Juxtaposition Cross of Fantasy","text":"Imagination as a starting point is a recurring feature of this design. Gate 41 brings the fantasy that begins a new cycle of experience. As a Juxtaposition it keeps its line: you dream up possibilities easily, and letting those dreams lead into real experience rather than replace it is what keeps them alive and useful."},"Juxtaposition Cross of Completion":{"angle":"JC","gates":[42],"name":"Juxtaposition Cross of Completion","text":"Finishing what has been started is the stable theme here. Gate 42 brings growth by completing a cycle so that it can bear fruit. As a Juxtaposition this stays consistent across the years: you are at your best seeing things through to their natural end, which makes the choice of what to begin in the first place matter more than for most people."},"Juxtaposition Cross of Insight":{"angle":"JC","gates":[43],"name":"Juxtaposition Cross of Insight","text":"Sudden knowing is a recurring feature of this life. Gate 43 brings breakthroughs of inner understanding that arrive without warning. As a Juxtaposition it stays firm: insights keep coming in their own way, and they serve best when you wait for the right moment and the right listener before sharing them."},"Juxtaposition Cross of Alertness":{"angle":"JC","gates":[44],"name":"Juxtaposition Cross of Alertness","text":"Recognising patterns is a lasting skill in this design. Gate 44 notices what has worked and what has failed before. On the Juxtaposition this stays steady: you sense people's potential and the risks around them early, and this alertness is most valuable when it is used to bring the right people together for the right task."},"Juxtaposition Cross of Possession":{"angle":"JC","gates":[45],"name":"Juxtaposition Cross of Possession","text":"Gathering resources and people is a stable trait of this cross. Gate 45 is the gatherer who brings people and means together. On the Juxtaposition this holds firm across situations: you naturally take responsibility for what you hold, and it works well when what you gather is shared and put to use for the good of the whole group."},"Juxtaposition Cross of Serendipity":{"angle":"JC","gates":[46],"name":"Juxtaposition Cross of Serendipity","text":"Being in the right place at the right time is the recurring pattern of this cross. Gate 46 brings love of the body and of being where you belong. On the Juxtaposition this stays firm: good fortune often arrives through simple presence, and trusting your body's sense of place lets these fortunate meetings happen without being chased."},"Juxtaposition Cross of Oppression":{"angle":"JC","gates":[47],"name":"Juxtaposition Cross of Oppression","text":"Mental pressure to understand is a steady feature of this cross. Gate 47 sorts through the past until it makes sense. On the Juxtaposition this keeps its shape: you may feel weighed down by experiences that have not yet resolved, and the realisation tends to arrive once you stop pushing and let it come in its own time."},"Juxtaposition Cross of Depth":{"angle":"JC","gates":[48],"name":"Juxtaposition Cross of Depth","text":"Deep knowledge is the stable resource of this cross. Gate 48 is a well of knowledge that needs trust to be used. On the Juxtaposition it keeps its line: you carry more than you think you do, and that depth shows itself when you trust it enough to act rather than waiting until you feel completely prepared."},"Juxtaposition Cross of Principles":{"angle":"JC","gates":[49],"name":"Juxtaposition Cross of Principles","text":"Values sit at the centre of this life, and they do not easily move. Gate 49 holds the principles that decide what to accept and what to reject when an agreement no longer serves. On the Juxtaposition this is a steady line: you are recognisable by what you will and will not stand for, and that consistency gives others something reliable to measure against."},"Juxtaposition Cross of Values":{"angle":"JC","gates":[50],"name":"Juxtaposition Cross of Values","text":"Upholding the rules that keep people safe is a constant in this life. Gate 50 guards the values that keep a group healthy. On the Juxtaposition this holds firm: you keep to your standards over time and across settings, and that steadiness gives the people around you a reliable sense of what is fair and right."},"Right Angle Cross of Penetration":{"angle":"RAC","gates":[51,53,54,57],"name":"Right Angle Cross of Penetration","text":"Breaking through to something new runs through this cross. Gates 51 and 57 bring the courage to be first and intuitive clarity in the moment, while 53 and 54 add the pressure to begin and the drive to rise. As a Right Angle theme it is lived personally: you meet shocks and openings in your own life, and each breakthrough becomes proof to others that it can be done."},"Juxtaposition Cross of Shock":{"angle":"JC","gates":[51],"name":"Juxtaposition Cross of Shock","text":"Surprise is a steady presence in this life, both given and received. Gate 51 brings the courage to be first and to wake others up. On the Juxtaposition the theme holds its ground: unexpected events seem to find you, and your capacity to stay upright through them, recover and keep going is what others notice and learn from over time."},"Left Angle Cross of The Clarion":{"angle":"LAC","gates":[51,57],"name":"Left Angle Cross of The Clarion","text":"A wake-up call is what this cross carries into the lives of others. Gate 51 brings the courage to be first and to jolt people out of routine, and gate 57 intuitive clarity about what is right in the moment. On the Left Angle it unfolds through encounters: your timing and your voice can rouse a group to act, and the call works best when it is heard rather than imposed."},"Juxtaposition Cross of Stillness":{"angle":"JC","gates":[52],"name":"Juxtaposition Cross of Stillness","text":"Holding still is the strength at the centre of this cross. Gate 52 brings the concentration that comes from staying calm and unmoved. As a Juxtaposition it stays firm: you can wait and focus where others feel driven to act, and from that stillness the right moment to move becomes clear without needing to be forced."},"Left Angle Cross of Demands":{"angle":"LAC","gates":[52,58],"name":"Left Angle Cross of Demands","text":"Expecting more from life, and helping others to expect more, is the theme here. Gate 52 brings focused stillness, gate 58 joy in making life better. On the Left Angle it unfolds with others: your standards push groups towards improvement, and they are heard best when they come with enthusiasm for what could be rather than criticism of what is."},"Juxtaposition Cross of Beginnings":{"angle":"JC","gates":[53],"name":"Juxtaposition Cross of Beginnings","text":"Starting new things is the constant in this design. Gate 53 brings the pressure to begin, and here that pressure is a lifelong companion rather than a passing phase. On the Juxtaposition it holds steady: new projects keep calling you, and it pays to choose carefully which ones to start and to start them with people who can help carry them further."},"Left Angle Cross of Cycles":{"angle":"LAC","gates":[53,54],"name":"Left Angle Cross of Cycles","text":"Life moving in phases is the theme of this cross. Gate 53 brings the pressure to begin, gate 54 the drive to rise. On the Left Angle it unfolds through others: you go through cycles of start, growth and closure alongside people, and each shared cycle teaches you how to begin the next one with more maturity and less haste."},"Juxtaposition Cross of Ambition":{"angle":"JC","gates":[54],"name":"Juxtaposition Cross of Ambition","text":"The drive to rise is a constant in this life. Gate 54 seeks to transform circumstances and move upward. As a Juxtaposition it holds steady: your ambition is persistent, and it achieves most when it is seen and supported by people who can help it grow, rather than when it is pursued in isolation."},"Juxtaposition Cross of Moods":{"angle":"JC","gates":[55],"name":"Juxtaposition Cross of Moods","text":"Here the emotional weather itself is the steady theme. Gate 55 feels abundance through the full range of moods, high and low, and this cross lives that range consistently. As a Juxtaposition it keeps its shape: the task is not to fix the mood but to let it pass, and to notice that the spirit behind it remains intact whatever the day brings."},"Left Angle Cross of Spirit":{"angle":"LAC","gates":[55,59],"name":"Left Angle Cross of Spirit","text":"Feeling shared with others is the life theme here. Gate 55 brings moods that carry a sense of spirit, and gate 59 the drive to break through barriers to intimacy. As a Left Angle cross it unfolds in encounters: closeness with others is where your emotional depth becomes meaningful, and the right relationships can lift a whole circle out of its usual tone."},"Juxtaposition Cross of Stimulation":{"angle":"JC","gates":[56],"name":"Juxtaposition Cross of Stimulation","text":"Telling stories that move people is a steady talent here. Gate 56 stimulates through narrative, turning experience into something others want to hear. On the Juxtaposition this keeps its shape: your way of describing the world awakens interest and feeling in others, and it is at its best when the story stays faithful to a real experience."},"Left Angle Cross of Distraction":{"angle":"LAC","gates":[56,60],"name":"Left Angle Cross of Distraction","text":"Drawing attention and redirecting it is the core of this cross. Gate 56 tells stirring stories and gate 60 works creatively within limits. On the Left Angle it unfolds through encounters: you can pull people away from routine thinking towards something larger, and the stories you tell show them that limits they take for granted can be worked with in new ways."},"Juxtaposition Cross of Intuition":{"angle":"JC","gates":[57],"name":"Juxtaposition Cross of Intuition","text":"Listening to inner clarity in the moment is the steady theme of this life. Gate 57 hears what is right in the moment it matters. As a Juxtaposition it holds firm: your intuition speaks quietly and often only once, and trusting that first impression consistently is what makes it a reliable guide over the years."},"Juxtaposition Cross of Vitality":{"angle":"JC","gates":[58],"name":"Juxtaposition Cross of Vitality","text":"Joy in improving life is a lasting quality of this design. Gate 58 brings vitality and the wish to make things better. As a Juxtaposition it stays firm: your enthusiasm lifts the people around you, and it stays fresh when it is directed at real improvement rather than at a constant search for what is wrong."},"Juxtaposition Cross of Strategy":{"angle":"JC","gates":[59],"name":"Juxtaposition Cross of Strategy","text":"Finding a way through to closeness is a constant in this cross. Gate 59 breaks through the barriers that keep people apart. As a Juxtaposition it stays steady: you know how to approach people and build connection, and that approach works best when it grows from genuine interest in the other person rather than from calculation."},"Juxtaposition Cross of Limitation":{"angle":"JC","gates":[60],"name":"Juxtaposition Cross of Limitation","text":"Working within limits is the steady theme of this cross. Gate 60 accepts boundaries and works creatively inside them. On the Juxtaposition this stays firm: constraints do not stop you, and they often become the very frame within which your most original and lasting work takes shape."},"Juxtaposition Cross of Thinking":{"angle":"JC","gates":[61],"name":"Juxtaposition Cross of Thinking","text":"Pondering what cannot easily be known is the steady theme of this cross. Gate 61 feels the pressure to grasp inner truth. As a Juxtaposition it holds firm: your mind keeps returning to large questions, and the insight that eventually comes is often worth the time you give it, as long as the pressure is not mistaken for a demand to answer now."},"Left Angle Cross of Obscuration":{"angle":"LAC","gates":[61,62],"name":"Left Angle Cross of Obscuration","text":"This cross works with what is hidden in detail and in what cannot yet be known. Gate 62 brings the precise naming of facts, gate 61 the pressure to grasp inner truth. On the Left Angle it unfolds through others: you can clarify what others find confusing, or name a question they have avoided, and the way you share it decides whether it frees people or holds them back."},"Juxtaposition Cross of Detail":{"angle":"JC","gates":[62],"name":"Juxtaposition Cross of Detail","text":"Precision is the steady quality of this cross. Gate 62 names facts precisely and notices what is easy to overlook. As a Juxtaposition it stays firm: you see and articulate details others miss, and this attention becomes truly valuable when it serves a clear purpose rather than getting lost in the small things for their own sake."},"Juxtaposition Cross of Doubts":{"angle":"JC","gates":[63],"name":"Juxtaposition Cross of Doubts","text":"Questioning is a constant companion in this life. Gate 63 doubts in order to reach logical proof, and on the Juxtaposition that habit stays firm whatever the setting. Your steady scepticism can test ideas, plans and patterns until only what is sound remains, as long as the doubt is aimed outward at what can be checked rather than turned against yourself."},"Left Angle Cross of Dominion":{"angle":"LAC","gates":[63,64],"name":"Left Angle Cross of Dominion","text":"Influence over how others think is the theme of this cross. Gates 63 and 64 bring the pressure of doubt and the mental pictures of the past that ask to be put in order. As a Left Angle theme it unfolds through others: when your questions and conclusions meet a receptive audience, they can shape the way a whole group frames a problem, and that power asks for care."},"Juxtaposition Cross of Confusion":{"angle":"JC","gates":[64],"name":"Juxtaposition Cross of Confusion","text":"Living with unresolved images is a recurring state in this life. Gate 64 holds pictures of the past that wait to make sense. As a Juxtaposition the pattern stays put: confusion is a regular phase of your thinking, not a flaw, and it clears on its own when you let impressions settle rather than forcing a conclusion too early."}}},"_footer":"Powered by astroway.api - get your own key at https://api.astroway.info"}}}},"400":{"description":"Invalid sign or date","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_SIGN","message":"sign must be one of the 12 zodiac signs"}}}}}},"security":[]}},"/public/moon-phase":{"get":{"tags":["Public"],"summary":"Moon Phase (public, no key)","description":"Geocentric moon phase for a date (computed at noon UTC): deterministic, no AI, no birth data. `_footer` watermark. The English `phaseName`, `moonSign` and `sunSign` are the stable identifiers to match on and never change; `phaseKey` is the eight-phase key (new, crescent, firstQuarter, gibbous, full, disseminating, lastQuarter, balsamic). `moonDegree` is the degree inside `moonSign`, `distanceKm` the Earth-Moon distance, and `next` the UTC moments of the next four principal phases after noon UTC of `date`. `tithi` is the Vedic lunar day (1-30, 12 degrees of elongation each, geocentric), `voidOfCourse` the void-of-course spans that touch the UTC day (start, end, the sign the Moon enters). The moonrise-counted lunar day depends on the place and is not given. `meaning` and `keywords` are English; `localized` carries them with the phase and sign names in the requested language (a language whose translation has not arrived yet gets the English text).","parameters":[{"name":"date","in":"query","required":false,"description":"Calendar date `YYYY-MM-DD` (UTC). Defaults to today.","schema":{"type":"string","format":"date"}},{"name":"lang","in":"query","required":false,"description":"Language for this call, overriding `Accept-Language`. The canonical per-call form: a page that renders in one language passes it here rather than reconfiguring its client. Unknown or inactive codes fall back to `uk`.","schema":{"type":"string","example":"en"}},{"name":"Accept-Language","in":"header","required":false,"description":"BCP-47 language (e.g. `uk`, `en`, `de`). Set it once on your HTTP client as its default; for a single call, `?lang=` overrides it. Unknown or inactive codes fall back to `uk`.","schema":{"type":"string"}},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"x-quality":"green","x-codeSamples":[{"lang":"cURL","source":"curl 'https://api.astroway.info/v1/public/moon-phase'"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"date":{"type":"string","nullable":true},"phase":{"type":"number","nullable":true},"phaseName":{"type":"string","nullable":true},"phaseKey":{"type":"string","nullable":true},"majorPhase":{"type":"string","nullable":true},"illuminationPercent":{"type":"number","nullable":true},"elongationDeg":{"type":"number","nullable":true},"ageDays":{"type":"number","nullable":true},"waxing":{"type":"boolean","nullable":true},"moonSign":{"type":"string","nullable":true},"sunSign":{"type":"string","nullable":true},"moonLongitude":{"type":"number","nullable":true},"moonDegree":{"type":"number","nullable":true},"distanceKm":{"type":"number","nullable":true},"tithi":{"type":"object","properties":{"number":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"paksha":{"type":"string","nullable":true},"indexInPaksha":{"type":"number","nullable":true},"elongation":{"type":"number","nullable":true},"percentComplete":{"type":"number","nullable":true}},"nullable":true},"voidOfCourse":{"type":"array","items":{},"nullable":true},"next":{"type":"object","properties":{"newMoon":{"type":"string","nullable":true},"firstQuarter":{"type":"string","nullable":true},"fullMoon":{"type":"string","nullable":true},"lastQuarter":{"type":"string","nullable":true}},"nullable":true},"meaning":{"type":"string","nullable":true},"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"localized":{"type":"object","properties":{"phaseName":{"type":"string","nullable":true},"moonSign":{"type":"string","nullable":true},"sunSign":{"type":"string","nullable":true},"meaning":{"type":"string","nullable":true},"keywords":{"type":"array","items":{"type":"string","nullable":true},"nullable":true}},"nullable":true}}},"_footer":{"type":"string","description":"Free-tier watermark, present on every public response. Keys on a paid plan do not receive it.","example":"Powered by astroway.api - get your own key at https://api.astroway.info"}}},"example":{"ok":true,"data":{"date":"2026-10-06","phase":0.19061,"phaseName":"Waning Crescent","phaseKey":"balsamic","majorPhase":"between","illuminationPercent":19.06,"elongationDeg":308.2271,"ageDays":25.284,"waxing":false,"moonSign":"Leo","sunSign":"Libra","moonLongitude":141.4802,"moonDegree":21.4802,"distanceKm":374721,"tithi":{"number":26,"name":"Ekadashi","paksha":"krishna","indexInPaksha":11,"elongation":308.227,"percentComplete":0.686},"voidOfCourse":[],"next":{"newMoon":"2026-10-10T15:50:05Z","firstQuarter":"2026-10-18T16:12:41Z","fullMoon":"2026-10-26T04:11:49Z","lastQuarter":"2026-11-01T20:28:27Z"},"meaning":"The close of the cycle: rest, cleansing and preparing for the new.","keywords":["rest","cleansing","intuition","completion"],"localized":{"phaseName":"Спадний серп","moonSign":"Лев","sunSign":"Терези","meaning":"Завершення циклу: відпочинок, очищення й підготовка до нового.","keywords":["відпочинок","очищення","інтуїція","завершення"]}},"_footer":"Powered by astroway.api - get your own key at https://api.astroway.info"}}}},"400":{"description":"Invalid sign or date","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_SIGN","message":"sign must be one of the 12 zodiac signs"}}}}}},"security":[]}},"/public/planet-of-day":{"get":{"tags":["Public"],"summary":"Planet of the Day (public, no key)","description":"Traditional (Chaldean) planetary ruler of the weekday: Sun=Sunday, Moon=Monday, …, Saturn=Saturday. Deterministic, no AI. `_footer` watermark. `localized` carries `planet` and `weekday` in the requested language; `themes` is an open set and stays English.","parameters":[{"name":"date","in":"query","required":false,"description":"Calendar date `YYYY-MM-DD` (UTC). Defaults to today.","schema":{"type":"string","format":"date"}},{"name":"lang","in":"query","required":false,"description":"Language for this call, overriding `Accept-Language`. The canonical per-call form: a page that renders in one language passes it here rather than reconfiguring its client. Unknown or inactive codes fall back to `uk`.","schema":{"type":"string","example":"en"}},{"name":"Accept-Language","in":"header","required":false,"description":"BCP-47 language (e.g. `uk`, `en`, `de`). Set it once on your HTTP client as its default; for a single call, `?lang=` overrides it. Unknown or inactive codes fall back to `uk`.","schema":{"type":"string"}},{"$ref":"#/components/parameters/ResponseFields"},{"$ref":"#/components/parameters/ResponsePrecision"}],"x-quality":"green","x-codeSamples":[{"lang":"cURL","source":"curl 'https://api.astroway.info/v1/public/planet-of-day'"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"data":{"type":"object","properties":{"date":{"type":"string","nullable":true},"weekday":{"type":"string","nullable":true},"planet":{"type":"string","nullable":true},"glyph":{"type":"string","nullable":true},"themes":{"type":"array","items":{"type":"string","nullable":true},"nullable":true},"localized":{"type":"object","properties":{"planet":{"type":"string","nullable":true},"weekday":{"type":"string","nullable":true}},"nullable":true}}},"_footer":{"type":"string","description":"Free-tier watermark, present on every public response. Keys on a paid plan do not receive it.","example":"Powered by astroway.api - get your own key at https://api.astroway.info"}}},"example":{"ok":true,"data":{"date":"2026-08-21","weekday":"Friday","planet":"Venus","glyph":"♀","themes":["love","beauty","harmony","money"],"localized":{"planet":"Венера","weekday":"П’ятниця"}},"_footer":"Powered by astroway.api - get your own key at https://api.astroway.info"}}}},"400":{"description":"Invalid sign or date","content":{"application/json":{"example":{"ok":false,"error":{"code":"INVALID_SIGN","message":"sign must be one of the 12 zodiac signs"}}}}}},"security":[]}}},"tags":[{"name":"Core","description":"⭐ Core endpoints"},{"name":"Comparisons","description":"🤝 Comparisons endpoints"},{"name":"Prognostics","description":"🕐 Prognostics endpoints"},{"name":"Specialized Charts","description":"🧭 Specialized Charts endpoints"},{"name":"Visualization","description":"🖼️ Visualization endpoints"},{"name":"Chinese: Zodiac & Feng Shui","description":"🐉 Chinese: Zodiac & Feng Shui endpoints"},{"name":"Vastu Shastra","description":"🏠 Vastu Shastra endpoints"},{"name":"Mayan Calendars","description":"🌽 Mayan Calendars endpoints"},{"name":"Wellness","description":"🌿 Wellness endpoints. ⚠️ All wellness endpoints are educational/informational only. Consult a licensed health professional for medical concerns."},{"name":"Pet Astrology","description":"🐾 Pet Astrology endpoints. ⚠️ Pet astrology is entertainment-only: no canonical sources. Not a substitute for veterinary care."},{"name":"Business Astrology","description":"💼 Business Astrology endpoints. ⚠️ Strategic ideation only: not legal, tax, or investment advice."},{"name":"Financial Astrology","description":"💰 Financial Astrology endpoints. ⚠️ ⚠️ NOT INVESTMENT ADVICE. Entertainment / heuristic only. Consult a licensed financial advisor before any trading decision."},{"name":"BaZi (Four Pillars)","description":"🀄 BaZi (Four Pillars) endpoints"},{"name":"Zi Wei Dou Shu (Purple Star)","description":"⭐ Zi Wei Dou Shu (Purple Star) endpoints"},{"name":"Aspects & Points","description":"🎯 Aspects & Points endpoints"},{"name":"Calendar & Cycles","description":"📅 Calendar & Cycles endpoints"},{"name":"Dignities & Receptions","description":"👑 Dignities & Receptions endpoints"},{"name":"Horary","description":"❓ Horary endpoints"},{"name":"Human Design","description":"🧬 Human Design endpoints. ⚠️ AstroWay /api computes the BodyGraph mathematically and does not redistribute Jovian Archive's copyrighted interpretation content. End-user-facing readings should reference Jovian Archive trademarks where appropriate."},{"name":"Astro-Geography","description":"🌍 Astro-Geography endpoints"},{"name":"Vedic","description":"🕉️ Vedic endpoints"},{"name":"Kabbalah","description":"🕎 Kabbalah endpoints. ⚠️ The Latin transliterations of the angel names, their el/yah suffixes and any birth-angel attribution are deliberately absent: no source states them as a table with provenance."},{"name":"Esoteric","description":"🔮 Esoteric endpoints"},{"name":"Horoscope","description":"🔮 Horoscope endpoints"},{"name":"AI Interpretations","description":"🧠 AI Interpretations endpoints"},{"name":"Reference","description":"📖 Reference endpoints"},{"name":"Esoteric","description":"🔮 Esoteric endpoints. ⚠️ Cultural and spiritual associations only. Not medical, financial, or psychological advice."},{"name":"Numerology: Pythagorean","description":"🔢 Numerology: Pythagorean endpoints"},{"name":"Numerology: Chaldean","description":"🔢 Numerology: Chaldean endpoints"},{"name":"Numerology: Kabbalistic (phonetic)","description":"🔢 Numerology: Kabbalistic (phonetic) endpoints"},{"name":"Numerology: Kabbalistic (Mathers strict)","description":"🔢 Numerology: Kabbalistic (Mathers strict) endpoints"},{"name":"Numerology: Vedic","description":"🔢 Numerology: Vedic endpoints"},{"name":"Tarot: Rider-Waite-Smith","description":"🃏 Tarot: Rider-Waite-Smith endpoints"},{"name":"Tarot: Marseille","description":"🃏 Tarot: Marseille endpoints"},{"name":"Tarot: Lenormand","description":"🃏 Tarot: Lenormand endpoints"},{"name":"Destiny Matrix","description":"🪐 Destiny Matrix endpoints. ⚠️ Single-author method (Natalia Ladini, CIS market). Not historically attested in classical traditions."},{"name":"System","description":"⚙️ System endpoints"},{"name":"White-label","description":"🎨 White-label endpoints"},{"name":"Reports","description":"📄 Reports endpoints"},{"name":"AI Reports","description":"🤖 AI Reports endpoints"},{"name":"Webhooks","description":"🪝 Webhooks endpoints"},{"name":"AI & MCP","description":"🤖 AI & MCP endpoints"},{"name":"Family Astrology","description":"👨‍👩‍👧 Family Astrology endpoints"},{"name":"Hellenistic: Brennan tradition","description":"🏛️ Hellenistic: Brennan tradition endpoints"},{"name":"Hellenistic: Hand tradition","description":"🏛️ Hellenistic: Hand tradition endpoints"},{"name":"Hellenistic: Greenbaum tradition","description":"🏛️ Hellenistic: Greenbaum tradition endpoints"},{"name":"Hellenistic: Schmidt tradition","description":"🏛️ Hellenistic: Schmidt tradition endpoints"},{"name":"Modern Psychological","description":"🧠 Modern Psychological endpoints"},{"name":"Evolutionary Astrology","description":"♇ Evolutionary Astrology endpoints"},{"name":"Cosmobiology / Hamburg School","description":"🎯 Cosmobiology / Hamburg School endpoints"},{"name":"Real-time Streaming","description":"📡 Real-time Streaming endpoints"},{"name":"Embeddable Widgets","description":"🖼️ Embeddable Widgets endpoints"},{"name":"MCP Advanced","description":"🔌 MCP Advanced endpoints"},{"name":"Agent Platform","description":"🤖 Agent Platform endpoints"},{"name":"Geomancy (Agrippa)","description":"🔮 Geomancy (Agrippa) endpoints"},{"name":"Elder Futhark Runes","description":"ᚠ Elder Futhark Runes endpoints"},{"name":"Palmistry (Cheiro)","description":"✋ Palmistry (Cheiro) endpoints"},{"name":"I Ching (Standalone)","description":"☯️ I Ching (Standalone) endpoints"},{"name":"Zodiac Signs (Per-Sign Deep)","description":"♈ Zodiac Signs (Per-Sign Deep) endpoints"},{"name":"Content Localization","description":"🌐 Content Localization endpoints"},{"name":"System","description":"System endpoints"},{"name":"Public","description":"Public, no-auth read endpoints (IP-rate-limited 30/hr). Every response carries a free-tier `_footer` watermark, and no API key is required."}]}