export type ClientOptions = { baseUrl: 'https://roxyapi.com/api/v2' | (string & {}); }; export type NatalChartResponse = { /** * Birth details echoed back from the request. Confirms the input used for this chart calculation. */ birthDetails: { /** * Birth date used for this chart (YYYY-MM-DD). */ date: string; /** * Birth time used for this chart (HH:MM:SS, 24-hour). */ time: string; /** * Birth latitude in decimal degrees. */ latitude: number; /** * Birth longitude in decimal degrees. */ longitude: number; /** * Timezone offset from UTC in decimal hours. */ timezone: number; }; /** * All 14 celestial bodies (10 classical planets, lunar nodes, Chiron, Black Moon Lilith) with zodiac signs, house placements, and interpretations. */ planets: Array<{ /** * Planet or point name (Sun, Moon, Mercury, Venus, Mars, Jupiter, Saturn, Uranus, Neptune, Pluto, North Node, South Node, Chiron, Black Moon Lilith). Always English, whatever the lang parameter says, so it stays safe to compare against in code. Use nameLocalized for anything a reader sees. The lunar nodes follow the request nodeType, which defaults to the true (osculating) node; pass "mean" for the smoothed node. The two differ by up to about 1.8 degrees and no other body is affected. */ name: string; /** * Planet or point name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ nameLocalized?: string; /** * Apparent geocentric tropical longitude on the true ecliptic of date, in degrees (0-360): light time and aberration applied, nutation included, the convention desktop chart software and the NASA JPL Horizons observer tables print, so it compares directly with either. */ longitude: number; /** * Apparent geocentric ecliptic latitude of date, in degrees. */ latitude: number; /** * Tropical zodiac sign this planet occupies. Always English, whatever the lang parameter says, so it stays safe to compare against in code. Use signLocalized for anything a reader sees. */ sign: string; /** * Zodiac sign name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ signLocalized?: string; /** * Degree within the zodiac sign (0-29.999). */ degree: number; /** * House placement (1-12) based on the selected house system. */ house: number; /** * Daily motion in degrees per day. Negative values indicate retrograde. */ speed: number; /** * Whether the planet is in retrograde motion. */ isRetrograde: boolean; /** * Essential dignity of this body in the sign it occupies: domicile (the sign it rules, its strongest placement), exaltation (honoured and amplified), detriment (opposite its rulership, where it struggles), fall (opposite its exaltation, where it is weakened), or peregrine (in none of its own dignity signs). Absent for the lunar nodes, Chiron and Black Moon Lilith, which rule no sign and therefore hold no dignity at all, so an absent field and peregrine are different answers. Derived by sign only, so triplicity, bounds and face are not considered. Always English, whatever the lang parameter says, so it stays safe to compare against in code. The four dignity signs behind it are published per body by GET /planet-meanings/{id}. */ dignity?: 'domicile' | 'exaltation' | 'detriment' | 'fall' | 'peregrine'; /** * Planet-in-sign-in-house interpretation. Narrative analysis of what this placement means in the natal chart. */ interpretation?: { /** * One-sentence interpretation of this planet in its sign and house placement. */ summary: string; /** * Multi-sentence detailed interpretation with personality insights. */ detailed: string; /** * Key personality traits and themes for this placement. */ keywords: Array; }; }>; /** * All 12 house cusps with zodiac positions. House cusps divide the chart into life areas. */ houses: Array<{ /** * House number (1-12). */ number: number; /** * Ecliptic longitude of this house cusp (0-360). */ longitude: number; /** * Zodiac sign on this house cusp. Always English, whatever the lang parameter says. Use signLocalized for anything a reader sees. */ sign: string; /** * Zodiac sign name on this cusp in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ signLocalized?: string; /** * Degree within the zodiac sign (0-29.999). */ degree: number; }>; /** * House system used for this chart (placidus, whole-sign, equal, or koch). */ houseSystem: string; /** * All planetary aspects found in this chart with orbs, strength, and interpretation. */ aspects: Array<{ /** * First planet in the aspect pair. Always English, whatever the lang parameter says. Use planet1Localized for anything a reader sees. */ planet1: string; /** * First planet name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ planet1Localized?: string; /** * Second planet in the aspect pair. Always English, whatever the lang parameter says. Use planet2Localized for anything a reader sees. */ planet2: string; /** * Second planet name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ planet2Localized?: string; /** * Aspect type (CONJUNCTION, OPPOSITION, TRINE, SQUARE, SEXTILE, etc.). Always English, whatever the lang parameter says. Use typeLocalized for anything a reader sees. */ type: string; /** * Aspect type name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ typeLocalized?: string; /** * Exact angle of this aspect type in degrees. */ angle: number; /** * Distance from exact aspect in degrees. Tighter orb means stronger influence. */ orb: number; /** * Whether the aspect is applying (growing stronger) or separating (fading). */ isApplying: boolean; /** * Aspect strength percentage (0-100) based on orb tightness. */ strength: number; /** * Aspect nature: harmonious, challenging, or neutral. Always English, whatever the lang parameter says, because it is an identifier to compare and style on. Read aspectInterpretation for the sentence a reader sees. */ interpretation: string; /** * Narrative interpretation of this aspect for this chart. The reference description of the aspect TYPE is not repeated per row, use GET or POST /astrology/aspects for that card. */ aspectInterpretation: { /** * One-sentence read of THIS pair: which two bodies, how tight the aspect is, whether it is applying or separating, and how it is classified. Translated in place, so it arrives in the requested language. */ summary: string; /** * Themes this aspect activates between the two bodies. Translated in place, so they arrive in the requested language. */ keywords: Array; }; }>; /** * Detected multi-planet aspect configurations (Grand Trine, Kite, T-Square, Grand Cross, Yod, Mystic Rectangle, Stellium). Grand Cross suppresses contained T-Squares, Kite suppresses underlying Grand Trine. */ patterns?: Array<{ /** * Pattern kind identifier. GRAND_TRINE (3 trines, harmonious flow), KITE (Grand Trine with a focal outlet planet), T_SQUARE (opposition with squared apex, growth engine), GRAND_CROSS (4 planets in 2 oppositions and 4 squares, peak tension), YOD (Finger of Fate, fated adjustment), MYSTIC_RECTANGLE (oppositions softened by trines and sextiles), STELLIUM (3+ planets clustered in a sign or 10-degree arc). */ kind: 'GRAND_TRINE' | 'KITE' | 'T_SQUARE' | 'GRAND_CROSS' | 'YOD' | 'MYSTIC_RECTANGLE' | 'STELLIUM'; /** * Human-readable name of the configuration as used in astrological literature. */ name: string; /** * Participating bodies in canonical order. For Kite, T-Square, and Yod the apex planet appears first. */ planets: Array; /** * Focal planet for Kite, T-Square, and Yod patterns. Receives the released energy of the configuration and is the recommended integration point. */ apex?: string; /** * Dominant element when the pattern is element-coherent (Grand Trine, Kite). Reported lowercase. Absent for patterns whose meaning does not pivot on element. */ element?: 'fire' | 'earth' | 'air' | 'water'; /** * Dominant modality for tension-based patterns (T-Square, Grand Cross). Cardinal initiates, Fixed sustains, Mutable adapts. */ modality?: 'cardinal' | 'fixed' | 'mutable'; /** * True if the pattern is out-of-sign (one or more planets in a neighboring element or modality). Dissociate patterns are still valid but operate with weakened thematic coherence. */ dissociate?: boolean; /** * Tightness score (0-100) derived from the average orb tightness across all defining aspects. Higher means closer to exact and stronger thematic expression. */ tightness: number; /** * Concise one-line interpretation naming the participating planets and theme. Localized to the requested language via the lang query parameter (defaults to English). */ interpretation: string; /** * Stable template identifier used to render the interpretation. Useful for clients that wish to swap in a custom narrative template while preserving the structured variables. */ interpretationKey: string; /** * Variables that were interpolated into the interpretation template. Names already resolved to the requested language where appropriate. */ interpretationVars: { [key: string]: string; }; }>; /** * Aspect pattern analysis showing the balance of harmonious vs challenging energies in the chart. */ aspectsInterpretation: { /** * Narrative summary of the overall aspect pattern in this chart. */ summary: string; /** * Whether the chart is predominantly harmonious, challenging, or balanced. */ dominant: string; /** * Count of harmonious aspects (trine, sextile). */ harmonious: number; /** * Count of challenging aspects (square, opposition). */ challenging: number; /** * Count of neutral aspects (conjunction). */ neutral: number; }; /** * Ascendant (rising sign). The eastern horizon at birth, defining outward personality and physical appearance. */ ascendant: { /** * Zodiac sign on the Ascendant (rising sign). Always English, whatever the lang parameter says. Use signLocalized for anything a reader sees. */ sign: string; /** * Ascendant sign name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ signLocalized?: string; /** * Degree within the Ascendant sign (0-29.999). */ degree: number; /** * Absolute ecliptic longitude of the Ascendant (0-360). */ longitude: number; }; /** * Midheaven (MC). The highest point of the ecliptic at birth, representing career direction and public image. */ midheaven: { /** * Zodiac sign on the Midheaven (MC). Always English, whatever the lang parameter says. Use signLocalized for anything a reader sees. */ sign: string; /** * Midheaven sign name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ signLocalized?: string; /** * Degree within the Midheaven sign (0-29.999). */ degree: number; /** * Absolute ecliptic longitude of the Midheaven (0-360). */ longitude: number; }; /** * Part of Fortune (Lot of Fortune). A point derived from the Ascendant and the two luminaries that marks an area of ease, vitality, and material wellbeing in the chart. */ partOfFortune: { /** * Zodiac sign holding the Part of Fortune. */ sign: string; /** * Degree within the Part of Fortune sign (0-29.999). */ degree: number; /** * Absolute ecliptic longitude of the Part of Fortune (0-360). */ longitude: number; /** * House containing this point, resolved against the same cusps as `planets[].house` and using the requested house system. Read this field rather than inferring a house from the sign: the two disagree whenever a house spans more than one sign, which is most of the time outside Whole Sign. */ house: number; /** * Chart sect used for the calculation. Day (diurnal) when the Sun is above the horizon, night (nocturnal) when below. Day charts use Ascendant plus Moon minus Sun, night charts use Ascendant plus Sun minus Moon. */ sect: 'day' | 'night'; /** * Part of Fortune sign name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ signLocalized?: string; }; /** * Vertex. The western intersection of the prime vertical with the ecliptic, often read as a point of fated encounters and turning-point relationships. The opposite point is the Anti-Vertex. */ vertex: { /** * Zodiac sign holding the Vertex. */ sign: string; /** * Degree within the Vertex sign (0-29.999). */ degree: number; /** * Absolute ecliptic longitude of the Vertex (0-360). */ longitude: number; /** * House containing this point, resolved against the same cusps as `planets[].house` and using the requested house system. Read this field rather than inferring a house from the sign: the two disagree whenever a house spans more than one sign, which is most of the time outside Whole Sign. */ house: number; /** * Vertex sign name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ signLocalized?: string; }; /** * Chart summary with dominant element, modality, retrograde planets, and distribution analysis. */ summary: { /** * Most represented element in the chart (Fire, Earth, Air, Water). Always English, whatever the lang parameter says. Use dominantElementLocalized for anything a reader sees. */ dominantElement: string; /** * Element name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ dominantElementLocalized?: string; /** * Most represented modality in the chart (Cardinal, Fixed, Mutable). Always English, whatever the lang parameter says. Use dominantModalityLocalized for anything a reader sees. */ dominantModality: string; /** * Modality name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ dominantModalityLocalized?: string; /** * Planets in retrograde motion at the time of birth. Always English, whatever the lang parameter says. Use retrogradePlanetsLocalized for anything a reader sees. */ retrogradePlanets: Array; /** * The same retrograde bodies in the requested language, for display only. Index aligned with retrogradePlanets, so entry n of one names entry n of the other. Present only when lang is set to a language other than English, since in English it would repeat retrogradePlanets exactly. */ retrogradePlanetsLocalized?: Array; /** * Count of planets in each element. Shows elemental emphasis in the personality. */ elementDistribution: { [key: string]: number; }; /** * Count of planets in each modality. Shows the dominant operating mode. */ modalityDistribution: { [key: string]: number; }; }; }; export type NatalChartRequest = { /** * Birth date in YYYY-MM-DD format. Determines planetary positions for the specific calendar day. */ date: string; /** * Birth time in 24-hour HH:MM:SS format. Determines the Ascendant (rising sign) and house cusps. Use 12:00:00 if unknown. */ time: string; /** * Birth location latitude in decimal degrees (-90 to 90). Positive = North, negative = South. */ latitude: number; /** * Birth location longitude in decimal degrees (-180 to 180). Positive = East, negative = West. */ longitude: number; /** * Timezone: IANA name (e.g. "America/New_York", "Europe/London") OR decimal hours from UTC (e.g. -5 for EST, 1 for CET). IANA strings are resolved to the offset in force at the given date and time, so you can pass `cities[0].timezone` from /location/search directly. */ timezone: number | string; /** * Lunar node convention. "mean" is the smoothed average node, which always moves retrograde; "true" is the osculating node, which tracks the real perturbed node, oscillates up to about 1.5 degrees either side of the mean on a 173-day cycle, and can briefly turn direct. Neither is more correct and they almost always fall in the same sign. Applies to the North and South Node. True is the osculating node and the default, because it is what most Western chart software reports; mean is the smoothed node preferred by several evolutionary schools, so pass "mean" to match one. Nothing else in the chart changes, and the two agree on the sign except when the node sits within about 1.8 degrees of a cusp. Defaults to "true". */ nodeType?: 'mean' | 'true'; /** * House system for dividing the chart into 12 houses. Placidus (default) is most popular in Western astrology and time-sensitive. Whole Sign assigns one sign per house (simpler, ancient). Equal houses divide chart into 30° segments from Ascendant. Koch emphasizes houses in high latitudes. */ houseSystem?: 'placidus' | 'whole-sign' | 'equal' | 'koch'; }; export type HousesResponse = { /** * Input date used for this house cusp calculation. */ date: string; /** * Input time used for this house cusp calculation. */ time: string; /** * Observer latitude used for horizon-based house calculations. */ latitude: number; /** * Observer longitude used for local sidereal time. */ longitude: number; /** * Timezone offset from UTC applied to this calculation. */ timezone: number; /** * House system used for this calculation (placidus, whole-sign, equal, koch, or all). */ houseSystem: string; /** * Ascendant (rising sign) position. The eastern horizon point at the moment of birth, defining personality expression and physical appearance in Western astrology. */ ascendant: { /** * Zodiac sign on the Ascendant (rising sign). Determines the first house cusp. */ sign: string; /** * Degree within the Ascendant sign (0-29.999). */ degree: number; /** * Absolute ecliptic longitude of the Ascendant in degrees (0-360). */ longitude: number; }; /** * Midheaven (MC) position. The highest point of the ecliptic at birth, representing career aspirations and public image in natal astrology. */ midheaven: { /** * Zodiac sign on the Midheaven (MC). Indicates career direction and public reputation. */ sign: string; /** * Degree within the Midheaven sign (0-29.999). */ degree: number; /** * Absolute ecliptic longitude of the Midheaven in degrees (0-360). */ longitude: number; }; /** * All 12 house cusps with their zodiac positions. House cusps divide the chart into life areas: identity (1st), resources (2nd), communication (3rd), home (4th), creativity (5th), health (6th), partnerships (7th), transformation (8th), philosophy (9th), career (10th), community (11th), spirituality (12th). */ houses: Array<{ /** * House number (1-12). Each house governs specific life areas. */ number: number; /** * Ecliptic longitude of this house cusp in degrees (0-360). */ longitude: number; /** * Zodiac sign on this house cusp. */ sign: string; /** * Degree within the zodiac sign on this cusp (0-29.999). */ degree: number; }>; /** * Side-by-side house cusp comparison keyed by house system id: placidus, whole-sign, equal, koch. Only included when houseSystem is set to "all". Useful for educational tools and system comparison. */ comparison?: { [key: string]: { /** * All 12 house cusps as this system computes them. Compare the same house number across the four keys to see how far the systems disagree, which is largest at high latitudes and for the intermediate cusps. */ houses: Array<{ /** * House number (1-12). Each house governs specific life areas. */ number: number; /** * Ecliptic longitude of this house cusp in degrees (0-360), as this house system places it. */ longitude: number; /** * Zodiac sign on this house cusp in this house system. */ sign: string; /** * Degree within the zodiac sign on this cusp (0-29.999). */ degree: number; }>; }; }; }; export type AspectsResponse = { /** * Date used for this aspect calculation (YYYY-MM-DD). */ date: string; /** * Time used for this calculation (HH:MM:SS). */ time: string; /** * Timezone offset from UTC in decimal hours. */ timezone: number; /** * Total number of aspects found after any filters applied. */ aspectsFound: number; /** * All aspects found between the specified planets, with strength, orb, and interpretation. */ aspects: Array<{ /** * First planet in the aspect pair. Always English, whatever the lang parameter says. Use planet1Localized for anything a reader sees. */ planet1: string; /** * First planet name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ planet1Localized?: string; /** * Second planet in the aspect pair. Always English, whatever the lang parameter says. Use planet2Localized for anything a reader sees. */ planet2: string; /** * Second planet name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ planet2Localized?: string; /** * Aspect type (CONJUNCTION, OPPOSITION, TRINE, SQUARE, SEXTILE, etc.). Always English, whatever the lang parameter says. Use typeLocalized for anything a reader sees. */ type: string; /** * Aspect type name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ typeLocalized?: string; /** * Exact angle defining this aspect type in degrees. */ angle: number; /** * Distance from exact aspect in degrees. Tighter orb means stronger influence. */ orb: number; /** * Whether the aspect is applying (growing stronger) or separating (fading). */ isApplying: boolean; /** * Aspect strength (0-100) based on orb tightness. */ strength: number; /** * Aspect nature for this pair: harmonious, challenging, or neutral. Always English, whatever the lang parameter says, because it is an identifier to compare and style on. This is the field to branch on; meaning.nature is the reference card characterisation of the aspect type and is translated for display. */ interpretation: string; /** * Aspect meaning with keywords, description, and nature classification. */ meaning?: { /** * Aspect display name. */ name: string; /** * Aspect meaning in short and long form. */ description: { /** * Brief aspect description. */ short: string; /** * Detailed aspect description with astrological context. */ long: string; }; /** * Keywords associated with this aspect type. */ keywords: Array; /** * How this aspect type is characterised in its reference card, in the requested language, exactly like the name, description and keywords beside it. This is a property of the aspect TYPE, so branch on the aspect-level interpretation field instead, which is always English and is the classification applied to this particular pair. */ nature: string; }; }>; /** * Detected multi-planet aspect configurations (Grand Trine, Kite, T-Square, Grand Cross, Yod, Mystic Rectangle, Stellium). */ patterns?: Array<{ /** * Pattern kind identifier. GRAND_TRINE (3 trines, harmonious flow), KITE (Grand Trine with a focal outlet planet), T_SQUARE (opposition with squared apex, growth engine), GRAND_CROSS (4 planets in 2 oppositions and 4 squares, peak tension), YOD (Finger of Fate, fated adjustment), MYSTIC_RECTANGLE (oppositions softened by trines and sextiles), STELLIUM (3+ planets clustered in a sign or 10-degree arc). */ kind: 'GRAND_TRINE' | 'KITE' | 'T_SQUARE' | 'GRAND_CROSS' | 'YOD' | 'MYSTIC_RECTANGLE' | 'STELLIUM'; /** * Human-readable name of the configuration as used in astrological literature. */ name: string; /** * Participating bodies in canonical order. For Kite, T-Square, and Yod the apex planet appears first. */ planets: Array; /** * Focal planet for Kite, T-Square, and Yod patterns. Receives the released energy of the configuration and is the recommended integration point. */ apex?: string; /** * Dominant element when the pattern is element-coherent (Grand Trine, Kite). Reported lowercase. Absent for patterns whose meaning does not pivot on element. */ element?: 'fire' | 'earth' | 'air' | 'water'; /** * Dominant modality for tension-based patterns (T-Square, Grand Cross). Cardinal initiates, Fixed sustains, Mutable adapts. */ modality?: 'cardinal' | 'fixed' | 'mutable'; /** * True if the pattern is out-of-sign (one or more planets in a neighboring element or modality). Dissociate patterns are still valid but operate with weakened thematic coherence. */ dissociate?: boolean; /** * Tightness score (0-100) derived from the average orb tightness across all defining aspects. Higher means closer to exact and stronger thematic expression. */ tightness: number; /** * Concise one-line interpretation naming the participating planets and theme. Localized to the requested language via the lang query parameter (defaults to English). */ interpretation: string; /** * Stable template identifier used to render the interpretation. Useful for clients that wish to swap in a custom narrative template while preserving the structured variables. */ interpretationKey: string; /** * Variables that were interpolated into the interpretation template. Names already resolved to the requested language where appropriate. */ interpretationVars: { [key: string]: string; }; }>; /** * Aspect summary with counts by nature and type. */ summary: { /** * Total aspects found. */ totalAspects: number; /** * Count of harmonious aspects (trine, sextile). */ harmonious: number; /** * Count of challenging aspects (square, opposition). */ challenging: number; /** * Count of neutral aspects (conjunction). */ neutral: number; /** * Aspect count grouped by type. */ byType: { [key: string]: number; }; }; }; export type AspectsRequest = { /** * Date in YYYY-MM-DD format */ date: string; /** * Time in HH:MM:SS format (24-hour) */ time: string; /** * Timezone offset from UTC in decimal hours (NOT minutes format). Examples: New York EST = -5, India IST = 5.5 (NOT 5:30), Tokyo JST = 9. IMPORTANT: Use decimal format (5.5, not 5:30). */ timezone: number | string; /** * Optional: specific bodies to calculate aspects for (defaults to all 14: the 10 classical planets, the lunar nodes, Chiron, and Black Moon Lilith) */ planets?: Array; /** * Optional: specific aspect types to find (defaults to all 9) */ aspectTypes?: Array; }; export type AspectPatternsResponse = { /** * All aspect patterns detected in the chart, in detection order: Grand Cross first, then Kite, Grand Trine, T-Square, Yod, Mystic Rectangle, Stellium. Patterns absorbed by a higher-priority detection (T-Squares inside a Grand Cross, Grand Trines absorbed by a Kite) are not reported separately. */ patterns: Array<{ /** * Pattern kind identifier. GRAND_TRINE (3 trines, harmonious flow), KITE (Grand Trine with a focal outlet planet), T_SQUARE (opposition with squared apex, growth engine), GRAND_CROSS (4 planets in 2 oppositions and 4 squares, peak tension), YOD (Finger of Fate, fated adjustment), MYSTIC_RECTANGLE (oppositions softened by trines and sextiles), STELLIUM (3+ planets clustered in a sign or 10-degree arc). */ kind: 'GRAND_TRINE' | 'KITE' | 'T_SQUARE' | 'GRAND_CROSS' | 'YOD' | 'MYSTIC_RECTANGLE' | 'STELLIUM'; /** * Human-readable name of the configuration as used in astrological literature. */ name: string; /** * Participating bodies in canonical order. For Kite, T-Square, and Yod the apex planet appears first. */ planets: Array; /** * Focal planet for Kite, T-Square, and Yod patterns. Receives the released energy of the configuration and is the recommended integration point. */ apex?: string; /** * Dominant element when the pattern is element-coherent (Grand Trine, Kite). Reported lowercase. Absent for patterns whose meaning does not pivot on element. */ element?: 'fire' | 'earth' | 'air' | 'water'; /** * Dominant modality for tension-based patterns (T-Square, Grand Cross). Cardinal initiates, Fixed sustains, Mutable adapts. */ modality?: 'cardinal' | 'fixed' | 'mutable'; /** * True if the pattern is out-of-sign (one or more planets in a neighboring element or modality). Dissociate patterns are still valid but operate with weakened thematic coherence. */ dissociate?: boolean; /** * Tightness score (0-100) derived from the average orb tightness across all defining aspects. Higher means closer to exact and stronger thematic expression. */ tightness: number; /** * Concise one-line interpretation naming the participating planets and theme. Localized to the requested language via the lang query parameter (defaults to English). */ interpretation: string; /** * Stable template identifier used to render the interpretation. Useful for clients that wish to swap in a custom narrative template while preserving the structured variables. */ interpretationKey: string; /** * Variables that were interpolated into the interpretation template. Names already resolved to the requested language where appropriate. */ interpretationVars: { [key: string]: string; }; }>; /** * Total number of detected aspect patterns in this chart. */ total: number; /** * Echo of the options used for this detection run. Useful for reproducibility and for downstream UI display. */ options: { /** * Whether the tight orb budget was used. False uses the standard pattern-detection orbs (8 degrees for major aspects, 9 for square, 6 for sextile, 3 for quincunx). */ strictOrbs: boolean; /** * Optional bodies included beyond the default Sun-Pluto set. Empty means classical 10-planet detection only. */ include: Array<'chiron' | 'northNode'>; }; }; export type AspectPatternsRequest = { /** * Birth date in YYYY-MM-DD format. Determines planetary positions for the specific calendar day. */ date: string; /** * Birth time in 24-hour HH:MM:SS format. Determines the Ascendant (rising sign) and house cusps. Use 12:00:00 if unknown. */ time: string; /** * Birth location latitude in decimal degrees (-90 to 90). Positive = North, negative = South. */ latitude: number; /** * Birth location longitude in decimal degrees (-180 to 180). Positive = East, negative = West. */ longitude: number; /** * Timezone: IANA name (e.g. "America/New_York", "Europe/London") OR decimal hours from UTC (e.g. -5 for EST, 1 for CET). IANA strings are resolved to the offset in force at the given date and time, so you can pass `cities[0].timezone` from /location/search directly. */ timezone: number | string; /** * Lunar node convention. "mean" is the smoothed average node, which always moves retrograde; "true" is the osculating node, which tracks the real perturbed node, oscillates up to about 1.5 degrees either side of the mean on a 173-day cycle, and can briefly turn direct. Neither is more correct and they almost always fall in the same sign. Applies to the North and South Node. True is the osculating node and the default, because it is what most Western chart software reports; mean is the smoothed node preferred by several evolutionary schools, so pass "mean" to match one. Nothing else in the chart changes, and the two agree on the sign except when the node sits within about 1.8 degrees of a cusp. Defaults to "true". */ nodeType?: 'mean' | 'true'; }; export type TransitsResponse = { /** * Date of the transit calculation (YYYY-MM-DD). */ transitDate: string; /** * Time of the transit calculation (HH:MM:SS, 24-hour). */ transitTime: string; /** * Timezone offset from UTC in hours used for this calculation. */ timezone: number; /** * Current positions of all 14 celestial bodies (10 classical planets, lunar nodes, Chiron, Black Moon Lilith) in the tropical zodiac. Use for daily transit tracking, horoscope generation, and aspect monitoring. */ transitPlanets: Array<{ /** * Planet name (Sun, Moon, Mercury, Venus, Mars, Jupiter, Saturn, Uranus, Neptune, Pluto, North Node, South Node, Chiron, Black Moon Lilith). Always English, whatever the lang parameter says, so it stays safe to compare against in code. Use nameLocalized for anything a reader sees. The lunar nodes follow the request nodeType, which defaults to the true (osculating) node; pass "mean" for the smoothed node. The two differ by up to about 1.8 degrees and no other body is affected. */ name: string; /** * Planet name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ nameLocalized?: string; /** * Apparent geocentric tropical longitude on the true ecliptic of date, in degrees (0-360): light time and aberration applied, nutation included, the convention desktop chart software and the NASA JPL Horizons observer tables print, so it compares directly with either. Primary coordinate for sign and aspect calculation. */ longitude: number; /** * Apparent geocentric ecliptic latitude of date, in degrees. Near zero for most planets except Moon and Pluto. */ latitude: number; /** * Tropical zodiac sign the planet currently occupies. Changes when longitude crosses a 30-degree boundary. Always English, whatever the lang parameter says. Use signLocalized for anything a reader sees. */ sign: string; /** * Zodiac sign name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ signLocalized?: string; /** * Degree within the current zodiac sign (0-29.999). Indicates how far into the sign the planet has progressed. */ degree: number; /** * Daily motion in degrees per day. Negative values indicate retrograde motion. */ speed: number; /** * Whether the planet is currently in apparent retrograde motion. Retrograde transits are considered more introspective and revisionary. */ isRetrograde: boolean; }>; /** * Transit-to-natal aspects (only included when natalChart is provided in the request). Shows which transiting planets are aspecting natal planets. */ transitAspects?: Array<{ /** * Transiting planet forming the aspect. Always English, whatever the lang parameter says. Use transitPlanetLocalized for anything a reader sees. */ transitPlanet: string; /** * Transiting planet name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ transitPlanetLocalized?: string; /** * Natal planet being aspected. Always English, whatever the lang parameter says. Use natalPlanetLocalized for anything a reader sees. */ natalPlanet: string; /** * Natal planet name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ natalPlanetLocalized?: string; /** * Aspect type (CONJUNCTION, OPPOSITION, TRINE, SQUARE, SEXTILE, etc.). Always English, whatever the lang parameter says. Use typeLocalized for anything a reader sees. */ type: string; /** * Aspect type name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ typeLocalized?: string; /** * Exact angle of this aspect type in degrees. */ angle: number; /** * Distance from exact aspect in degrees. Tighter orb = stronger influence. */ orb: number; /** * Whether the transiting planet is moving toward exactitude (applying) or away from it (separating). Applying aspects grow stronger. */ isApplying: boolean; /** * Aspect strength percentage (0-100) based on orb tightness, where 100 is exact. */ strength: number; /** * Aspect nature: harmonious (trine, sextile), challenging (square, opposition), or neutral (conjunction). */ nature: string; /** * Rich interpretation of the transit aspect including narrative summary, timing, impact assessment, practical guidance, and keywords. */ interpretation: { /** * Narrative interpretation of what this transit aspect means and how it manifests. */ summary: string; /** * How long this transit influence lasts, localized. The bucket follows the speed of the transiting body: a few hours for the Moon, a few days for the Sun, Mercury, Venus and Mars, one to two weeks for Jupiter, several weeks for Saturn, and an extended period for Uranus, Neptune and Pluto. */ timing: string; /** * Strength and nature of the transit impact on your natal chart. */ impact: string; /** * Practical advice for working with or navigating this transit energy. */ guidance: string; /** * Key themes activated by this transit aspect. */ keywords: Array; }; }>; /** * Transit aspect summary counts (only included when natalChart is provided). Quick overview of the current transit weather. */ summary?: { /** * Total transit-to-natal aspects found. */ totalAspects: number; /** * Count of harmonious aspects (trine, sextile). */ harmonious: number; /** * Count of challenging aspects (square, opposition). */ challenging: number; /** * Count of neutral aspects (conjunction). */ neutral: number; }; }; export type TransitsRequest = { /** * Transit date in YYYY-MM-DD format (defaults to current date) */ date?: string; /** * Transit time in HH:MM:SS format (defaults to current time) */ time?: string; /** * Transit timezone: decimal hours from UTC OR IANA name (e.g. "America/New_York"). IANA resolved to the DST-correct offset for the transit date. Defaults to 0 (UTC). */ timezone?: number | string; /** * Lunar node convention. "mean" is the smoothed average node, which always moves retrograde; "true" is the osculating node, which tracks the real perturbed node, oscillates up to about 1.5 degrees either side of the mean on a 173-day cycle, and can briefly turn direct. Neither is more correct and they almost always fall in the same sign. Applies to the North and South Node. True is the osculating node and the default, because it is what most Western chart software reports; mean is the smoothed node preferred by several evolutionary schools, so pass "mean" to match one. Nothing else in the chart changes, and the two agree on the sign except when the node sits within about 1.8 degrees of a cusp. Defaults to "true". */ nodeType?: 'mean' | 'true'; /** * Optional natal chart data to compare transits against */ natalChart?: { /** * Date in YYYY-MM-DD format. A single-digit month or day is accepted and zero-padded (2026-3-5 becomes 2026-03-05). Impossible calendar dates are rejected. */ date: string; /** * Time in 24-hour format. Seconds are optional and default to 00 (14:30 becomes 14:30:00); a single-digit hour is zero-padded. Out-of-range values are rejected. */ time: string; /** * Natal birth latitude in decimal degrees, positive north. Sets the local sidereal time behind the natal Ascendant and house cusps that the transits are measured against. */ latitude: number; /** * Natal birth longitude in decimal degrees, positive east and negative west. Example: New York -74.0060, London -0.1276, Sydney 151.2093. */ longitude: number; /** * Natal timezone: decimal hours OR IANA name (e.g. "America/New_York"). IANA resolved to the DST-correct offset for the natal date. */ timezone: number | string; }; }; export type AstrocartographyResponse = { /** * Echo of the birth moment and place used to compute every planetary line. */ birthDetails: { /** * Birth date in YYYY-MM-DD format. Determines planetary positions for the specific calendar day. */ date: string; /** * Birth time in 24-hour HH:MM:SS format. Determines the Ascendant (rising sign) and house cusps. Use 12:00:00 if unknown. */ time: string; /** * Birth location latitude in decimal degrees (-90 to 90). Positive = North, negative = South. */ latitude: number; /** * Birth location longitude in decimal degrees (-180 to 180). Positive = East, negative = West. */ longitude: number; /** * Timezone offset from UTC in decimal hours. Examples: New York = -5, London = 0, India = 5.5, Tokyo = 9. */ timezone: number; }; /** * One entry per body, each carrying its Midheaven, Imum Coeli, Ascendant, and Descendant planetary lines for relocation mapping. */ lines: Array<{ /** * Celestial body this set of planetary lines belongs to. Always English, whatever the lang parameter says, so it stays safe to compare against in code. Use planetLocalized for anything a reader sees. */ planet: string; /** * Body name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ planetLocalized?: string; /** * Unicode astronomical symbol for this body. */ symbol?: string; /** * Equatorial right ascension of the body in degrees (0 to 360), the basis for every line. */ rightAscension: number; /** * Equatorial declination of the body in degrees (-90 to 90), which sets how far the rising and setting lines curve. */ declination: number; /** * Midheaven (MC) line. Places along this meridian where the body was culminating overhead, tied to public life, career, and reputation. */ mc: { /** * Constant geographic longitude of this vertical meridian line in decimal degrees. The body culminates (MC) along it, so plot it as a straight north to south line. */ longitude: number; /** * Plain language meaning of this Midheaven planetary line for relocation, suitable for chart reports and AI agents. */ interpretation: string; }; /** * Imum Coeli (IC) line, opposite the MC. Places where the body was anti-culminating, tied to home, family, and inner foundations. */ ic: { /** * Constant geographic longitude of this vertical meridian line in decimal degrees. The body anti-culminates (IC) along it, so plot it as a straight north to south line. */ longitude: number; /** * Plain language meaning of this Imum Coeli planetary line for relocation, suitable for chart reports and AI agents. */ interpretation: string; }; /** * Ascendant (rising) line. Places where the body was on the eastern horizon, tied to identity, vitality, and self-expression. */ ascendant: { /** * Sampled geographic points tracing this rising line from 70 South to 70 North. Join them in latitude order to draw the curved planetary line on a world map. */ points: Array<{ /** * Geographic latitude of this sampled point in decimal degrees. */ latitude: number; /** * Geographic longitude in decimal degrees where the body sits exactly on the eastern (rising) horizon at this latitude. */ longitude: number; }>; /** * Absolute latitude in degrees beyond which the body never crosses the horizon, so the line has no points past it. Null when the line spans the full sampled range. */ circumpolarBeyond: number | null; /** * Plain language meaning of this rising (Ascendant) planetary line for relocation, suitable for chart reports and AI agents. */ interpretation: string; }; /** * Descendant (setting) line. Places where the body was on the western horizon, tied to relationships and partnerships. */ descendant: { /** * Sampled geographic points tracing this setting line from 70 South to 70 North. Join them in latitude order to draw the curved planetary line on a world map. */ points: Array<{ /** * Geographic latitude of this sampled point in decimal degrees. */ latitude: number; /** * Geographic longitude in decimal degrees where the body sits exactly on the western (setting) horizon at this latitude. */ longitude: number; }>; /** * Absolute latitude in degrees beyond which the body never crosses the horizon, so the line has no points past it. Null when the line spans the full sampled range. */ circumpolarBeyond: number | null; /** * Plain language meaning of this setting (Descendant) planetary line for relocation, suitable for chart reports and AI agents. */ interpretation: string; }; }>; /** * Short overview of the astrocartography map for previews and report intros. */ summary: string; }; export type RelocationChartResponse = { /** * Birthplace details echoed back. The birth instant is unchanged by relocation. */ birthDetails: { /** * Birth date used for this chart (YYYY-MM-DD). */ date: string; /** * Birth time used for this chart (HH:MM:SS, 24-hour). */ time: string; /** * Birthplace latitude in decimal degrees. */ latitude: number; /** * Birthplace longitude in decimal degrees. */ longitude: number; /** * Birth timezone offset from UTC in decimal hours. */ timezone: number; }; /** * New location the chart was recomputed for. */ relocation: { /** * New location latitude in decimal degrees. */ latitude: number; /** * New location longitude in decimal degrees. */ longitude: number; }; /** * All 14 celestial bodies with their unchanged natal signs and degrees, reassigned to the houses they occupy in the relocated chart. */ planets: Array; /** * All 12 relocated house cusps with zodiac positions for the new location. */ houses: Array<{ /** * House number (1-12). Each house governs specific life themes in Western astrology. */ number: number; /** * Ecliptic longitude of this house cusp in degrees (0-360). */ longitude: number; /** * Zodiac sign on this house cusp. Colors the themes of this life area. */ sign: string; /** * Degree within the zodiac sign on this cusp (0-29.999). */ degree: number; /** * Zodiac sign name on this cusp in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ signLocalized?: string; }>; /** * House system used for the relocated chart (placidus, whole-sign, equal, or koch). Quadrant systems fall back to whole-sign above the polar circle. */ houseSystem: string; /** * Relocated Ascendant (rising sign). The eastern horizon at the new place, defining how you come across there. */ ascendant: { /** * Tropical zodiac sign on this relocated angle. Always English, whatever the lang parameter says. Use signLocalized for anything a reader sees. */ sign: string; /** * Zodiac sign name on this angle in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ signLocalized?: string; /** * Degree within the zodiac sign on this angle (0-29.999). */ degree: number; /** * Absolute ecliptic longitude of this angle in degrees (0-360). */ longitude: number; }; /** * Relocated Midheaven (MC). The highest point of the ecliptic at the new place, tied to career and public image there. */ midheaven: { /** * Tropical zodiac sign on this relocated angle. Always English, whatever the lang parameter says. Use signLocalized for anything a reader sees. */ sign: string; /** * Zodiac sign name on this angle in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ signLocalized?: string; /** * Degree within the zodiac sign on this angle (0-29.999). */ degree: number; /** * Absolute ecliptic longitude of this angle in degrees (0-360). */ longitude: number; }; /** * Relocated Vertex. The western prime-vertical and ecliptic intersection at the new place, read as a point of fated encounters. */ vertex: { /** * Zodiac sign holding the Vertex. */ sign: string; /** * Degree within the Vertex sign (0-29.999). */ degree: number; /** * Absolute ecliptic longitude of the Vertex (0-360). */ longitude: number; /** * House containing this point, resolved against the same cusps as `planets[].house` and using the requested house system. Read this field rather than inferring a house from the sign: the two disagree whenever a house spans more than one sign, which is most of the time outside Whole Sign. */ house: number; /** * Vertex sign name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ signLocalized?: string; }; /** * How relocation reshapes the chart: Ascendant shift, planets that change house, angular planets, and the move geometry from the birthplace. */ changes: { /** * Whether the Ascendant sign differs between the birthplace chart and the relocated chart. */ ascendantSignChanged: boolean; /** * Bodies whose house placement shifts from the birthplace chart to the relocated chart. Empty when nothing changes house. */ planetsChangedHouse: Array<{ /** * Body that occupies a different house after relocation. Always English, whatever the lang parameter says. Use planetLocalized for anything a reader sees. */ planet: string; /** * Body name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ planetLocalized?: string; /** * House this body occupied in the birthplace chart (1-12). */ natalHouse: number; /** * House this body occupies in the relocated chart (1-12). */ relocatedHouse: number; }>; /** * Bodies within three degrees of a relocated angle (Ascendant, Imum Coeli, Descendant, or Midheaven), where their influence is strongest at this location. Always English, whatever the lang parameter says. Use angularPlanetsLocalized for anything a reader sees. */ angularPlanets: Array; /** * The same angular bodies in the requested language, for display only. Index aligned with angularPlanets. Present only when lang is set to a language other than English. */ angularPlanetsLocalized?: Array; /** * Great-circle distance from the birthplace to the new location in kilometers. */ distanceKm: number; /** * Compass direction (16-point) from the birthplace to the new location. */ direction: string; }; /** * Relocation interpretation summary. */ interpretation: { /** * Narrative summary of the relocation: the new Ascendant and Midheaven signs and any planets that move onto the angles. Localized via the lang query parameter. */ summary: string; }; }; export type RelocationPlanet = { /** * Body name. One of the 10 classical planets (Sun, Moon, Mercury, Venus, Mars, Jupiter, Saturn, Uranus, Neptune, Pluto), the lunar nodes (North Node, South Node), Chiron, or Black Moon Lilith (the mean lunar apogee). The lunar nodes follow the request nodeType, which defaults to the true (osculating) node; pass "mean" for the smoothed node. The two differ by up to about 1.8 degrees and no other body is affected. */ name: 'Sun' | 'Moon' | 'Mercury' | 'Venus' | 'Mars' | 'Jupiter' | 'Saturn' | 'Uranus' | 'Neptune' | 'Pluto' | 'North Node' | 'South Node' | 'Chiron' | 'Black Moon Lilith'; /** * Apparent geocentric tropical longitude on the true ecliptic of date, in degrees (0-360): light time and aberration applied, nutation included, the convention desktop chart software and the NASA JPL Horizons observer tables print, so it compares directly with either. Primary coordinate for zodiac sign and aspect calculations. */ longitude: number; /** * Apparent geocentric ecliptic latitude of date, in degrees. Near zero for most planets, varies for the Moon and Pluto, and reaches up to about 5 degrees for Black Moon Lilith (projected from the inclined mean lunar orbit). */ latitude: number; /** * Tropical zodiac sign this planet occupies. Determined by 30-degree divisions of ecliptic longitude. */ sign: string; /** * Degree within the zodiac sign (0-29.999). Indicates how far the planet has progressed through the sign. */ degree: number; /** * House placement (1-12). Determined by the selected house system and birth location. */ house: number; /** * Daily motion in degrees per day. Negative values indicate retrograde motion. */ speed: number; /** * Whether the planet appears to move backward from Earth perspective. Retrograde periods signal review and introspection. */ isRetrograde: boolean; /** * Body name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ nameLocalized?: string; /** * Zodiac sign name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ signLocalized?: string; /** * Relocated placement interpretation. The planet keeps its natal sign, so this reads its meaning through the new house it occupies at this location. */ interpretation?: { /** * One-sentence interpretation of this planet in its sign and relocated house. */ summary: string; /** * Multi-sentence interpretation of this relocated placement. */ detailed: string; /** * Key themes for this relocated placement. */ keywords: Array; }; }; export type RelocationChartRequest = { /** * Birth date in YYYY-MM-DD format. The birth moment is unchanged by relocation, so this still defines the planetary positions of the chart. */ date: string; /** * Birth time in 24-hour HH:MM:SS format. Combined with the timezone it fixes the exact birth instant, which the relocated angles and houses are recomputed for. */ time: string; /** * Birth timezone: decimal hours from UTC (e.g. -5 for EST, 5.5 for IST) OR IANA name (e.g. "America/New_York"). Resolved to the offset in force at the birth date and time. This is the birthplace timezone, not the new location timezone. */ timezone: number | string; /** * Birthplace latitude in decimal degrees (-90 to 90). Used for the original natal angles and houses that the relocated chart is compared against. */ birthLatitude: number; /** * Birthplace longitude in decimal degrees (-180 to 180). Positive East, negative West. */ birthLongitude: number; /** * New location latitude in decimal degrees (-90 to 90). The relocated Ascendant and house cusps are most sensitive to north-south movement. */ relocationLatitude: number; /** * New location longitude in decimal degrees (-180 to 180). The relocated Midheaven shifts roughly one degree per degree of longitude moved. */ relocationLongitude: number; /** * House system for dividing the relocated chart into 12 houses. Placidus (default) is time-sensitive and most popular in Western astrology. Whole Sign assigns one sign per house. Equal divides into 30 degree segments from the Ascendant. Koch emphasizes higher latitudes. Quadrant systems fall back to Whole Sign above the polar circle. */ houseSystem?: 'placidus' | 'whole-sign' | 'equal' | 'koch'; }; export type LocalSpaceResponse = { /** * The birthplace and birth instant the map was computed for. */ birthDetails: { /** * Birth date echoed from the request. */ date: string; /** * Birth time echoed from the request. */ time: string; /** * Birthplace latitude, the origin of every local space line. */ latitude: number; /** * Birthplace longitude, the origin of every local space line. */ longitude: number; /** * Timezone offset from UTC applied to the birth instant. */ timezone: number; }; /** * Every requested body with its horizon direction, altitude, compass direction, great-circle line, and interpretation. */ bodies: Array<{ /** * Body name (Sun, Moon, Mercury through Pluto, plus North Node, Chiron, or Black Moon Lilith when requested). Always English, whatever the lang parameter says, so it stays safe to compare against in code. Use planetLocalized for anything a reader sees. */ planet: string; /** * Body name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ planetLocalized?: string; /** * Unicode astronomical symbol for this body. */ symbol?: string; /** * Compass bearing of the body as seen from the birthplace, in degrees clockwise from true north (0 = north, 90 = east, 180 = south, 270 = west). This is the direction the local space line points. */ azimuth: number; /** * Angular height of the body above (positive) or below (negative) the local horizon at birth, in degrees (-90 to 90). */ altitude: number; /** * Nearest 16-point compass abbreviation for the azimuth (N, NNE, NE, ENE, E, ESE, SE, SSE, S, SSW, SW, WSW, W, WNW, NW, NNW). */ compassDirection: string; /** * True when the body is above the local horizon (altitude greater than 0) at the birth moment. */ aboveHorizon: boolean; /** * The great-circle directional line for this body, ready to plot on a map. */ line: { /** * Ordered latitude and longitude waypoints tracing the great-circle local space line from the birthplace along the body azimuth. The first point is the birthplace itself. */ points: Array<{ /** * Waypoint latitude in decimal degrees. */ latitude: number; /** * Waypoint longitude in decimal degrees. */ longitude: number; }>; }; /** * Plain-language reading of what travelling or facing along this body line tends to emphasize. Localized when a translation exists. */ interpretation: string; }>; /** * One-line overview of the local space map. */ summary: string; }; export type FixedStarsResponse = { /** * Echo of the birth moment and place used to precess every star. */ birthDetails: { /** * Birth date in YYYY-MM-DD format. Determines planetary positions for the specific calendar day. */ date: string; /** * Birth time in 24-hour HH:MM:SS format. Determines the Ascendant (rising sign) and house cusps. Use 12:00:00 if unknown. */ time: string; /** * Birth location latitude in decimal degrees (-90 to 90). Positive = North, negative = South. */ latitude: number; /** * Birth location longitude in decimal degrees (-180 to 180). Positive = East, negative = West. */ longitude: number; /** * Timezone offset from UTC in decimal hours. Examples: New York = -5, London = 0, India = 5.5, Tokyo = 9. */ timezone: number; }; /** * Conjunction orb in degrees applied to detect contacts between stars and natal points. */ orb: number; /** * Every catalog star with its precessed tropical position, magnitude, traditional nature, and any conjunctions to the natal chart. */ stars: Array<{ /** * Lowercase identifier for the fixed star. */ id: string; /** * Proper name of the fixed star. */ name: string; /** * Tropical ecliptic longitude of the star in degrees (0-360), precessed from its J2000 position to the chart date. */ longitude: number; /** * Tropical zodiac sign the star currently occupies. */ sign: string; /** * Degree within the zodiac sign (0-29.999). */ degree: number; /** * Apparent visual magnitude. Lower is brighter, and the brightest stars are negative. */ magnitude: number; /** * Traditional planetary nature of the star in classical astrology. */ nature: string; /** * Traditional astrological keywords associated with the star. */ keywords: Array; /** * Natal points within the chosen orb of this star. Empty when no planet or angle contacts the star. */ conjunctions: Array<{ /** * Natal point conjunct this star: a planet name, or the chart angles MC and ASC. Always English, whatever the lang parameter says, so it stays safe to compare against in code. Use pointLocalized for anything a reader sees. */ point: string; /** * Natal point name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ pointLocalized?: string; /** * Tropical ecliptic longitude of the natal point in degrees (0-360). */ pointLongitude: number; /** * Angular separation in degrees between the star and the natal point. Smaller means a tighter, stronger contact. */ orb: number; }>; }>; /** * Flat list of every star to natal point conjunction, sorted tightest first, each with an interpretation. The high-value summary of where fixed stars touch the chart. */ conjunctions: Array<{ /** * Proper name of the conjunct fixed star. */ star: string; /** * Natal point conjunct the star: a planet name, or the chart angles MC and ASC. Always English, whatever the lang parameter says, so it stays safe to compare against in code. Use pointLocalized for anything a reader sees. */ point: string; /** * Natal point name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ pointLocalized?: string; /** * Angular separation in degrees between the star and the natal point. */ orb: number; /** * Plain language meaning of this star contact, blending the star traditional nature with the chart point. Localized to the requested language. */ interpretation: string; }>; /** * Short overview of the fixed-star report for previews and report intros. */ summary: string; }; export type ArabicLotsResponse = { /** * Echo of the birth moment and place used to compute every lot. */ birthDetails: { /** * Birth date in YYYY-MM-DD format. Determines planetary positions for the specific calendar day. */ date: string; /** * Birth time in 24-hour HH:MM:SS format. Determines the Ascendant (rising sign) and house cusps. Use 12:00:00 if unknown. */ time: string; /** * Birth location latitude in decimal degrees (-90 to 90). Positive = North, negative = South. */ latitude: number; /** * Birth location longitude in decimal degrees (-180 to 180). Positive = East, negative = West. */ longitude: number; /** * Timezone offset from UTC in decimal hours. Examples: New York = -5, London = 0, India = 5.5, Tokyo = 9. */ timezone: number; }; /** * Chart sect that selected each formula. Day (diurnal) when the Sun is above the horizon, night (nocturnal) when below. Every lot swaps its two non-Ascendant terms between day and night. */ sect: 'day' | 'night'; /** * The seven Hermetic lots in canonical order: Part of Fortune and Part of Spirit from the luminaries, then Eros, Necessity, Courage, Victory, and Nemesis from a planet paired with Fortune or Spirit. */ lots: Array<{ /** * Stable machine identifier for the lot (fortune, spirit, eros, necessity, courage, victory, nemesis). Use this for lookups. */ id: string; /** * Name of the lot. Always English, whatever the lang parameter says, so it stays safe to compare against in code. Use nameLocalized for anything a reader sees. */ name: string; /** * Lot name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ nameLocalized?: string; /** * Absolute tropical ecliptic longitude of the lot in degrees (0 to 360). */ longitude: number; /** * Tropical zodiac sign the lot falls in. */ sign: string; /** * Degree of the lot within its zodiac sign (0 to 29.999). */ degree: number; /** * Human readable arc used for this chart, with the day or night term order already applied by sect. */ formula: string; /** * Plain language meaning of this lot in its sign, suitable for chart reports and AI agents. Localized to the requested language. */ interpretation: string; }>; /** * Short overview of the lot set for previews and report intros. */ summary: string; }; export type ArabicLotsRequest = { /** * Birth date in YYYY-MM-DD format. Determines planetary positions for the specific calendar day. */ date: string; /** * Birth time in 24-hour HH:MM:SS format. Determines the Ascendant (rising sign) and house cusps. Use 12:00:00 if unknown. */ time: string; /** * Birth location latitude in decimal degrees (-90 to 90). Positive = North, negative = South. */ latitude: number; /** * Birth location longitude in decimal degrees (-180 to 180). Positive = East, negative = West. */ longitude: number; /** * Timezone: IANA name (e.g. "America/New_York", "Europe/London") OR decimal hours from UTC (e.g. -5 for EST, 1 for CET). IANA strings are resolved to the offset in force at the given date and time, so you can pass `cities[0].timezone` from /location/search directly. */ timezone: number | string; /** * Lunar node convention. "mean" is the smoothed average node, which always moves retrograde; "true" is the osculating node, which tracks the real perturbed node, oscillates up to about 1.5 degrees either side of the mean on a 173-day cycle, and can briefly turn direct. Neither is more correct and they almost always fall in the same sign. Applies to the North and South Node. True is the osculating node and the default, because it is what most Western chart software reports; mean is the smoothed node preferred by several evolutionary schools, so pass "mean" to match one. Nothing else in the chart changes, and the two agree on the sign except when the node sits within about 1.8 degrees of a cusp. Defaults to "true". */ nodeType?: 'mean' | 'true'; /** * House system used to place the Sun, which determines the chart sect (day when the Sun is above the horizon, night when below) and therefore which lot formula applies. Placidus (default), Whole Sign, Equal, or Koch. */ houseSystem?: 'placidus' | 'whole-sign' | 'equal' | 'koch'; }; export type AsteroidsResponse = { /** * Echo of the birth moment and place used to compute every asteroid. */ birthDetails: { /** * Birth date in YYYY-MM-DD format. Determines planetary positions for the specific calendar day. */ date: string; /** * Birth time in 24-hour HH:MM:SS format. Determines the Ascendant (rising sign) and house cusps. Use 12:00:00 if unknown. */ time: string; /** * Birth location latitude in decimal degrees (-90 to 90). Positive = North, negative = South. */ latitude: number; /** * Birth location longitude in decimal degrees (-180 to 180). Positive = East, negative = West. */ longitude: number; /** * Timezone offset from UTC in decimal hours. Examples: New York = -5, London = 0, India = 5.5, Tokyo = 9. */ timezone: number; }; /** * House system actually used to place the asteroids, after any polar fallback to Whole Sign. */ houseSystem: 'placidus' | 'whole-sign' | 'equal' | 'koch'; /** * The four classical asteroid goddesses in canonical order: Ceres, Pallas, Juno, and Vesta, each with its tropical position, house, motion, and interpretation. */ asteroids: Array<{ /** * Name of the asteroid: Ceres, Pallas, Juno, or Vesta. Always English, whatever the lang parameter says, so it stays safe to compare against in code. Use nameLocalized for anything a reader sees. */ name: string; /** * Asteroid name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ nameLocalized?: string; /** * Absolute tropical ecliptic longitude of the asteroid in degrees (0 to 360). */ longitude: number; /** * Ecliptic latitude in degrees, the angular distance north or south of the ecliptic plane. */ latitude: number; /** * Tropical zodiac sign the asteroid falls in. */ sign: string; /** * Degree of the asteroid within its zodiac sign (0 to 29.999). */ degree: number; /** * Natal house placement (1 to 12) from the selected house system and birth location. */ house: number; /** * Daily motion in degrees per day. Negative values indicate retrograde motion. */ speed: number; /** * Whether the asteroid appears to move backward from Earth, true when the daily speed is negative. */ isRetrograde: boolean; /** * Plain language meaning of this asteroid in its sign, suitable for chart reports and AI agents. Localized to the requested language. */ interpretation: string; }>; /** * Short overview of the asteroid set for previews and report intros. */ summary: string; }; export type AsteroidsRequest = { /** * Birth date in YYYY-MM-DD format. Determines planetary positions for the specific calendar day. */ date: string; /** * Birth time in 24-hour HH:MM:SS format. Determines the Ascendant (rising sign) and house cusps. Use 12:00:00 if unknown. */ time: string; /** * Birth location latitude in decimal degrees (-90 to 90). Positive = North, negative = South. */ latitude: number; /** * Birth location longitude in decimal degrees (-180 to 180). Positive = East, negative = West. */ longitude: number; /** * Timezone: IANA name (e.g. "America/New_York", "Europe/London") OR decimal hours from UTC (e.g. -5 for EST, 1 for CET). IANA strings are resolved to the offset in force at the given date and time, so you can pass `cities[0].timezone` from /location/search directly. */ timezone: number | string; /** * Lunar node convention. "mean" is the smoothed average node, which always moves retrograde; "true" is the osculating node, which tracks the real perturbed node, oscillates up to about 1.5 degrees either side of the mean on a 173-day cycle, and can briefly turn direct. Neither is more correct and they almost always fall in the same sign. Applies to the North and South Node. True is the osculating node and the default, because it is what most Western chart software reports; mean is the smoothed node preferred by several evolutionary schools, so pass "mean" to match one. Nothing else in the chart changes, and the two agree on the sign except when the node sits within about 1.8 degrees of a cusp. Defaults to "true". */ nodeType?: 'mean' | 'true'; /** * House system used to assign each asteroid to a natal house. Placidus (default), Whole Sign, Equal, or Koch. Above the polar circle, quadrant systems fall back to Whole Sign and the echoed houseSystem reports the system actually used. */ houseSystem?: 'placidus' | 'whole-sign' | 'equal' | 'koch'; }; export type LilithResponse = { /** * Echo of the birth moment and place used to compute both Lilith variants. */ birthDetails: { /** * Birth date in YYYY-MM-DD format. Determines planetary positions for the specific calendar day. */ date: string; /** * Birth time in 24-hour HH:MM:SS format. Determines the Ascendant (rising sign) and house cusps. Use 12:00:00 if unknown. */ time: string; /** * Birth location latitude in decimal degrees (-90 to 90). Positive = North, negative = South. */ latitude: number; /** * Birth location longitude in decimal degrees (-180 to 180). Positive = East, negative = West. */ longitude: number; /** * Timezone offset from UTC in decimal hours. Examples: New York = -5, London = 0, India = 5.5, Tokyo = 9. */ timezone: number; }; /** * House system applied when placing each variant in a house. */ houseSystem: 'placidus' | 'whole-sign' | 'equal' | 'koch'; /** * Both Black Moon Lilith variants, the mean lunar apogee first and the true (osculating) apogee second. */ lilith: Array<{ /** * Which lunar apogee this entry describes. The mean variant is the smoothed average apogee; the true variant is the instantaneous osculating apogee. Always one of these two English literals, whatever the lang parameter says, so it stays safe to compare against in code. Use variantLocalized for anything a reader sees. */ variant: 'mean' | 'true'; /** * Apogee variant label in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ variantLocalized?: string; /** * Absolute tropical ecliptic longitude of the apogee in degrees (0 to 360). */ longitude: number; /** * Ecliptic latitude in degrees, the projection of the apogee off the ecliptic plane. Reaches up to about 5 degrees because the lunar orbit is inclined. */ latitude: number; /** * Tropical zodiac sign the apogee falls in, naming where the suppressed instinct lives. */ sign: string; /** * Degree of the apogee within its zodiac sign (0 to 29.999). */ degree: number; /** * House placement (1 to 12) in the selected house system, the area of life where the Lilith theme plays out. */ house: number; /** * Daily motion in degrees per day. The mean apogee is always positive (direct); the true apogee can be negative (retrograde). */ speed: number; /** * Whether the apogee is moving backward. Always false for the mean apogee; the true apogee turns retrograde when the osculating ellipse swings the apogee direction backward. */ isRetrograde: boolean; /** * Plain language meaning of this Lilith variant in its sign, suitable for chart reports and AI agents. Localized to the requested language. */ interpretation: string; /** * Short explanation of how this variant is defined and how it differs from the other, localized to the requested language. */ note: string; }>; /** * Short overview of both variants for previews and report intros. */ summary: string; }; export type LilithRequest = { /** * Birth date in YYYY-MM-DD format. Determines planetary positions for the specific calendar day. */ date: string; /** * Birth time in 24-hour HH:MM:SS format. Determines the Ascendant (rising sign) and house cusps. Use 12:00:00 if unknown. */ time: string; /** * Birth location latitude in decimal degrees (-90 to 90). Positive = North, negative = South. */ latitude: number; /** * Birth location longitude in decimal degrees (-180 to 180). Positive = East, negative = West. */ longitude: number; /** * Timezone: IANA name (e.g. "America/New_York", "Europe/London") OR decimal hours from UTC (e.g. -5 for EST, 1 for CET). IANA strings are resolved to the offset in force at the given date and time, so you can pass `cities[0].timezone` from /location/search directly. */ timezone: number | string; /** * Lunar node convention. "mean" is the smoothed average node, which always moves retrograde; "true" is the osculating node, which tracks the real perturbed node, oscillates up to about 1.5 degrees either side of the mean on a 173-day cycle, and can briefly turn direct. Neither is more correct and they almost always fall in the same sign. Applies to the North and South Node. True is the osculating node and the default, because it is what most Western chart software reports; mean is the smoothed node preferred by several evolutionary schools, so pass "mean" to match one. Nothing else in the chart changes, and the two agree on the sign except when the node sits within about 1.8 degrees of a cusp. Defaults to "true". */ nodeType?: 'mean' | 'true'; /** * House system used to place each Lilith variant in a house. Placidus (default), Whole Sign, Equal, or Koch. */ houseSystem?: 'placidus' | 'whole-sign' | 'equal' | 'koch'; }; export type ProgressionsResponse = { /** * Echo of the birth moment and place the progressed chart is built from. */ birthDetails: { /** * Birth date in YYYY-MM-DD format. Determines planetary positions for the specific calendar day. */ date: string; /** * Birth time in 24-hour HH:MM:SS format. Determines the Ascendant (rising sign) and house cusps. Use 12:00:00 if unknown. */ time: string; /** * Birth location latitude in decimal degrees (-90 to 90). Positive = North, negative = South. */ latitude: number; /** * Birth location longitude in decimal degrees (-180 to 180). Positive = East, negative = West. */ longitude: number; /** * Timezone offset from UTC in decimal hours. Examples: New York = -5, London = 0, India = 5.5, Tokyo = 9. */ timezone: number; }; /** * The requested date the chart was progressed to. */ targetDate: string; /** * UTC calendar date of the progressed moment, the ephemeris day whose real positions stand in for the target date. One day after birth per year of elapsed life. */ progressedDate: string; /** * Years elapsed between birth and the target date, measured in mean tropical years. Drives both the progressed planets and the Naibod progression of the angles. Negative values progress the chart converse (before birth). */ elapsedYears: number; /** * Every progressed body in canonical order: the 10 classical planets, the lunar nodes, Chiron, and Black Moon Lilith. The progressed Sun moves about one degree per year and the progressed Moon about one sign per two and a half years, so these two are the headline movers in any progressed reading. */ planets: Array<{ /** * Body name in canonical English. One of the 10 classical planets, the lunar nodes, Chiron, or Black Moon Lilith. Unchanged by the lang parameter, so it stays safe to compare against in code. Use nameLocalized for anything a reader sees. */ name: string; /** * Body name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ nameLocalized?: string; /** * Progressed tropical ecliptic longitude in degrees (0 to 360). */ longitude: number; /** * Tropical zodiac sign the progressed body falls in. Always English, whatever the lang parameter says. Use signLocalized for anything a reader sees. */ sign: string; /** * Zodiac sign name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ signLocalized?: string; /** * Degree of the progressed body within its zodiac sign (0 to 29.999). */ degree: number; /** * Whole-sign house (1 to 12) counted from the progressed Ascendant sign. The 1st house is the entire sign the progressed Ascendant falls in. */ house: number; /** * Daily motion of the body at the progressed instant in degrees per day. Negative values indicate retrograde motion. */ speed: number; /** * Whether the body is retrograde at the progressed instant, true when the daily speed is negative. */ isRetrograde: boolean; /** * Plain language meaning of this progressed body in its sign, suitable for chart reports and AI agents. Localized to the requested language. */ interpretation: string; }>; /** * Progressed Ascendant, the rising degree advanced by the Naibod arc per year. Marks the evolving outward style and immediate environment. */ ascendant: { /** * Absolute tropical ecliptic longitude of the progressed angle in degrees (0 to 360). */ longitude: number; /** * Tropical zodiac sign the progressed angle falls in. Always English, whatever the lang parameter says. Use signLocalized for anything a reader sees. */ sign: string; /** * Zodiac sign name on this angle in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ signLocalized?: string; /** * Degree of the progressed angle within its zodiac sign (0 to 29.999). */ degree: number; }; /** * Progressed Midheaven, the culminating degree advanced by the Naibod arc per year. Marks the evolving vocation and public direction. */ midheaven: { /** * Absolute tropical ecliptic longitude of the progressed angle in degrees (0 to 360). */ longitude: number; /** * Tropical zodiac sign the progressed angle falls in. Always English, whatever the lang parameter says. Use signLocalized for anything a reader sees. */ sign: string; /** * Zodiac sign name on this angle in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ signLocalized?: string; /** * Degree of the progressed angle within its zodiac sign (0 to 29.999). */ degree: number; }; /** * Short overview of the progressed chart led by the progressed Sun and Moon. Localized to the requested language. */ summary: string; }; export type ProgressionsRequest = { /** * Birth date in YYYY-MM-DD format. Determines planetary positions for the specific calendar day. */ date: string; /** * Birth time in 24-hour HH:MM:SS format. Determines the Ascendant (rising sign) and house cusps. Use 12:00:00 if unknown. */ time: string; /** * Birth location latitude in decimal degrees (-90 to 90). Positive = North, negative = South. */ latitude: number; /** * Birth location longitude in decimal degrees (-180 to 180). Positive = East, negative = West. */ longitude: number; /** * Timezone: IANA name (e.g. "America/New_York", "Europe/London") OR decimal hours from UTC (e.g. -5 for EST, 1 for CET). IANA strings are resolved to the offset in force at the given date and time, so you can pass `cities[0].timezone` from /location/search directly. */ timezone: number | string; /** * Lunar node convention. "mean" is the smoothed average node, which always moves retrograde; "true" is the osculating node, which tracks the real perturbed node, oscillates up to about 1.5 degrees either side of the mean on a 173-day cycle, and can briefly turn direct. Neither is more correct and they almost always fall in the same sign. Applies to the North and South Node. True is the osculating node and the default, because it is what most Western chart software reports; mean is the smoothed node preferred by several evolutionary schools, so pass "mean" to match one. Nothing else in the chart changes, and the two agree on the sign except when the node sits within about 1.8 degrees of a cusp. Defaults to "true". */ nodeType?: 'mean' | 'true'; /** * Date to progress the chart to, in YYYY-MM-DD format. Usually today or a forecast date. The day-for-a-year key turns the elapsed years since birth into the same number of ephemeris days after the birth moment. */ targetDate: string; }; export type SolarArcResponse = { /** * Echo of the birth moment and place used to compute the natal chart and the solar arc. */ birthDetails: { /** * Birth date in YYYY-MM-DD format. Determines planetary positions for the specific calendar day. */ date: string; /** * Birth time in 24-hour HH:MM:SS format. Determines the Ascendant (rising sign) and house cusps. Use 12:00:00 if unknown. */ time: string; /** * Birth location latitude in decimal degrees (-90 to 90). Positive = North, negative = South. */ latitude: number; /** * Birth location longitude in decimal degrees (-180 to 180). Positive = East, negative = West. */ longitude: number; /** * Timezone offset from UTC in decimal hours. Examples: New York = -5, London = 0, India = 5.5, Tokyo = 9. */ timezone: number; }; /** * Echo of the date the chart was directed to. */ targetDate: string; /** * The solar arc in degrees: the secondary-progressed Sun longitude minus the natal Sun longitude. Approximately one degree per year of life. Every natal point is advanced by exactly this arc. */ solarArc: number; /** * Short overview of the directed chart for previews and report intros. Localized to the requested language. */ summary: string; /** * Every natal point advanced by the solar arc: the planets and bodies in canonical order first, then the Ascendant and the Midheaven. */ directed: Array<{ /** * Name of the directed point, covering the planets and the two angles, the Ascendant and the Midheaven, alike. Always English, whatever the lang parameter says, so it stays safe to compare against in code. Use nameLocalized for anything a reader sees. */ name: string; /** * Directed point name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ nameLocalized?: string; /** * Absolute tropical ecliptic longitude of the point in the natal chart, in degrees (0 to 360). */ natalLongitude: number; /** * Absolute tropical ecliptic longitude after directing, in degrees (0 to 360). Equals the natal longitude plus the solar arc, normalized to a full circle. */ directedLongitude: number; /** * Tropical zodiac sign the directed point falls in. A directed point crossing into a new sign marks a developmental turning point. */ sign: string; /** * Degree of the directed point within its zodiac sign (0 to 29.999). */ degree: number; /** * Plain language meaning of this directed point, suitable for chart reports and AI agents. Localized to the requested language. */ interpretation: string; }>; }; export type SolarArcRequest = { /** * Birth date in YYYY-MM-DD format. Determines planetary positions for the specific calendar day. */ date: string; /** * Birth time in 24-hour HH:MM:SS format. Determines the Ascendant (rising sign) and house cusps. Use 12:00:00 if unknown. */ time: string; /** * Birth location latitude in decimal degrees (-90 to 90). Positive = North, negative = South. */ latitude: number; /** * Birth location longitude in decimal degrees (-180 to 180). Positive = East, negative = West. */ longitude: number; /** * Timezone: IANA name (e.g. "America/New_York", "Europe/London") OR decimal hours from UTC (e.g. -5 for EST, 1 for CET). IANA strings are resolved to the offset in force at the given date and time, so you can pass `cities[0].timezone` from /location/search directly. */ timezone: number | string; /** * Lunar node convention. "mean" is the smoothed average node, which always moves retrograde; "true" is the osculating node, which tracks the real perturbed node, oscillates up to about 1.5 degrees either side of the mean on a 173-day cycle, and can briefly turn direct. Neither is more correct and they almost always fall in the same sign. Applies to the North and South Node. True is the osculating node and the default, because it is what most Western chart software reports; mean is the smoothed node preferred by several evolutionary schools, so pass "mean" to match one. Nothing else in the chart changes, and the two agree on the sign except when the node sits within about 1.8 degrees of a cusp. Defaults to "true". */ nodeType?: 'mean' | 'true'; /** * Date to direct the chart to, in YYYY-MM-DD format. Every natal point is advanced by the solar arc accumulated from birth to this date, about one degree for each year of life. */ targetDate: string; }; export type ProfectionsResponse = { /** * Echo of the birth moment and place used to derive the natal Ascendant and the lord of the year placement. */ birthDetails: { /** * Birth date in YYYY-MM-DD format. Determines planetary positions for the specific calendar day. */ date: string; /** * Birth time in 24-hour HH:MM:SS format. Determines the Ascendant (rising sign) and house cusps. Use 12:00:00 if unknown. */ time: string; /** * Birth location latitude in decimal degrees (-90 to 90). Positive = North, negative = South. */ latitude: number; /** * Birth location longitude in decimal degrees (-180 to 180). Positive = East, negative = West. */ longitude: number; /** * Timezone offset from UTC in decimal hours. Examples: New York = -5, London = 0, India = 5.5, Tokyo = 9. */ timezone: number; }; /** * Target date whose profection year was computed, echoed from the request. */ targetDate: string; /** * Completed whole years from birth to the target date. Age 0 is the birth year and profects the first house. */ age: number; /** * Profected whole sign house activated for the year (1 to 12), computed as age modulo 12 plus 1. House 1 is the rising sign and the cycle repeats every twelve years. */ profectedHouse: number; /** * Tropical zodiac sign on the profected house: the rising sign advanced by one whole sign for each completed year. */ profectedSign: string; /** * Lord of the year (annual time lord): the traditional ruling planet of the profected sign whose natal condition and transits color the themes of the year. */ lordOfYear: string; /** * Where the lord of the year sits in the birth chart: the natal sign and house that ground the theme of the profection year. */ lordNatalPosition: { /** * Zodiac sign the lord of the year occupies in the natal chart. */ sign: string; /** * Natal house the lord of the year occupies (1 to 12), in the requested house system. */ house: number; }; /** * Plain language reading of the profection year, combining the profected house theme, the profected sign, and the lord of the year. Localized to the requested language. */ interpretation: string; /** * Short overview of the profection year for previews and report intros. */ summary: string; }; export type ProfectionsRequest = { /** * Birth date in YYYY-MM-DD format. Determines planetary positions for the specific calendar day. */ date: string; /** * Birth time in 24-hour HH:MM:SS format. Determines the Ascendant (rising sign) and house cusps. Use 12:00:00 if unknown. */ time: string; /** * Birth location latitude in decimal degrees (-90 to 90). Positive = North, negative = South. */ latitude: number; /** * Birth location longitude in decimal degrees (-180 to 180). Positive = East, negative = West. */ longitude: number; /** * Timezone: IANA name (e.g. "America/New_York", "Europe/London") OR decimal hours from UTC (e.g. -5 for EST, 1 for CET). IANA strings are resolved to the offset in force at the given date and time, so you can pass `cities[0].timezone` from /location/search directly. */ timezone: number | string; /** * Lunar node convention. "mean" is the smoothed average node, which always moves retrograde; "true" is the osculating node, which tracks the real perturbed node, oscillates up to about 1.5 degrees either side of the mean on a 173-day cycle, and can briefly turn direct. Neither is more correct and they almost always fall in the same sign. Applies to the North and South Node. True is the osculating node and the default, because it is what most Western chart software reports; mean is the smoothed node preferred by several evolutionary schools, so pass "mean" to match one. Nothing else in the chart changes, and the two agree on the sign except when the node sits within about 1.8 degrees of a cusp. Defaults to "true". */ nodeType?: 'mean' | 'true'; /** * Date whose profection year you want, in YYYY-MM-DD format. The completed whole years from the birth date to this date select the profected house and sign. Must fall on or after the birth date. */ targetDate: string; /** * House system used only to report where the lord of the year sits in the natal chart. The profected house and sign always use whole sign profection from the rising sign. Placidus (default), Whole Sign, Equal, or Koch. */ houseSystem?: 'placidus' | 'whole-sign' | 'equal' | 'koch'; }; export type BirthChartResponse = { aries: { /** * Zodiac sign name in lowercase. Always equals the key of the block it sits in, so the aries block carries "aries" and the pisces block carries "pisces". */ rashi: string; /** * Planets placed in this zodiac sign. */ signs: Array<{ /** * Planet (graha) placed in this sign. */ graha: string; /** * Sidereal longitude in degrees (0-360) using Lahiri ayanamsa. */ longitude: number; nakshatra: { /** * Nakshatra (lunar mansion, 1 of 27) the planet occupies. */ name: string; /** * Nakshatra pada (quarter, 1-4). Each nakshatra has 4 padas of 3 degrees 20 each. */ pada: number; /** * Nakshatra index (1-27) in the zodiac sequence starting from Ashwini. */ key: number; /** * Vimshottari ruling planet of this nakshatra. One of the nine grahas (Ketu, Venus, Sun, Moon, Mars, Rahu, Jupiter, Saturn, Mercury). Drives the dasha sequence and the nakshatra qualities. */ lord: 'Ketu' | 'Venus' | 'Sun' | 'Moon' | 'Mars' | 'Rahu' | 'Jupiter' | 'Saturn' | 'Mercury'; }; /** * True if planet is in retrograde motion (appears to move backward). Retrograde planets have altered significations. */ isRetrograde: boolean; /** * Bhava (house) number 1-12, counted whole-sign from the Lagna (house 1 is the Lagna rashi). Present on the D1 birth chart; divisional charts (navamsa, varga) omit it. */ house?: number; /** * Baladi avastha, the planetary age-state set by the graha degree within its sign: Bala (infant), Kumara (child), Yuva (adult, strongest results), Vriddha (old), Mrita (dead, weakest). Bands run forward in odd signs and reversed in even signs. D1 birth chart only. */ awastha?: 'Bala' | 'Kumara' | 'Yuva' | 'Vriddha' | 'Mrita'; /** * Jagradadi avastha, the waking state of the graha set by its sign dignity: Jagrat (awake, own sign or exaltation, full results), Swapna (dreaming, a friendly or neutral sign, medium results), Sushupti (sleeping, an enemy sign or debilitation, no results). Present for the seven classical grahas on the D1 chart; Rahu, Ketu and the Lagna own no sign and are omitted. */ jagradadi?: 'Jagrat' | 'Swapna' | 'Sushupti'; /** * Deeptadi avastha, the dispositional state of the graha, one of nine: Dipta (exalted, blazing), Svastha (own sign, healthy), Pramudita (great friend sign, delighted), Shanta (friendly sign, at peace), Dina (neutral sign, helpless), Duhkhita (enemy sign, sorrowful), Khala (great enemy sign, harsh), Vikala (joined by a natural malefic, disabled), Kopa (eclipsed by the Sun, enraged). Where more than one applies the more severe is returned, so combustion outranks a malefic conjunction, which outranks the sign reading. Present for the seven classical grahas on the D1 chart; Rahu, Ketu and the Lagna are omitted. */ deeptadi?: 'Dipta' | 'Svastha' | 'Pramudita' | 'Shanta' | 'Dina' | 'Duhkhita' | 'Vikala' | 'Khala' | 'Kopa'; }>; }; taurus: { /** * Zodiac sign name in lowercase. Always equals the key of the block it sits in, so the aries block carries "aries" and the pisces block carries "pisces". */ rashi: string; /** * Planets placed in this zodiac sign. */ signs: Array<{ /** * Planet (graha) placed in this sign. */ graha: string; /** * Sidereal longitude in degrees (0-360) using Lahiri ayanamsa. */ longitude: number; nakshatra: { /** * Nakshatra (lunar mansion, 1 of 27) the planet occupies. */ name: string; /** * Nakshatra pada (quarter, 1-4). Each nakshatra has 4 padas of 3 degrees 20 each. */ pada: number; /** * Nakshatra index (1-27) in the zodiac sequence starting from Ashwini. */ key: number; /** * Vimshottari ruling planet of this nakshatra. One of the nine grahas (Ketu, Venus, Sun, Moon, Mars, Rahu, Jupiter, Saturn, Mercury). Drives the dasha sequence and the nakshatra qualities. */ lord: 'Ketu' | 'Venus' | 'Sun' | 'Moon' | 'Mars' | 'Rahu' | 'Jupiter' | 'Saturn' | 'Mercury'; }; /** * True if planet is in retrograde motion (appears to move backward). Retrograde planets have altered significations. */ isRetrograde: boolean; /** * Bhava (house) number 1-12, counted whole-sign from the Lagna (house 1 is the Lagna rashi). Present on the D1 birth chart; divisional charts (navamsa, varga) omit it. */ house?: number; /** * Baladi avastha, the planetary age-state set by the graha degree within its sign: Bala (infant), Kumara (child), Yuva (adult, strongest results), Vriddha (old), Mrita (dead, weakest). Bands run forward in odd signs and reversed in even signs. D1 birth chart only. */ awastha?: 'Bala' | 'Kumara' | 'Yuva' | 'Vriddha' | 'Mrita'; /** * Jagradadi avastha, the waking state of the graha set by its sign dignity: Jagrat (awake, own sign or exaltation, full results), Swapna (dreaming, a friendly or neutral sign, medium results), Sushupti (sleeping, an enemy sign or debilitation, no results). Present for the seven classical grahas on the D1 chart; Rahu, Ketu and the Lagna own no sign and are omitted. */ jagradadi?: 'Jagrat' | 'Swapna' | 'Sushupti'; /** * Deeptadi avastha, the dispositional state of the graha, one of nine: Dipta (exalted, blazing), Svastha (own sign, healthy), Pramudita (great friend sign, delighted), Shanta (friendly sign, at peace), Dina (neutral sign, helpless), Duhkhita (enemy sign, sorrowful), Khala (great enemy sign, harsh), Vikala (joined by a natural malefic, disabled), Kopa (eclipsed by the Sun, enraged). Where more than one applies the more severe is returned, so combustion outranks a malefic conjunction, which outranks the sign reading. Present for the seven classical grahas on the D1 chart; Rahu, Ketu and the Lagna are omitted. */ deeptadi?: 'Dipta' | 'Svastha' | 'Pramudita' | 'Shanta' | 'Dina' | 'Duhkhita' | 'Vikala' | 'Khala' | 'Kopa'; }>; }; gemini: { /** * Zodiac sign name in lowercase. Always equals the key of the block it sits in, so the aries block carries "aries" and the pisces block carries "pisces". */ rashi: string; /** * Planets placed in this zodiac sign. */ signs: Array<{ /** * Planet (graha) placed in this sign. */ graha: string; /** * Sidereal longitude in degrees (0-360) using Lahiri ayanamsa. */ longitude: number; nakshatra: { /** * Nakshatra (lunar mansion, 1 of 27) the planet occupies. */ name: string; /** * Nakshatra pada (quarter, 1-4). Each nakshatra has 4 padas of 3 degrees 20 each. */ pada: number; /** * Nakshatra index (1-27) in the zodiac sequence starting from Ashwini. */ key: number; /** * Vimshottari ruling planet of this nakshatra. One of the nine grahas (Ketu, Venus, Sun, Moon, Mars, Rahu, Jupiter, Saturn, Mercury). Drives the dasha sequence and the nakshatra qualities. */ lord: 'Ketu' | 'Venus' | 'Sun' | 'Moon' | 'Mars' | 'Rahu' | 'Jupiter' | 'Saturn' | 'Mercury'; }; /** * True if planet is in retrograde motion (appears to move backward). Retrograde planets have altered significations. */ isRetrograde: boolean; /** * Bhava (house) number 1-12, counted whole-sign from the Lagna (house 1 is the Lagna rashi). Present on the D1 birth chart; divisional charts (navamsa, varga) omit it. */ house?: number; /** * Baladi avastha, the planetary age-state set by the graha degree within its sign: Bala (infant), Kumara (child), Yuva (adult, strongest results), Vriddha (old), Mrita (dead, weakest). Bands run forward in odd signs and reversed in even signs. D1 birth chart only. */ awastha?: 'Bala' | 'Kumara' | 'Yuva' | 'Vriddha' | 'Mrita'; /** * Jagradadi avastha, the waking state of the graha set by its sign dignity: Jagrat (awake, own sign or exaltation, full results), Swapna (dreaming, a friendly or neutral sign, medium results), Sushupti (sleeping, an enemy sign or debilitation, no results). Present for the seven classical grahas on the D1 chart; Rahu, Ketu and the Lagna own no sign and are omitted. */ jagradadi?: 'Jagrat' | 'Swapna' | 'Sushupti'; /** * Deeptadi avastha, the dispositional state of the graha, one of nine: Dipta (exalted, blazing), Svastha (own sign, healthy), Pramudita (great friend sign, delighted), Shanta (friendly sign, at peace), Dina (neutral sign, helpless), Duhkhita (enemy sign, sorrowful), Khala (great enemy sign, harsh), Vikala (joined by a natural malefic, disabled), Kopa (eclipsed by the Sun, enraged). Where more than one applies the more severe is returned, so combustion outranks a malefic conjunction, which outranks the sign reading. Present for the seven classical grahas on the D1 chart; Rahu, Ketu and the Lagna are omitted. */ deeptadi?: 'Dipta' | 'Svastha' | 'Pramudita' | 'Shanta' | 'Dina' | 'Duhkhita' | 'Vikala' | 'Khala' | 'Kopa'; }>; }; cancer: { /** * Zodiac sign name in lowercase. Always equals the key of the block it sits in, so the aries block carries "aries" and the pisces block carries "pisces". */ rashi: string; /** * Planets placed in this zodiac sign. */ signs: Array<{ /** * Planet (graha) placed in this sign. */ graha: string; /** * Sidereal longitude in degrees (0-360) using Lahiri ayanamsa. */ longitude: number; nakshatra: { /** * Nakshatra (lunar mansion, 1 of 27) the planet occupies. */ name: string; /** * Nakshatra pada (quarter, 1-4). Each nakshatra has 4 padas of 3 degrees 20 each. */ pada: number; /** * Nakshatra index (1-27) in the zodiac sequence starting from Ashwini. */ key: number; /** * Vimshottari ruling planet of this nakshatra. One of the nine grahas (Ketu, Venus, Sun, Moon, Mars, Rahu, Jupiter, Saturn, Mercury). Drives the dasha sequence and the nakshatra qualities. */ lord: 'Ketu' | 'Venus' | 'Sun' | 'Moon' | 'Mars' | 'Rahu' | 'Jupiter' | 'Saturn' | 'Mercury'; }; /** * True if planet is in retrograde motion (appears to move backward). Retrograde planets have altered significations. */ isRetrograde: boolean; /** * Bhava (house) number 1-12, counted whole-sign from the Lagna (house 1 is the Lagna rashi). Present on the D1 birth chart; divisional charts (navamsa, varga) omit it. */ house?: number; /** * Baladi avastha, the planetary age-state set by the graha degree within its sign: Bala (infant), Kumara (child), Yuva (adult, strongest results), Vriddha (old), Mrita (dead, weakest). Bands run forward in odd signs and reversed in even signs. D1 birth chart only. */ awastha?: 'Bala' | 'Kumara' | 'Yuva' | 'Vriddha' | 'Mrita'; /** * Jagradadi avastha, the waking state of the graha set by its sign dignity: Jagrat (awake, own sign or exaltation, full results), Swapna (dreaming, a friendly or neutral sign, medium results), Sushupti (sleeping, an enemy sign or debilitation, no results). Present for the seven classical grahas on the D1 chart; Rahu, Ketu and the Lagna own no sign and are omitted. */ jagradadi?: 'Jagrat' | 'Swapna' | 'Sushupti'; /** * Deeptadi avastha, the dispositional state of the graha, one of nine: Dipta (exalted, blazing), Svastha (own sign, healthy), Pramudita (great friend sign, delighted), Shanta (friendly sign, at peace), Dina (neutral sign, helpless), Duhkhita (enemy sign, sorrowful), Khala (great enemy sign, harsh), Vikala (joined by a natural malefic, disabled), Kopa (eclipsed by the Sun, enraged). Where more than one applies the more severe is returned, so combustion outranks a malefic conjunction, which outranks the sign reading. Present for the seven classical grahas on the D1 chart; Rahu, Ketu and the Lagna are omitted. */ deeptadi?: 'Dipta' | 'Svastha' | 'Pramudita' | 'Shanta' | 'Dina' | 'Duhkhita' | 'Vikala' | 'Khala' | 'Kopa'; }>; }; leo: { /** * Zodiac sign name in lowercase. Always equals the key of the block it sits in, so the aries block carries "aries" and the pisces block carries "pisces". */ rashi: string; /** * Planets placed in this zodiac sign. */ signs: Array<{ /** * Planet (graha) placed in this sign. */ graha: string; /** * Sidereal longitude in degrees (0-360) using Lahiri ayanamsa. */ longitude: number; nakshatra: { /** * Nakshatra (lunar mansion, 1 of 27) the planet occupies. */ name: string; /** * Nakshatra pada (quarter, 1-4). Each nakshatra has 4 padas of 3 degrees 20 each. */ pada: number; /** * Nakshatra index (1-27) in the zodiac sequence starting from Ashwini. */ key: number; /** * Vimshottari ruling planet of this nakshatra. One of the nine grahas (Ketu, Venus, Sun, Moon, Mars, Rahu, Jupiter, Saturn, Mercury). Drives the dasha sequence and the nakshatra qualities. */ lord: 'Ketu' | 'Venus' | 'Sun' | 'Moon' | 'Mars' | 'Rahu' | 'Jupiter' | 'Saturn' | 'Mercury'; }; /** * True if planet is in retrograde motion (appears to move backward). Retrograde planets have altered significations. */ isRetrograde: boolean; /** * Bhava (house) number 1-12, counted whole-sign from the Lagna (house 1 is the Lagna rashi). Present on the D1 birth chart; divisional charts (navamsa, varga) omit it. */ house?: number; /** * Baladi avastha, the planetary age-state set by the graha degree within its sign: Bala (infant), Kumara (child), Yuva (adult, strongest results), Vriddha (old), Mrita (dead, weakest). Bands run forward in odd signs and reversed in even signs. D1 birth chart only. */ awastha?: 'Bala' | 'Kumara' | 'Yuva' | 'Vriddha' | 'Mrita'; /** * Jagradadi avastha, the waking state of the graha set by its sign dignity: Jagrat (awake, own sign or exaltation, full results), Swapna (dreaming, a friendly or neutral sign, medium results), Sushupti (sleeping, an enemy sign or debilitation, no results). Present for the seven classical grahas on the D1 chart; Rahu, Ketu and the Lagna own no sign and are omitted. */ jagradadi?: 'Jagrat' | 'Swapna' | 'Sushupti'; /** * Deeptadi avastha, the dispositional state of the graha, one of nine: Dipta (exalted, blazing), Svastha (own sign, healthy), Pramudita (great friend sign, delighted), Shanta (friendly sign, at peace), Dina (neutral sign, helpless), Duhkhita (enemy sign, sorrowful), Khala (great enemy sign, harsh), Vikala (joined by a natural malefic, disabled), Kopa (eclipsed by the Sun, enraged). Where more than one applies the more severe is returned, so combustion outranks a malefic conjunction, which outranks the sign reading. Present for the seven classical grahas on the D1 chart; Rahu, Ketu and the Lagna are omitted. */ deeptadi?: 'Dipta' | 'Svastha' | 'Pramudita' | 'Shanta' | 'Dina' | 'Duhkhita' | 'Vikala' | 'Khala' | 'Kopa'; }>; }; virgo: { /** * Zodiac sign name in lowercase. Always equals the key of the block it sits in, so the aries block carries "aries" and the pisces block carries "pisces". */ rashi: string; /** * Planets placed in this zodiac sign. */ signs: Array<{ /** * Planet (graha) placed in this sign. */ graha: string; /** * Sidereal longitude in degrees (0-360) using Lahiri ayanamsa. */ longitude: number; nakshatra: { /** * Nakshatra (lunar mansion, 1 of 27) the planet occupies. */ name: string; /** * Nakshatra pada (quarter, 1-4). Each nakshatra has 4 padas of 3 degrees 20 each. */ pada: number; /** * Nakshatra index (1-27) in the zodiac sequence starting from Ashwini. */ key: number; /** * Vimshottari ruling planet of this nakshatra. One of the nine grahas (Ketu, Venus, Sun, Moon, Mars, Rahu, Jupiter, Saturn, Mercury). Drives the dasha sequence and the nakshatra qualities. */ lord: 'Ketu' | 'Venus' | 'Sun' | 'Moon' | 'Mars' | 'Rahu' | 'Jupiter' | 'Saturn' | 'Mercury'; }; /** * True if planet is in retrograde motion (appears to move backward). Retrograde planets have altered significations. */ isRetrograde: boolean; /** * Bhava (house) number 1-12, counted whole-sign from the Lagna (house 1 is the Lagna rashi). Present on the D1 birth chart; divisional charts (navamsa, varga) omit it. */ house?: number; /** * Baladi avastha, the planetary age-state set by the graha degree within its sign: Bala (infant), Kumara (child), Yuva (adult, strongest results), Vriddha (old), Mrita (dead, weakest). Bands run forward in odd signs and reversed in even signs. D1 birth chart only. */ awastha?: 'Bala' | 'Kumara' | 'Yuva' | 'Vriddha' | 'Mrita'; /** * Jagradadi avastha, the waking state of the graha set by its sign dignity: Jagrat (awake, own sign or exaltation, full results), Swapna (dreaming, a friendly or neutral sign, medium results), Sushupti (sleeping, an enemy sign or debilitation, no results). Present for the seven classical grahas on the D1 chart; Rahu, Ketu and the Lagna own no sign and are omitted. */ jagradadi?: 'Jagrat' | 'Swapna' | 'Sushupti'; /** * Deeptadi avastha, the dispositional state of the graha, one of nine: Dipta (exalted, blazing), Svastha (own sign, healthy), Pramudita (great friend sign, delighted), Shanta (friendly sign, at peace), Dina (neutral sign, helpless), Duhkhita (enemy sign, sorrowful), Khala (great enemy sign, harsh), Vikala (joined by a natural malefic, disabled), Kopa (eclipsed by the Sun, enraged). Where more than one applies the more severe is returned, so combustion outranks a malefic conjunction, which outranks the sign reading. Present for the seven classical grahas on the D1 chart; Rahu, Ketu and the Lagna are omitted. */ deeptadi?: 'Dipta' | 'Svastha' | 'Pramudita' | 'Shanta' | 'Dina' | 'Duhkhita' | 'Vikala' | 'Khala' | 'Kopa'; }>; }; libra: { /** * Zodiac sign name in lowercase. Always equals the key of the block it sits in, so the aries block carries "aries" and the pisces block carries "pisces". */ rashi: string; /** * Planets placed in this zodiac sign. */ signs: Array<{ /** * Planet (graha) placed in this sign. */ graha: string; /** * Sidereal longitude in degrees (0-360) using Lahiri ayanamsa. */ longitude: number; nakshatra: { /** * Nakshatra (lunar mansion, 1 of 27) the planet occupies. */ name: string; /** * Nakshatra pada (quarter, 1-4). Each nakshatra has 4 padas of 3 degrees 20 each. */ pada: number; /** * Nakshatra index (1-27) in the zodiac sequence starting from Ashwini. */ key: number; /** * Vimshottari ruling planet of this nakshatra. One of the nine grahas (Ketu, Venus, Sun, Moon, Mars, Rahu, Jupiter, Saturn, Mercury). Drives the dasha sequence and the nakshatra qualities. */ lord: 'Ketu' | 'Venus' | 'Sun' | 'Moon' | 'Mars' | 'Rahu' | 'Jupiter' | 'Saturn' | 'Mercury'; }; /** * True if planet is in retrograde motion (appears to move backward). Retrograde planets have altered significations. */ isRetrograde: boolean; /** * Bhava (house) number 1-12, counted whole-sign from the Lagna (house 1 is the Lagna rashi). Present on the D1 birth chart; divisional charts (navamsa, varga) omit it. */ house?: number; /** * Baladi avastha, the planetary age-state set by the graha degree within its sign: Bala (infant), Kumara (child), Yuva (adult, strongest results), Vriddha (old), Mrita (dead, weakest). Bands run forward in odd signs and reversed in even signs. D1 birth chart only. */ awastha?: 'Bala' | 'Kumara' | 'Yuva' | 'Vriddha' | 'Mrita'; /** * Jagradadi avastha, the waking state of the graha set by its sign dignity: Jagrat (awake, own sign or exaltation, full results), Swapna (dreaming, a friendly or neutral sign, medium results), Sushupti (sleeping, an enemy sign or debilitation, no results). Present for the seven classical grahas on the D1 chart; Rahu, Ketu and the Lagna own no sign and are omitted. */ jagradadi?: 'Jagrat' | 'Swapna' | 'Sushupti'; /** * Deeptadi avastha, the dispositional state of the graha, one of nine: Dipta (exalted, blazing), Svastha (own sign, healthy), Pramudita (great friend sign, delighted), Shanta (friendly sign, at peace), Dina (neutral sign, helpless), Duhkhita (enemy sign, sorrowful), Khala (great enemy sign, harsh), Vikala (joined by a natural malefic, disabled), Kopa (eclipsed by the Sun, enraged). Where more than one applies the more severe is returned, so combustion outranks a malefic conjunction, which outranks the sign reading. Present for the seven classical grahas on the D1 chart; Rahu, Ketu and the Lagna are omitted. */ deeptadi?: 'Dipta' | 'Svastha' | 'Pramudita' | 'Shanta' | 'Dina' | 'Duhkhita' | 'Vikala' | 'Khala' | 'Kopa'; }>; }; scorpio: { /** * Zodiac sign name in lowercase. Always equals the key of the block it sits in, so the aries block carries "aries" and the pisces block carries "pisces". */ rashi: string; /** * Planets placed in this zodiac sign. */ signs: Array<{ /** * Planet (graha) placed in this sign. */ graha: string; /** * Sidereal longitude in degrees (0-360) using Lahiri ayanamsa. */ longitude: number; nakshatra: { /** * Nakshatra (lunar mansion, 1 of 27) the planet occupies. */ name: string; /** * Nakshatra pada (quarter, 1-4). Each nakshatra has 4 padas of 3 degrees 20 each. */ pada: number; /** * Nakshatra index (1-27) in the zodiac sequence starting from Ashwini. */ key: number; /** * Vimshottari ruling planet of this nakshatra. One of the nine grahas (Ketu, Venus, Sun, Moon, Mars, Rahu, Jupiter, Saturn, Mercury). Drives the dasha sequence and the nakshatra qualities. */ lord: 'Ketu' | 'Venus' | 'Sun' | 'Moon' | 'Mars' | 'Rahu' | 'Jupiter' | 'Saturn' | 'Mercury'; }; /** * True if planet is in retrograde motion (appears to move backward). Retrograde planets have altered significations. */ isRetrograde: boolean; /** * Bhava (house) number 1-12, counted whole-sign from the Lagna (house 1 is the Lagna rashi). Present on the D1 birth chart; divisional charts (navamsa, varga) omit it. */ house?: number; /** * Baladi avastha, the planetary age-state set by the graha degree within its sign: Bala (infant), Kumara (child), Yuva (adult, strongest results), Vriddha (old), Mrita (dead, weakest). Bands run forward in odd signs and reversed in even signs. D1 birth chart only. */ awastha?: 'Bala' | 'Kumara' | 'Yuva' | 'Vriddha' | 'Mrita'; /** * Jagradadi avastha, the waking state of the graha set by its sign dignity: Jagrat (awake, own sign or exaltation, full results), Swapna (dreaming, a friendly or neutral sign, medium results), Sushupti (sleeping, an enemy sign or debilitation, no results). Present for the seven classical grahas on the D1 chart; Rahu, Ketu and the Lagna own no sign and are omitted. */ jagradadi?: 'Jagrat' | 'Swapna' | 'Sushupti'; /** * Deeptadi avastha, the dispositional state of the graha, one of nine: Dipta (exalted, blazing), Svastha (own sign, healthy), Pramudita (great friend sign, delighted), Shanta (friendly sign, at peace), Dina (neutral sign, helpless), Duhkhita (enemy sign, sorrowful), Khala (great enemy sign, harsh), Vikala (joined by a natural malefic, disabled), Kopa (eclipsed by the Sun, enraged). Where more than one applies the more severe is returned, so combustion outranks a malefic conjunction, which outranks the sign reading. Present for the seven classical grahas on the D1 chart; Rahu, Ketu and the Lagna are omitted. */ deeptadi?: 'Dipta' | 'Svastha' | 'Pramudita' | 'Shanta' | 'Dina' | 'Duhkhita' | 'Vikala' | 'Khala' | 'Kopa'; }>; }; sagittarius: { /** * Zodiac sign name in lowercase. Always equals the key of the block it sits in, so the aries block carries "aries" and the pisces block carries "pisces". */ rashi: string; /** * Planets placed in this zodiac sign. */ signs: Array<{ /** * Planet (graha) placed in this sign. */ graha: string; /** * Sidereal longitude in degrees (0-360) using Lahiri ayanamsa. */ longitude: number; nakshatra: { /** * Nakshatra (lunar mansion, 1 of 27) the planet occupies. */ name: string; /** * Nakshatra pada (quarter, 1-4). Each nakshatra has 4 padas of 3 degrees 20 each. */ pada: number; /** * Nakshatra index (1-27) in the zodiac sequence starting from Ashwini. */ key: number; /** * Vimshottari ruling planet of this nakshatra. One of the nine grahas (Ketu, Venus, Sun, Moon, Mars, Rahu, Jupiter, Saturn, Mercury). Drives the dasha sequence and the nakshatra qualities. */ lord: 'Ketu' | 'Venus' | 'Sun' | 'Moon' | 'Mars' | 'Rahu' | 'Jupiter' | 'Saturn' | 'Mercury'; }; /** * True if planet is in retrograde motion (appears to move backward). Retrograde planets have altered significations. */ isRetrograde: boolean; /** * Bhava (house) number 1-12, counted whole-sign from the Lagna (house 1 is the Lagna rashi). Present on the D1 birth chart; divisional charts (navamsa, varga) omit it. */ house?: number; /** * Baladi avastha, the planetary age-state set by the graha degree within its sign: Bala (infant), Kumara (child), Yuva (adult, strongest results), Vriddha (old), Mrita (dead, weakest). Bands run forward in odd signs and reversed in even signs. D1 birth chart only. */ awastha?: 'Bala' | 'Kumara' | 'Yuva' | 'Vriddha' | 'Mrita'; /** * Jagradadi avastha, the waking state of the graha set by its sign dignity: Jagrat (awake, own sign or exaltation, full results), Swapna (dreaming, a friendly or neutral sign, medium results), Sushupti (sleeping, an enemy sign or debilitation, no results). Present for the seven classical grahas on the D1 chart; Rahu, Ketu and the Lagna own no sign and are omitted. */ jagradadi?: 'Jagrat' | 'Swapna' | 'Sushupti'; /** * Deeptadi avastha, the dispositional state of the graha, one of nine: Dipta (exalted, blazing), Svastha (own sign, healthy), Pramudita (great friend sign, delighted), Shanta (friendly sign, at peace), Dina (neutral sign, helpless), Duhkhita (enemy sign, sorrowful), Khala (great enemy sign, harsh), Vikala (joined by a natural malefic, disabled), Kopa (eclipsed by the Sun, enraged). Where more than one applies the more severe is returned, so combustion outranks a malefic conjunction, which outranks the sign reading. Present for the seven classical grahas on the D1 chart; Rahu, Ketu and the Lagna are omitted. */ deeptadi?: 'Dipta' | 'Svastha' | 'Pramudita' | 'Shanta' | 'Dina' | 'Duhkhita' | 'Vikala' | 'Khala' | 'Kopa'; }>; }; capricorn: { /** * Zodiac sign name in lowercase. Always equals the key of the block it sits in, so the aries block carries "aries" and the pisces block carries "pisces". */ rashi: string; /** * Planets placed in this zodiac sign. */ signs: Array<{ /** * Planet (graha) placed in this sign. */ graha: string; /** * Sidereal longitude in degrees (0-360) using Lahiri ayanamsa. */ longitude: number; nakshatra: { /** * Nakshatra (lunar mansion, 1 of 27) the planet occupies. */ name: string; /** * Nakshatra pada (quarter, 1-4). Each nakshatra has 4 padas of 3 degrees 20 each. */ pada: number; /** * Nakshatra index (1-27) in the zodiac sequence starting from Ashwini. */ key: number; /** * Vimshottari ruling planet of this nakshatra. One of the nine grahas (Ketu, Venus, Sun, Moon, Mars, Rahu, Jupiter, Saturn, Mercury). Drives the dasha sequence and the nakshatra qualities. */ lord: 'Ketu' | 'Venus' | 'Sun' | 'Moon' | 'Mars' | 'Rahu' | 'Jupiter' | 'Saturn' | 'Mercury'; }; /** * True if planet is in retrograde motion (appears to move backward). Retrograde planets have altered significations. */ isRetrograde: boolean; /** * Bhava (house) number 1-12, counted whole-sign from the Lagna (house 1 is the Lagna rashi). Present on the D1 birth chart; divisional charts (navamsa, varga) omit it. */ house?: number; /** * Baladi avastha, the planetary age-state set by the graha degree within its sign: Bala (infant), Kumara (child), Yuva (adult, strongest results), Vriddha (old), Mrita (dead, weakest). Bands run forward in odd signs and reversed in even signs. D1 birth chart only. */ awastha?: 'Bala' | 'Kumara' | 'Yuva' | 'Vriddha' | 'Mrita'; /** * Jagradadi avastha, the waking state of the graha set by its sign dignity: Jagrat (awake, own sign or exaltation, full results), Swapna (dreaming, a friendly or neutral sign, medium results), Sushupti (sleeping, an enemy sign or debilitation, no results). Present for the seven classical grahas on the D1 chart; Rahu, Ketu and the Lagna own no sign and are omitted. */ jagradadi?: 'Jagrat' | 'Swapna' | 'Sushupti'; /** * Deeptadi avastha, the dispositional state of the graha, one of nine: Dipta (exalted, blazing), Svastha (own sign, healthy), Pramudita (great friend sign, delighted), Shanta (friendly sign, at peace), Dina (neutral sign, helpless), Duhkhita (enemy sign, sorrowful), Khala (great enemy sign, harsh), Vikala (joined by a natural malefic, disabled), Kopa (eclipsed by the Sun, enraged). Where more than one applies the more severe is returned, so combustion outranks a malefic conjunction, which outranks the sign reading. Present for the seven classical grahas on the D1 chart; Rahu, Ketu and the Lagna are omitted. */ deeptadi?: 'Dipta' | 'Svastha' | 'Pramudita' | 'Shanta' | 'Dina' | 'Duhkhita' | 'Vikala' | 'Khala' | 'Kopa'; }>; }; aquarius: { /** * Zodiac sign name in lowercase. Always equals the key of the block it sits in, so the aries block carries "aries" and the pisces block carries "pisces". */ rashi: string; /** * Planets placed in this zodiac sign. */ signs: Array<{ /** * Planet (graha) placed in this sign. */ graha: string; /** * Sidereal longitude in degrees (0-360) using Lahiri ayanamsa. */ longitude: number; nakshatra: { /** * Nakshatra (lunar mansion, 1 of 27) the planet occupies. */ name: string; /** * Nakshatra pada (quarter, 1-4). Each nakshatra has 4 padas of 3 degrees 20 each. */ pada: number; /** * Nakshatra index (1-27) in the zodiac sequence starting from Ashwini. */ key: number; /** * Vimshottari ruling planet of this nakshatra. One of the nine grahas (Ketu, Venus, Sun, Moon, Mars, Rahu, Jupiter, Saturn, Mercury). Drives the dasha sequence and the nakshatra qualities. */ lord: 'Ketu' | 'Venus' | 'Sun' | 'Moon' | 'Mars' | 'Rahu' | 'Jupiter' | 'Saturn' | 'Mercury'; }; /** * True if planet is in retrograde motion (appears to move backward). Retrograde planets have altered significations. */ isRetrograde: boolean; /** * Bhava (house) number 1-12, counted whole-sign from the Lagna (house 1 is the Lagna rashi). Present on the D1 birth chart; divisional charts (navamsa, varga) omit it. */ house?: number; /** * Baladi avastha, the planetary age-state set by the graha degree within its sign: Bala (infant), Kumara (child), Yuva (adult, strongest results), Vriddha (old), Mrita (dead, weakest). Bands run forward in odd signs and reversed in even signs. D1 birth chart only. */ awastha?: 'Bala' | 'Kumara' | 'Yuva' | 'Vriddha' | 'Mrita'; /** * Jagradadi avastha, the waking state of the graha set by its sign dignity: Jagrat (awake, own sign or exaltation, full results), Swapna (dreaming, a friendly or neutral sign, medium results), Sushupti (sleeping, an enemy sign or debilitation, no results). Present for the seven classical grahas on the D1 chart; Rahu, Ketu and the Lagna own no sign and are omitted. */ jagradadi?: 'Jagrat' | 'Swapna' | 'Sushupti'; /** * Deeptadi avastha, the dispositional state of the graha, one of nine: Dipta (exalted, blazing), Svastha (own sign, healthy), Pramudita (great friend sign, delighted), Shanta (friendly sign, at peace), Dina (neutral sign, helpless), Duhkhita (enemy sign, sorrowful), Khala (great enemy sign, harsh), Vikala (joined by a natural malefic, disabled), Kopa (eclipsed by the Sun, enraged). Where more than one applies the more severe is returned, so combustion outranks a malefic conjunction, which outranks the sign reading. Present for the seven classical grahas on the D1 chart; Rahu, Ketu and the Lagna are omitted. */ deeptadi?: 'Dipta' | 'Svastha' | 'Pramudita' | 'Shanta' | 'Dina' | 'Duhkhita' | 'Vikala' | 'Khala' | 'Kopa'; }>; }; pisces: { /** * Zodiac sign name in lowercase. Always equals the key of the block it sits in, so the aries block carries "aries" and the pisces block carries "pisces". */ rashi: string; /** * Planets placed in this zodiac sign. */ signs: Array<{ /** * Planet (graha) placed in this sign. */ graha: string; /** * Sidereal longitude in degrees (0-360) using Lahiri ayanamsa. */ longitude: number; nakshatra: { /** * Nakshatra (lunar mansion, 1 of 27) the planet occupies. */ name: string; /** * Nakshatra pada (quarter, 1-4). Each nakshatra has 4 padas of 3 degrees 20 each. */ pada: number; /** * Nakshatra index (1-27) in the zodiac sequence starting from Ashwini. */ key: number; /** * Vimshottari ruling planet of this nakshatra. One of the nine grahas (Ketu, Venus, Sun, Moon, Mars, Rahu, Jupiter, Saturn, Mercury). Drives the dasha sequence and the nakshatra qualities. */ lord: 'Ketu' | 'Venus' | 'Sun' | 'Moon' | 'Mars' | 'Rahu' | 'Jupiter' | 'Saturn' | 'Mercury'; }; /** * True if planet is in retrograde motion (appears to move backward). Retrograde planets have altered significations. */ isRetrograde: boolean; /** * Bhava (house) number 1-12, counted whole-sign from the Lagna (house 1 is the Lagna rashi). Present on the D1 birth chart; divisional charts (navamsa, varga) omit it. */ house?: number; /** * Baladi avastha, the planetary age-state set by the graha degree within its sign: Bala (infant), Kumara (child), Yuva (adult, strongest results), Vriddha (old), Mrita (dead, weakest). Bands run forward in odd signs and reversed in even signs. D1 birth chart only. */ awastha?: 'Bala' | 'Kumara' | 'Yuva' | 'Vriddha' | 'Mrita'; /** * Jagradadi avastha, the waking state of the graha set by its sign dignity: Jagrat (awake, own sign or exaltation, full results), Swapna (dreaming, a friendly or neutral sign, medium results), Sushupti (sleeping, an enemy sign or debilitation, no results). Present for the seven classical grahas on the D1 chart; Rahu, Ketu and the Lagna own no sign and are omitted. */ jagradadi?: 'Jagrat' | 'Swapna' | 'Sushupti'; /** * Deeptadi avastha, the dispositional state of the graha, one of nine: Dipta (exalted, blazing), Svastha (own sign, healthy), Pramudita (great friend sign, delighted), Shanta (friendly sign, at peace), Dina (neutral sign, helpless), Duhkhita (enemy sign, sorrowful), Khala (great enemy sign, harsh), Vikala (joined by a natural malefic, disabled), Kopa (eclipsed by the Sun, enraged). Where more than one applies the more severe is returned, so combustion outranks a malefic conjunction, which outranks the sign reading. Present for the seven classical grahas on the D1 chart; Rahu, Ketu and the Lagna are omitted. */ deeptadi?: 'Dipta' | 'Svastha' | 'Pramudita' | 'Shanta' | 'Dina' | 'Duhkhita' | 'Vikala' | 'Khala' | 'Kopa'; }>; }; /** * The sidereal frame this response was computed in, so a cached or forwarded payload is self describing. */ frame: { /** * Sidereal frame this chart was cast in, echoing the ayanamsa request field. "lahiri" when the field was omitted. */ ayanamsa: string; /** * Degrees actually subtracted from every tropical longitude to produce this chart, read at the birth instant. Subtract it back to recover the tropical positions, or compare it against your reference software to confirm you are in the same frame before chasing a placement difference. */ ayanamsaDegrees: number; }; /** * Uranus, Neptune and Pluto, present only when modernPlanets true was sent. Deliberately separate from meta and deliberately without dignity, avastha, combustion or aspect fields: those are constructs of the nine-graha system and the modern planets rule no sign, so no classical value exists for them. Order is always Uranus, Neptune, Pluto. */ modernPlanets?: Array<{ /** * Modern planet name. These three are outside the classical Navagraha and are returned only when modernPlanets true is sent. */ planet: 'Uranus' | 'Neptune' | 'Pluto'; /** * Sanskrit name Indian software prints for this body: Arun for Uranus, Varun for Neptune, Yam for Pluto. Transliterated rather than translated, the same treatment as rashi and nakshatra lord names, so it is identical in every locale. */ sanskritName: 'Arun' | 'Varun' | 'Yam'; /** * Sidereal longitude in degrees (0-360), in the same ayanamsa frame as every other position in this response. */ longitude: number; /** * Zodiac sign (rashi) the body occupies. */ rashi: string; /** * Degrees advanced into the sign, 0 to 30. This is the figure a chart displays beside the sign. */ degreeInRashi: number; /** * Nakshatra placement. Reported because it is purely positional; it does not imply the body participates in Vimshottari dasha, which is built on the Moon alone. */ nakshatra: { /** * Nakshatra (lunar mansion, 1 of 27) the body occupies. */ name: string; /** * Nakshatra pada (quarter, 1-4). */ pada: number; /** * Nakshatra index (1-27) starting from Ashwini. */ key: number; /** * Vimshottari ruling planet of this nakshatra. */ lord: 'Ketu' | 'Venus' | 'Sun' | 'Moon' | 'Mars' | 'Rahu' | 'Jupiter' | 'Saturn' | 'Mercury'; }; /** * True when the body appears to move backward. All three are retrograde for roughly 40 percent of each year, so this is the normal case rather than the exception. */ isRetrograde: boolean; }>; /** * The twelve bhavas (houses) in order, each with its classical name and significations. Houses are counted whole-sign from the Lagna. */ houses: Array<{ /** * Bhava (house) number 1-12. House 1 is the Lagna (Ascendant), house 7 the partnership axis, house 10 the career axis. */ number: number; /** * Classical name of the bhava (house). Present when an interpretation entry exists for this house. */ name?: string; /** * Significations of the bhava (house). Present when an interpretation entry exists for this house. */ description?: string; /** * Significations of the bhava as short keywords, the compact form of description. Bhava 1 covers self, body and vitality; 2 wealth and speech; 7 marriage and partnership; 10 career and status. Suited to chart labels, table cells and legends where the full classical description is too long, and identical to the houseThemes map returned by the Vimshottari dasha and KP chart routes. Localized by the lang query parameter. */ themes?: Array; }>; /** * Combust planets (astangata graha): grahas within their combustion orb of the Sun. Combustion weakens a planet significations. Empty when no planet is combust. */ combustion: Array<{ /** * Graha that is combust (too close to the Sun, astangata). */ planet: string; /** * Angular separation from the Sun in degrees. */ distanceFromSun: number; /** * Combustion orb in degrees applied for this graha. A planet within this orb of the Sun is treated as combust, weakening its results. */ orb: number; }>; /** * Planetary wars (graha yuddha): pairs of visible planets within 1 degree of each other. Empty when no two planets are in war. */ planetaryWar: Array<{ /** * First graha in the planetary war (graha yuddha) pair. */ planet1: string; /** * Second graha in the planetary war (graha yuddha) pair. */ planet2: string; /** * Angular separation between the two grahas in degrees. */ distance: number; /** * Graha that wins the planetary war, the one with the more northerly ecliptic latitude. The winner keeps its strength, the loser is weakened. */ winner: string; }>; /** * Planet-in-rashi and planet-in-nakshatra interpretation summaries, keyed by planet name. Translated when a supported lang is requested. */ interpretations: { [key: string]: { /** * Interpretation of the planet placement in its rashi (sign). */ rashi: string; /** * Interpretation of the planet placement in its nakshatra. */ nakshatra: string; }; }; /** * Forty-four classical yogas detected against this chart. Twelve conjunction and dignity yogas: Gajakesari (three-rule parashara definition), Sunapha, Anapha, Dhurdhura, Kemadruma, Chandra Mangala, Budha-Aditya, and the five Pancha Mahapurusha (Ruchaka, Bhadra, Hamsa, Malavya, Sasa). Plus all 32 Nabhasa distribution yogas across the Asraya, Dala, Akriti and Sankhya families, which read how the seven visible grahas are spread over the whole chart rather than any single conjunction, and which apply the four classical precedence norms so an outranked yoga is returned as absent with evidence naming the norm that silenced it. Each entry carries an `id` (matches `GET /yoga/{id}` for full glossary lookup), a `present` boolean, a `quality` (Positive, Negative, or Both = auspicious, inauspicious, or context-dependent), and classical-text `evidence` for the rule that triggered or failed. Filter on `present === true` for the active list. */ yogas?: Array<{ /** * Glossary id (lowercase, kebab-case) matching an entry in the 301-entry planetary-yoga catalog. Use with GET /yoga/{id} to retrieve the full glossary text. */ id: string; /** * Classical Sanskrit name of the yoga as referenced in BPHS (Brihat Parashara Hora Shastra), Phaladeepika, and B.V. Raman *Three Hundred Important Combinations*. */ name: string; /** * Brief classical formation rule. Identifies the planetary placement, lordship, dignity, aspect pattern, sign modality, or whole-chart bhava distribution required for the yoga to form. */ description: string; /** * Classical phala (life-effect) description of the yoga when present, sourced from the parashari and phaladeepika tradition. */ result: string; /** * Overall nature. Auspicious yogas (Pancha Mahapurusha, Gajakesari) bestow benefits; inauspicious yogas (Kemadruma) indicate challenges; Both denotes context-dependent effects. */ quality: 'Positive' | 'Negative' | 'Both'; /** * Classical grouping, ALWAYS present on a detection verdict: one of the four Nabhasa families (asraya, dala, akriti, sankhya) or classical for the twelve single-combination yogas such as Gajakesari and the Pancha Mahapurusha. Group the verdict list on this key to render a Nabhasa result the way the tradition arranges it. Never translated, so grouping works identically under any lang. */ family: 'classical' | 'asraya' | 'dala' | 'akriti' | 'sankhya'; /** * True if every classical condition for the yoga is satisfied by the given chart. False means one of TWO different things: the rule failed, or the rule held and a stronger family outranked it. Read `suppressedBy` to tell those apart, which is exact and locale-independent; `evidence` says the same thing in English prose. */ present: boolean; /** * Set ONLY when this yoga matched its own classical rule and was then silenced by a higher-ranking family, so `present` is false for a reason a practitioner reads very differently from a failed rule. Names the family that took precedence, under the four classical norms: Akriti outranks Asraya, and Akriti, Asraya and Dala each outrank Sankhya. Absent means the rule genuinely did not hold. */ suppressedBy?: 'classical' | 'asraya' | 'dala' | 'akriti' | 'sankhya'; /** * Human-readable rationale naming the specific rule that triggered or failed the detection, including planetary positions, dignity, kendradhipati status, lordship, malefic drishti, sign modality, or whole-chart bhava distribution. For a Nabhasa yoga that matched its own rule but was outranked, this names the precedence norm that silenced it, for example that an Akriti yoga outranks Asraya or that any other Nabhasa family suppresses Sankhya. English in every language, like the per-graha stateSource on POST /daily, because it is provenance to be checked against a text rather than display copy. */ evidence?: string; }>; /** * Quick lookup of all planet positions keyed by planet name. Contains Sun, Moon, Mars, Mercury, Jupiter, Venus, Saturn, Rahu, Ketu, and Lagna (Ascendant). */ meta: { [key: string]: { /** * Planet (graha) name. One of 9 Navagraha (Sun, Moon, Mars, Mercury, Jupiter, Venus, Saturn, Rahu, Ketu) or Lagna (Ascendant). Used for matching transits and dasha lords to natal positions. */ graha: string; /** * Zodiac sign (rashi) the planet occupies in the birth chart. One of 12 Vedic rashis from Aries (Mesha) to Pisces (Meena). */ rashi: string; /** * Sidereal longitude in degrees (0-360) using Lahiri ayanamsa. Precise position used for aspect calculations, divisional chart mapping, and transit analysis. */ longitude: number; /** * Nakshatra (lunar mansion) data for this planet. Nakshatras are the 27-fold division of the zodiac central to Vedic timing and compatibility systems. */ nakshatra: { /** * Nakshatra (lunar mansion) the planet occupies. One of 27 Vedic nakshatras spanning 13 degrees 20 minutes each. Determines dasha lord and behavioral qualities. */ name: string; /** * Nakshatra pada (quarter, 1-4). Each nakshatra divides into 4 padas of 3 degrees 20 minutes. Pada determines Navamsa sign and refines personality traits. */ pada: number; /** * Nakshatra sequence number (1-27) in zodiac order starting from Ashwini. Used for Tara Bala compatibility and dasha calculations. */ key: number; /** * Vimshottari ruling planet of this nakshatra. One of the nine grahas (Ketu, Venus, Sun, Moon, Mars, Rahu, Jupiter, Saturn, Mercury). Drives the dasha sequence and the nakshatra qualities. */ lord: 'Ketu' | 'Venus' | 'Sun' | 'Moon' | 'Mars' | 'Rahu' | 'Jupiter' | 'Saturn' | 'Mercury'; }; /** * True if the planet is in retrograde motion (appears to move backward through the zodiac). Retrograde planets carry intensified or internalized significations in Vedic interpretation. */ isRetrograde: boolean; /** * Bhava (house) number 1-12, counted whole-sign from the Lagna (house 1 is the Lagna rashi; Lagna itself is house 1). Present on the D1 birth chart; divisional charts omit it. */ house?: number; /** * Localized readings for this graha avastha states, present only when avasthaInfo true was sent. Each key mirrors the state field of the same name and carries a short meaning plus a one-sentence classical interpretation, so a client can label Yuva or Swapna without a second lookup call. */ avasthaInfo?: { awastha?: { /** * One or two word gloss of the state, suitable for a table cell beside the graha. */ meaning: string; /** * Single-sentence classical reading of what the state does to the graha results, sourced from BPHS ch. 45, Saravali ch. 5 and Phaladeepika ch. 9. Localized by the lang query parameter. */ interpretation: string; }; jagradadi?: { /** * One or two word gloss of the state, suitable for a table cell beside the graha. */ meaning: string; /** * Single-sentence classical reading of what the state does to the graha results, sourced from BPHS ch. 45, Saravali ch. 5 and Phaladeepika ch. 9. Localized by the lang query parameter. */ interpretation: string; }; deeptadi?: { /** * One or two word gloss of the state, suitable for a table cell beside the graha. */ meaning: string; /** * Single-sentence classical reading of what the state does to the graha results, sourced from BPHS ch. 45, Saravali ch. 5 and Phaladeepika ch. 9. Localized by the lang query parameter. */ interpretation: string; }; }; /** * Baladi avastha, the planetary age-state set by the graha degree within its sign: Bala (infant), Kumara (child), Yuva (adult, strongest results), Vriddha (old), Mrita (dead, weakest). Bands run forward in odd signs and reversed in even signs. D1 birth chart only. */ awastha?: 'Bala' | 'Kumara' | 'Yuva' | 'Vriddha' | 'Mrita'; /** * Jagradadi avastha, the waking state of the graha set by its sign dignity: Jagrat (awake, own sign or exaltation, full results), Swapna (dreaming, a friendly or neutral sign, medium results), Sushupti (sleeping, an enemy sign or debilitation, no results). Present for the seven classical grahas on the D1 chart; Rahu, Ketu and the Lagna own no sign and are omitted. */ jagradadi?: 'Jagrat' | 'Swapna' | 'Sushupti'; /** * Deeptadi avastha, the dispositional state of the graha, one of nine: Dipta (exalted, blazing), Svastha (own sign, healthy), Pramudita (great friend sign, delighted), Shanta (friendly sign, at peace), Dina (neutral sign, helpless), Duhkhita (enemy sign, sorrowful), Khala (great enemy sign, harsh), Vikala (joined by a natural malefic, disabled), Kopa (eclipsed by the Sun, enraged). Where more than one applies the more severe is returned, so combustion outranks a malefic conjunction, which outranks the sign reading. Present for the seven classical grahas on the D1 chart; Rahu, Ketu and the Lagna are omitted. */ deeptadi?: 'Dipta' | 'Svastha' | 'Pramudita' | 'Shanta' | 'Dina' | 'Duhkhita' | 'Vikala' | 'Khala' | 'Kopa'; }; }; }; export type BirthChartRequest = { /** * Birth date in YYYY-MM-DD format. Date determines planetary positions and nakshatra calculations for Vedic kundli (janam patri). Accurate birth date is essential for dashas, yoga calculations, and divisional charts (vargas). */ date: string; /** * Birth time in 24-hour HH:MM:SS format. Time is CRITICAL for Lagna (Ascendant) calculation and house divisions. It changes every two hours roughly. Even minutes matter for accurate nakshatra pada and divisional chart (D9, D10) calculations. Without exact time, Lagna and house-based predictions will be incorrect. */ time: string; /** * Birth location latitude in decimal degrees. Location determines local sidereal time for Lagna calculation and affects bhava (house) cusps. Example: Delhi 28.6139, Mumbai 19.0760, Kathmandu 27.7172. */ latitude: number; /** * Birth location longitude in decimal degrees. Affects local time calculations and ayanamsha adjustments. Example: Delhi 77.2090, Mumbai 72.8777, Kathmandu 85.3240. */ longitude: number; /** * Timezone: IANA name (e.g. "America/New_York", "Europe/London") OR decimal hours from UTC (e.g. -5 for EST, 1 for CET). IANA strings are resolved to the offset in force at the given date and time, so you can pass `cities[0].timezone` from /location/search directly. Defaults to 5.5. */ timezone?: number | string; /** * Sidereal frame (ayanamsa) the chart is cast in. "lahiri" is Lahiri/Chitrapaksha, the traditional Vedic standard used by most software, and is the default. "raman" is the B.V. Raman ayanamsa from Hindu Predictive Astrology, about 1.45 degrees below Lahiri. "kp-newcomb" and "kp-old" are the two Krishnamurti Paddhati frames. "custom" takes your own value in degrees via ayanamsaValue, for reconciling exactly against a specific reference program. The frame rotates the whole zodiac, so a graha sitting within 1.45 degrees of a boundary can change rashi or nakshatra when you switch: pick the one your reference software uses and keep it. */ ayanamsa?: 'kp-newcomb' | 'kp-old' | 'lahiri' | 'raman' | 'custom'; /** * Custom ayanamsa value in degrees. When provided, overrides the computed ayanamsa from the selected type. Use for testing with specific ayanamsa values or matching a particular reference source. */ ayanamsaValue?: number; /** * Set true to include a localized meaning and one-sentence classical interpretation beside each graha avastha state, under avasthaInfo on that graha in meta. Defaults to false, so an existing integration is byte-identical until it opts in. Saves a second call to GET /avasthas and the client-side join that would otherwise be needed to turn Yuva or Swapna into readable text. */ avasthaInfo?: boolean; /** * Set true to also return Uranus, Neptune and Pluto, under the Sanskrit names Arun, Varun and Yam that Indian software prints for them. They arrive in a separate modernPlanets array, NOT inside meta, because classical Jyotish is defined over nine grahas: the moderns rule no sign, so they have no dignity, avastha, combustion or aspect strength and it would be fabrication to report one. Each carries longitude, rashi, degree in sign, nakshatra with pada and lord, and retrograde status. Defaults to false, so an existing integration is byte-identical until it opts in. */ modernPlanets?: boolean; }; export type NavamsaResponse = { /** * Navamsa (D9) divisional chart showing planetary positions across 12 rashi houses plus a meta lookup. Same structure as the birth chart response. */ chart: { /** * Planet positions in the Navamsa (D9) chart keyed by planet name. Contains all 9 Navagraha plus Lagna. */ meta: { [key: string]: { /** * Planet (graha) name. One of 9 Navagraha (Sun, Moon, Mars, Mercury, Jupiter, Venus, Saturn, Rahu, Ketu) or Lagna (Ascendant). In Navamsa, Venus and Jupiter placements are especially significant for marriage and spiritual growth. */ graha: string; /** * Zodiac sign (rashi) the planet occupies in the Navamsa (D9) chart. D9 sign placement reveals the deeper quality of a planet and is critical for spouse characteristics and marriage timing. */ rashi: string; /** * Sidereal longitude in degrees (0-360) using Lahiri ayanamsa. Same as D1 birth chart longitude, preserved for cross-chart reference and aspect analysis. */ longitude: number; /** * Nakshatra (lunar mansion) data for this planet. Nakshatras are the 27-fold division of the zodiac central to Vedic timing and compatibility systems. */ nakshatra: { /** * Nakshatra (lunar mansion) the planet occupies. One of 27 Vedic nakshatras spanning 13 degrees 20 minutes each. Determines dasha lord and behavioral qualities. */ name: string; /** * Nakshatra pada (quarter, 1-4). Each nakshatra divides into 4 padas of 3 degrees 20 minutes. Pada determines Navamsa sign and refines personality traits. */ pada: number; /** * Nakshatra sequence number (1-27) in zodiac order starting from Ashwini. Used for Tara Bala compatibility and dasha calculations. */ key: number; /** * Vimshottari ruling planet of this nakshatra. One of the nine grahas (Ketu, Venus, Sun, Moon, Mars, Rahu, Jupiter, Saturn, Mercury). Carried over from the D1 nakshatra. */ lord: 'Ketu' | 'Venus' | 'Sun' | 'Moon' | 'Mars' | 'Rahu' | 'Jupiter' | 'Saturn' | 'Mercury'; }; /** * True if the planet is in retrograde motion (appears to move backward through the zodiac). Retrograde planets carry intensified or internalized significations in Vedic interpretation. */ isRetrograde: boolean; /** * Bhava (house) number 1-12 in the Navamsa chart, counted whole-sign from the D9 Lagna. This is the Navamsa-specific house and differs from the D1 birth-chart house. */ house?: number; }; }; /** * One of the 12 navamsa rashi-house buckets (aries shown; taurus through pisces follow the identical shape). Each lists the planets placed in that sign. */ aries: { /** * Zodiac sign name in lowercase. Always equals the key of the navamsa rashi-house block it sits in. */ rashi: string; /** * Planets placed in this navamsa sign. */ signs: Array<{ /** * Planet (graha) placed in this navamsa sign. */ graha: string; /** * Original sidereal longitude in degrees (0-360), same as the D1 birth chart. Preserved for cross-chart reference. */ longitude: number; /** * Nakshatra (lunar mansion) data for this planet, carried over from the D1 chart. */ nakshatra: { /** * Nakshatra (lunar mansion) the planet occupies. */ name: string; /** * Nakshatra pada (quarter, 1-4). */ pada: number; /** * Nakshatra index in the zodiac sequence starting from Ashwini. */ key: number; /** * Vimshottari ruling planet of this nakshatra. */ lord: 'Ketu' | 'Venus' | 'Sun' | 'Moon' | 'Mars' | 'Rahu' | 'Jupiter' | 'Saturn' | 'Mercury'; }; /** * True if the planet is in retrograde motion. */ isRetrograde: boolean; /** * Bhava (house) number 1-12 in the Navamsa chart, counted whole-sign from the D9 Lagna. */ house?: number; }>; }; [key: string]: unknown; }; /** * The sidereal frame this response was computed in, so a cached or forwarded payload is self describing. */ frame: { /** * Sidereal frame this chart was cast in, echoing the ayanamsa request field. "lahiri" when the field was omitted. */ ayanamsa: string; /** * Degrees actually subtracted from every tropical longitude to produce this chart, read at the birth instant. Subtract it back to recover the tropical positions, or compare it against your reference software to confirm you are in the same frame before chasing a placement difference. */ ayanamsaDegrees: number; }; /** * Planets that are Vargottama (same sign in D1 and D9) */ vargottama: Array; /** * Explanation of Vargottama significance */ vargottamaExplanation: string; }; export type NavamsaRequest = { /** * Birth date in YYYY-MM-DD format. Date determines planetary positions and nakshatra calculations for Vedic kundli (janam patri). Accurate birth date is essential for dashas, yoga calculations, and divisional charts (vargas). */ date: string; /** * Birth time in 24-hour HH:MM:SS format. Time is CRITICAL for Lagna (Ascendant) calculation and house divisions. It changes every two hours roughly. Even minutes matter for accurate nakshatra pada and divisional chart (D9, D10) calculations. Without exact time, Lagna and house-based predictions will be incorrect. */ time: string; /** * Birth location latitude in decimal degrees. Location determines local sidereal time for Lagna calculation and affects bhava (house) cusps. Example: Delhi 28.6139, Mumbai 19.0760, Kathmandu 27.7172. */ latitude: number; /** * Birth location longitude in decimal degrees. Affects local time calculations and ayanamsha adjustments. Example: Delhi 77.2090, Mumbai 72.8777, Kathmandu 85.3240. */ longitude: number; /** * Timezone: IANA name (e.g. "America/New_York", "Europe/London") OR decimal hours from UTC (e.g. -5 for EST, 1 for CET). IANA strings are resolved to the offset in force at the given date and time, so you can pass `cities[0].timezone` from /location/search directly. Defaults to 5.5. */ timezone?: number | string; /** * Sidereal frame (ayanamsa) the chart is cast in. "lahiri" is Lahiri/Chitrapaksha, the traditional Vedic standard used by most software, and is the default. "raman" is the B.V. Raman ayanamsa from Hindu Predictive Astrology, about 1.45 degrees below Lahiri. "kp-newcomb" and "kp-old" are the two Krishnamurti Paddhati frames. "custom" takes your own value in degrees via ayanamsaValue, for reconciling exactly against a specific reference program. The frame rotates the whole zodiac, so a graha sitting within 1.45 degrees of a boundary can change rashi or nakshatra when you switch: pick the one your reference software uses and keep it. */ ayanamsa?: 'kp-newcomb' | 'kp-old' | 'lahiri' | 'raman' | 'custom'; /** * Custom ayanamsa value in degrees. When provided, overrides the computed ayanamsa from the selected type. Use for testing with specific ayanamsa values or matching a particular reference source. */ ayanamsaValue?: number; }; export type DivisionalChartResponse = { /** * Metadata about the selected divisional chart. */ division: { /** * Division number (e.g. 10 for D10 Dasamsa). */ number: number; /** * English name of the divisional chart. */ name: string; /** * Sanskrit name of the divisional chart. */ sanskritName: string; /** * Size of each division segment within a 30-degree sign. */ degreesPerDivision: string; /** * Life areas this divisional chart reveals. */ significance: string; }; /** * The sidereal frame this response was computed in, so a cached or forwarded payload is self describing. */ frame: { /** * Sidereal frame this chart was cast in, echoing the ayanamsa request field. "lahiri" when the field was omitted. */ ayanamsa: string; /** * Degrees actually subtracted from every tropical longitude to produce this chart, read at the birth instant. Subtract it back to recover the tropical positions, or compare it against your reference software to confirm you are in the same frame before chasing a placement difference. */ ayanamsaDegrees: number; }; /** * Divisional chart showing planetary positions across 12 rashi houses plus a meta lookup. Same structure as birth chart and navamsa responses. */ chart: { /** * Planet positions in the divisional chart keyed by planet name. Contains all 9 Navagraha plus Lagna. */ meta: { [key: string]: { /** * Planet (graha) name. One of 9 Navagraha (Sun, Moon, Mars, Mercury, Jupiter, Venus, Saturn, Rahu, Ketu) or Lagna (Ascendant). Used to match transits and dasha lords to divisional chart placements. */ graha: string; /** * Zodiac sign (rashi) the planet occupies in this divisional chart. May differ from the D1 birth chart sign. Comparing D1 and divisional rashi reveals Vargottama status and domain-specific strengths. */ rashi: string; /** * Original sidereal longitude in degrees (0-360) using Lahiri ayanamsa, same as D1 birth chart. Sign placement changes per division but longitude is preserved for cross-chart reference. */ longitude: number; /** * Nakshatra (lunar mansion) data for this planet. Nakshatras are the 27-fold division of the zodiac central to Vedic timing and compatibility systems. */ nakshatra: { /** * Nakshatra (lunar mansion) the planet occupies. One of 27 Vedic nakshatras spanning 13 degrees 20 minutes each. Determines dasha lord and behavioral qualities. */ name: string; /** * Nakshatra pada (quarter, 1-4). Each nakshatra divides into 4 padas of 3 degrees 20 minutes. Pada determines Navamsa sign and refines personality traits. */ pada: number; /** * Nakshatra sequence number (1-27) in zodiac order starting from Ashwini. Used for Tara Bala compatibility and dasha calculations. */ key: number; /** * Vimshottari ruling planet of this nakshatra. One of the nine grahas (Ketu, Venus, Sun, Moon, Mars, Rahu, Jupiter, Saturn, Mercury). Carried over from the D1 nakshatra. */ lord: 'Ketu' | 'Venus' | 'Sun' | 'Moon' | 'Mars' | 'Rahu' | 'Jupiter' | 'Saturn' | 'Mercury'; }; /** * True if the planet is in retrograde motion (appears to move backward through the zodiac). Retrograde planets carry intensified or internalized significations in Vedic interpretation. */ isRetrograde: boolean; /** * Bhava (house) number 1-12 in this divisional chart, counted whole-sign from the divisional Lagna. Specific to this varga and differs from the D1 birth-chart house. */ house?: number; }; }; /** * One of the 12 divisional rashi-house buckets (aries shown; taurus through pisces follow the identical shape). Each lists the planets placed in that sign. */ aries: { /** * Zodiac sign name in lowercase. Always equals the key of the divisional rashi-house block it sits in. */ rashi: string; /** * Planets placed in this divisional sign. */ signs: Array<{ /** * Planet (graha) placed in this divisional sign. */ graha: string; /** * Original sidereal longitude in degrees (0-360), same as the D1 birth chart. Preserved for cross-chart reference. */ longitude: number; /** * Nakshatra (lunar mansion) data for this planet, carried over from the D1 chart. */ nakshatra: { /** * Nakshatra (lunar mansion) the planet occupies. */ name: string; /** * Nakshatra pada (quarter, 1-4). */ pada: number; /** * Nakshatra index in the zodiac sequence starting from Ashwini. */ key: number; /** * Vimshottari ruling planet of this nakshatra. */ lord: 'Ketu' | 'Venus' | 'Sun' | 'Moon' | 'Mars' | 'Rahu' | 'Jupiter' | 'Saturn' | 'Mercury'; }; /** * True if the planet is in retrograde motion. */ isRetrograde: boolean; /** * Bhava (house) number 1-12 in this divisional chart, counted whole-sign from the divisional Lagna. */ house?: number; }>; }; [key: string]: unknown; }; /** * Planets that are Vargottama (same sign in D1 and this divisional chart). Vargottama planets deliver strong, consistent results. */ vargottama: Array; }; export type DivisionalChartRequest = { /** * Birth date in YYYY-MM-DD format. Date determines planetary positions and nakshatra calculations for Vedic kundli (janam patri). Accurate birth date is essential for dashas, yoga calculations, and divisional charts (vargas). */ date: string; /** * Birth time in 24-hour HH:MM:SS format. Time is CRITICAL for Lagna (Ascendant) calculation and house divisions. It changes every two hours roughly. Even minutes matter for accurate nakshatra pada and divisional chart (D9, D10) calculations. Without exact time, Lagna and house-based predictions will be incorrect. */ time: string; /** * Birth location latitude in decimal degrees. Location determines local sidereal time for Lagna calculation and affects bhava (house) cusps. Example: Delhi 28.6139, Mumbai 19.0760, Kathmandu 27.7172. */ latitude: number; /** * Birth location longitude in decimal degrees. Affects local time calculations and ayanamsha adjustments. Example: Delhi 77.2090, Mumbai 72.8777, Kathmandu 85.3240. */ longitude: number; /** * Timezone: IANA name (e.g. "America/New_York", "Europe/London") OR decimal hours from UTC (e.g. -5 for EST, 1 for CET). IANA strings are resolved to the offset in force at the given date and time, so you can pass `cities[0].timezone` from /location/search directly. Defaults to 5.5. */ timezone?: number | string; /** * Sidereal frame (ayanamsa) the chart is cast in. "lahiri" is Lahiri/Chitrapaksha, the traditional Vedic standard used by most software, and is the default. "raman" is the B.V. Raman ayanamsa from Hindu Predictive Astrology, about 1.45 degrees below Lahiri. "kp-newcomb" and "kp-old" are the two Krishnamurti Paddhati frames. "custom" takes your own value in degrees via ayanamsaValue, for reconciling exactly against a specific reference program. The frame rotates the whole zodiac, so a graha sitting within 1.45 degrees of a boundary can change rashi or nakshatra when you switch: pick the one your reference software uses and keep it. */ ayanamsa?: 'kp-newcomb' | 'kp-old' | 'lahiri' | 'raman' | 'custom'; /** * Custom ayanamsa value in degrees. When provided, overrides the computed ayanamsa from the selected type. Use for testing with specific ayanamsa values or matching a particular reference source. */ ayanamsaValue?: number; /** * Divisional chart number. Each division reveals a specific life area. Supported: 2 (Hora, wealth), 3 (Drekkana, siblings), 4 (Chaturthamsa, property), 7 (Saptamsa, children), 9 (Navamsa, marriage), 10 (Dasamsa, career), 12 (Dwadasamsa, parents), 16 (Shodasamsa, vehicles), 20 (Vimsamsa, spirituality), 24 (Chaturvimsamsa, education), 27 (Bhamsa, strength), 30 (Trimsamsa, misfortunes), 40 (Khavedamsa, merit), 45 (Akshavedamsa, character), 60 (Shashtiamsa, past life karma). */ division: number; }; export type CompatibilityResponse = { /** * The sidereal frame this response was computed in, so a cached or forwarded payload is self describing. */ frame: { /** * Sidereal frame this chart was cast in, echoing the ayanamsa request field. "lahiri" when the field was omitted. */ ayanamsa: string; /** * Degrees actually subtracted from every tropical longitude to produce this chart, read at the birth instant. Subtract it back to recover the tropical positions, or compare it against your reference software to confirm you are in the same frame before chasing a placement difference. */ ayanamsaDegrees: number; }; /** * Total Ashtakoot Gun Milan score out of 36. Scores above 18 are considered compatible for marriage. Higher scores indicate stronger marital harmony. */ total: number; /** * Maximum possible Guna Milan score (always 36). The 36 points are distributed across 8 kootas (matching categories). */ maxScore: number; /** * Compatibility percentage derived from total/maxScore. Above 50% (18/36) is the traditional minimum threshold for marriage compatibility. */ percentage: number; /** * True when percentage >= 50% (18/36 minimum). Based on the traditional Ashtakoot Gun Milan threshold used by Vedic astrologers for kundli matching. */ isCompatible: boolean; /** * Human-readable marriage recommendation based on overall score and dosha analysis. Indicates whether the union is recommended, and if not, specifies the reason (e.g. Nadi Dosha, Bhakoot Dosha, low overall score). */ recommendation: string; /** * List of active (uncancelled) doshas in the matching. Doshas that meet classical cancellation conditions from Muhurta Martanda or BPHS are excluded from this array and appear in doshaCancellations instead. Common doshas: Nadi Dosha (same Nadi type, 0/8 points), Bhakoot Dosha (inauspicious Moon sign distance, 0/7 points). Empty array when no doshas are present or all detected doshas are cancelled. */ doshas: Array; /** * Doshas detected but cancelled by classical exception rules. Nadi Dosha cancels when partners share the same Moon sign with different nakshatras, same nakshatra with different padas, or same nakshatra spanning different signs. Bhakoot Dosha cancels when Moon sign lords are the same planet or mutual natural friends. Koota score remains 0 but the dosha is not counted against the recommendation. */ doshaCancellations: Array<{ /** * Name of the cancelled dosha (Nadi Dosha or Bhakoot Dosha). */ dosha: string; /** * Classical cancellation condition that neutralizes this dosha. Based on Muhurta Martanda for Nadi Dosha and BPHS for Bhakoot Dosha. */ reason: string; }>; /** * Detailed breakdown of compatibility scores across all 8 Ashtakoot kootas. Each category evaluates a different aspect of marital compatibility: temperament, physical, mental, financial, and health. */ breakdown: Array<{ /** * One of 8 Ashtakoot matching categories: Varna, Vashya, Tara, Yoni, Graha Maitri, Gana, Bhakoot, Nadi. */ category: string; /** * Points scored in this category. Maximum varies: Varna (1), Vashya (2), Tara (3), Yoni (4), Graha Maitri (5), Gana (6), Bhakoot (7), Nadi (8). */ score: number; /** * Maximum possible points for this koota category. */ maxScore: number; /** * Classification of person 1 for this koota (e.g. Vaishya for Varna, Chatushpada for Vashya, Sheep for Yoni). */ person1: string; /** * Classification of person 2 for this koota. */ person2: string; /** * Human-readable explanation of what this koota category evaluates. */ description: string; }>; }; export type CompatibilityRequest = { /** * Birth data of the first person (typically the boy/groom in traditional Ashtakoot matching). Date, time, and location determine Moon nakshatra for koota scoring. */ person1: { /** * Birth date in YYYY-MM-DD format. Date determines planetary positions and nakshatra calculations for Vedic kundli (janam patri). Accurate birth date is essential for dashas, yoga calculations, and divisional charts (vargas). */ date: string; /** * Birth time in 24-hour HH:MM:SS format. Time is CRITICAL for Lagna (Ascendant) calculation and house divisions. It changes every two hours roughly. Even minutes matter for accurate nakshatra pada and divisional chart (D9, D10) calculations. Without exact time, Lagna and house-based predictions will be incorrect. */ time: string; /** * Birth location latitude in decimal degrees. Location determines local sidereal time for Lagna calculation and affects bhava (house) cusps. Example: Delhi 28.6139, Mumbai 19.0760, Kathmandu 27.7172. */ latitude: number; /** * Birth location longitude in decimal degrees. Affects local time calculations and ayanamsha adjustments. Example: Delhi 77.2090, Mumbai 72.8777, Kathmandu 85.3240. */ longitude: number; /** * Timezone: IANA name (e.g. "America/New_York", "Europe/London") OR decimal hours from UTC (e.g. -5 for EST, 1 for CET). IANA strings are resolved to the offset in force at the given date and time, so you can pass `cities[0].timezone` from /location/search directly. Defaults to 5.5. */ timezone?: number | string; }; /** * Birth data of the second person (typically the girl/bride in traditional Ashtakoot matching). Moon nakshatra compared against person 1 across all 8 kootas. */ person2: { /** * Birth date in YYYY-MM-DD format. Date determines planetary positions and nakshatra calculations for Vedic kundli (janam patri). Accurate birth date is essential for dashas, yoga calculations, and divisional charts (vargas). */ date: string; /** * Birth time in 24-hour HH:MM:SS format. Time is CRITICAL for Lagna (Ascendant) calculation and house divisions. It changes every two hours roughly. Even minutes matter for accurate nakshatra pada and divisional chart (D9, D10) calculations. Without exact time, Lagna and house-based predictions will be incorrect. */ time: string; /** * Birth location latitude in decimal degrees. Location determines local sidereal time for Lagna calculation and affects bhava (house) cusps. Example: Delhi 28.6139, Mumbai 19.0760, Kathmandu 27.7172. */ latitude: number; /** * Birth location longitude in decimal degrees. Affects local time calculations and ayanamsha adjustments. Example: Delhi 77.2090, Mumbai 72.8777, Kathmandu 85.3240. */ longitude: number; /** * Timezone: IANA name (e.g. "America/New_York", "Europe/London") OR decimal hours from UTC (e.g. -5 for EST, 1 for CET). IANA strings are resolved to the offset in force at the given date and time, so you can pass `cities[0].timezone` from /location/search directly. Defaults to 5.5. */ timezone?: number | string; }; /** * Sidereal frame (ayanamsa) the chart is cast in. "lahiri" is Lahiri/Chitrapaksha, the traditional Vedic standard used by most software, and is the default. "raman" is the B.V. Raman ayanamsa from Hindu Predictive Astrology, about 1.45 degrees below Lahiri. "kp-newcomb" and "kp-old" are the two Krishnamurti Paddhati frames. "custom" takes your own value in degrees via ayanamsaValue, for reconciling exactly against a specific reference program. The frame rotates the whole zodiac, so a graha sitting within 1.45 degrees of a boundary can change rashi or nakshatra when you switch: pick the one your reference software uses and keep it. */ ayanamsa?: 'kp-newcomb' | 'kp-old' | 'lahiri' | 'raman' | 'custom'; /** * Custom ayanamsa value in degrees. When provided, overrides the computed ayanamsa from the selected type. Use for testing with specific ayanamsa values or matching a particular reference source. */ ayanamsaValue?: number; }; export type DashakootResponse = { /** * The sidereal frame this response was computed in, so a cached or forwarded payload is self describing. */ frame: { /** * Sidereal frame this chart was cast in, echoing the ayanamsa request field. "lahiri" when the field was omitted. */ ayanamsa: string; /** * Degrees actually subtracted from every tropical longitude to produce this chart, read at the birth instant. Subtract it back to recover the tropical positions, or compare it against your reference software to confirm you are in the same frame before chasing a placement difference. */ ayanamsaDegrees: number; }; /** * Poruthams matched, 0 to 10. Each porutham is a pass or a fail in the South Indian system rather than a weighted score, so this is a plain count and never a fraction. A total says nothing on its own while a veto is active, which is why verdict exists. */ total: number; /** * Poruthams on the sheet, always 10. The South Indian system counts ten equal agreements where the Ashtakoot system weights eight kootas across 36 points. */ maxTotal: number; /** * Overall reading. "rejected" means Rajju or Vedha fired, which the tradition treats as disqualifying however many poruthams matched, so it can appear on a high total. "recommended" means no veto and the total reached the working threshold. "marginal" means no veto and the total fell short of it. The threshold is a RoxyAPI convention because the tradition names a minimum SET of poruthams rather than a number, and that set varies by desk. */ verdict: 'recommended' | 'marginal' | 'rejected'; /** * One sentence stating the verdict and why, localized by the lang query parameter. Renders directly; the machine value to branch on is verdict. */ recommendation: string; /** * Rajju veto. The 27 nakshatras divide into five limbs of a body, Paada the foot, Kati the waist, Udara the stomach, Kantha the neck and Siro the head, and a couple whose birth stars share a limb is refused. Published at the top level as well as on its breakdown row because it overrides the total, and a caller must not have to scan the sheet to find it. */ rajju: { /** * True when both Moon nakshatras fall on the same Rajju limb, which is the first of the two hard vetoes. A true here sets verdict to rejected regardless of total. */ active: boolean; /** * Why the veto is or is not active, localized by the lang query parameter. The same sentence appears on the Rajju row of breakdown, which also carries the limb each person falls on. */ reason: string; }; /** * Vedha veto. Thirteen nakshatra pairs are held to obstruct each other and a couple falling on one is refused. Chitra belongs to no pair and can never trigger this veto. */ vedha: { /** * True when the two Moon nakshatras are a mutually obstructing vedha pair, which is the second hard veto. A true here sets verdict to rejected regardless of total. */ active: boolean; /** * Why the veto is or is not active, localized by the lang query parameter. The same sentence appears on the Vedha row of breakdown. */ reason: string; }; /** * The ten poruthams in the order a Tamil panchangam prints them: Dina, Gana, Mahendra, Stree Deergha, Yoni, Rasi, Rasyadhipati, Vasya, Rajju, Vedha. Dina, Mahendra, Stree Deergha, Rasi and Vasya are directional and read from the bride toward the groom. */ breakdown: Array<{ /** * Which of the ten poruthams this row decides. Canonical English, never translated, so it is safe to switch on. Rasyadhipati is the South Indian name for the agreement the North calls Graha Maitri. */ name: 'Dina' | 'Gana' | 'Mahendra' | 'Stree Deergha' | 'Yoni' | 'Rasi' | 'Rasyadhipati' | 'Vasya' | 'Rajju' | 'Vedha'; /** * One when this porutham matched and zero when it did not. Every porutham carries equal weight in this system, unlike the Ashtakoot kootas. */ points: number; /** * Always one, since each porutham is a single pass or fail. */ maxPoints: number; /** * The outcome as a word rather than a number, for a caller keying a badge or a filter off it. Canonical English, never translated. */ verdict: 'matched' | 'unmatched'; /** * How the GROOM classifies for this porutham: a Rajju limb, a Gana class, a Yoni animal, a Moon rashi, a Moon rashi lord, or the Moon nakshatra where the rule counts stars. Canonical English, so the note never has to name it. */ person1: string; /** * How the BRIDE classifies for this porutham, same vocabulary. */ person2: string; /** * One sentence explaining what decided this porutham, localized by the lang query parameter. Only counts are written into it; every classification stays on person1 and person2 so a translated sentence never carries an English term. */ note: string; }>; }; export type DashakootRequest = { /** * Birth data of the GROOM. Direction is load bearing in this system: Dina, Mahendra, Stree Deergha, Rasi and Vasya all count from the bride toward the groom, so sending the two people the wrong way round returns a different and wrong sheet without any error. */ person1: { /** * Birth date in YYYY-MM-DD format. Date determines planetary positions and nakshatra calculations for Vedic kundli (janam patri). Accurate birth date is essential for dashas, yoga calculations, and divisional charts (vargas). */ date: string; /** * Birth time in 24-hour HH:MM:SS format. Time is CRITICAL for Lagna (Ascendant) calculation and house divisions. It changes every two hours roughly. Even minutes matter for accurate nakshatra pada and divisional chart (D9, D10) calculations. Without exact time, Lagna and house-based predictions will be incorrect. */ time: string; /** * Birth location latitude in decimal degrees. Location determines local sidereal time for Lagna calculation and affects bhava (house) cusps. Example: Delhi 28.6139, Mumbai 19.0760, Kathmandu 27.7172. */ latitude: number; /** * Birth location longitude in decimal degrees. Affects local time calculations and ayanamsha adjustments. Example: Delhi 77.2090, Mumbai 72.8777, Kathmandu 85.3240. */ longitude: number; /** * Timezone: IANA name (e.g. "America/New_York", "Europe/London") OR decimal hours from UTC (e.g. -5 for EST, 1 for CET). IANA strings are resolved to the offset in force at the given date and time, so you can pass `cities[0].timezone` from /location/search directly. Defaults to 5.5. */ timezone?: number | string; }; /** * Birth data of the BRIDE. Five of the ten poruthams count FROM this birth star, so this field is not interchangeable with person1. Date, time and location determine the Moon nakshatra and Moon rashi every porutham reads. */ person2: { /** * Birth date in YYYY-MM-DD format. Date determines planetary positions and nakshatra calculations for Vedic kundli (janam patri). Accurate birth date is essential for dashas, yoga calculations, and divisional charts (vargas). */ date: string; /** * Birth time in 24-hour HH:MM:SS format. Time is CRITICAL for Lagna (Ascendant) calculation and house divisions. It changes every two hours roughly. Even minutes matter for accurate nakshatra pada and divisional chart (D9, D10) calculations. Without exact time, Lagna and house-based predictions will be incorrect. */ time: string; /** * Birth location latitude in decimal degrees. Location determines local sidereal time for Lagna calculation and affects bhava (house) cusps. Example: Delhi 28.6139, Mumbai 19.0760, Kathmandu 27.7172. */ latitude: number; /** * Birth location longitude in decimal degrees. Affects local time calculations and ayanamsha adjustments. Example: Delhi 77.2090, Mumbai 72.8777, Kathmandu 85.3240. */ longitude: number; /** * Timezone: IANA name (e.g. "America/New_York", "Europe/London") OR decimal hours from UTC (e.g. -5 for EST, 1 for CET). IANA strings are resolved to the offset in force at the given date and time, so you can pass `cities[0].timezone` from /location/search directly. Defaults to 5.5. */ timezone?: number | string; }; /** * Sidereal frame (ayanamsa) the chart is cast in. "lahiri" is Lahiri/Chitrapaksha, the traditional Vedic standard used by most software, and is the default. "raman" is the B.V. Raman ayanamsa from Hindu Predictive Astrology, about 1.45 degrees below Lahiri. "kp-newcomb" and "kp-old" are the two Krishnamurti Paddhati frames. "custom" takes your own value in degrees via ayanamsaValue, for reconciling exactly against a specific reference program. The frame rotates the whole zodiac, so a graha sitting within 1.45 degrees of a boundary can change rashi or nakshatra when you switch: pick the one your reference software uses and keep it. */ ayanamsa?: 'kp-newcomb' | 'kp-old' | 'lahiri' | 'raman' | 'custom'; /** * Custom ayanamsa value in degrees. When provided, overrides the computed ayanamsa from the selected type. Use for testing with specific ayanamsa values or matching a particular reference source. */ ayanamsaValue?: number; }; export type PapasamyamResponse = { /** * The sidereal frame this response was computed in, so a cached or forwarded payload is self describing. */ frame: { /** * Sidereal frame this chart was cast in, echoing the ayanamsa request field. "lahiri" when the field was omitted. */ ayanamsa: string; /** * Degrees actually subtracted from every tropical longitude to produce this chart, read at the birth instant. Subtract it back to recover the tropical positions, or compare it against your reference software to confirm you are in the same frame before chasing a placement difference. */ ayanamsaDegrees: number; }; /** * Papa count of the groom chart, with the working shown per reference. */ person1: { /** * Papa points this chart carries, summed across the three reference points with each hit multiplied by that reference weight. The range is 0 to 7, and quarter points are normal because a hit read from Venus is worth 0.25. The number is never a verdict on one person: only the comparison between the two totals means anything. */ total: number; /** * The count broken out by the three reference points, in the order Lagna, Moon, Venus. A Kuja Dosha check reads only the first of these and only Mars, which is why a Manglik verdict and a Papasamyam count answer different questions. */ byReference: Array<{ /** * Which point the houses on this row were counted from. Lagna is the Ascendant, Moon is the Chandra lagna and Venus is the karaka of marriage. Canonical English, never translated. */ reference: 'Lagna' | 'Moon' | 'Venus'; /** * What one affliction seen from this reference is worth: 1 from the Lagna, 0.5 from the Moon, 0.25 from Venus. Published rather than assumed because a school that weights the three equally exists, and a caller reconciling against one can see exactly which number to change. The points from this row are the length of afflictions multiplied by this weight. */ weight: number; /** * Every malefic this reference point sees in an afflicting bhava, one entry per point contributed. An empty array means this reference point contributes nothing, which is a clean reading rather than missing data. The length of the array is the points from this reference, so it is not published a second time as a number. */ afflictions: Array<{ /** * The malefic contributing this point. Canonical English, never translated, so it is safe to switch on or use as a glyph key. */ graha: 'Mars' | 'Saturn' | 'Sun' | 'Rahu'; /** * Whole-sign bhava 1 to 12 counted from the reference on this row, which is NOT the bhava from the Lagna unless the reference is the Lagna. Only the six afflicting bhavas 1, 2, 4, 7, 8 and 12 appear here, because a malefic anywhere else contributes nothing. */ house: number; }>; }>; }; /** * Papa count of the bride chart, with the working shown per reference. */ person2: { /** * Papa points this chart carries, summed across the three reference points with each hit multiplied by that reference weight. The range is 0 to 7, and quarter points are normal because a hit read from Venus is worth 0.25. The number is never a verdict on one person: only the comparison between the two totals means anything. */ total: number; /** * The count broken out by the three reference points, in the order Lagna, Moon, Venus. A Kuja Dosha check reads only the first of these and only Mars, which is why a Manglik verdict and a Papasamyam count answer different questions. */ byReference: Array<{ /** * Which point the houses on this row were counted from. Lagna is the Ascendant, Moon is the Chandra lagna and Venus is the karaka of marriage. Canonical English, never translated. */ reference: 'Lagna' | 'Moon' | 'Venus'; /** * What one affliction seen from this reference is worth: 1 from the Lagna, 0.5 from the Moon, 0.25 from Venus. Published rather than assumed because a school that weights the three equally exists, and a caller reconciling against one can see exactly which number to change. The points from this row are the length of afflictions multiplied by this weight. */ weight: number; /** * Every malefic this reference point sees in an afflicting bhava, one entry per point contributed. An empty array means this reference point contributes nothing, which is a clean reading rather than missing data. The length of the array is the points from this reference, so it is not published a second time as a number. */ afflictions: Array<{ /** * The malefic contributing this point. Canonical English, never translated, so it is safe to switch on or use as a glyph key. */ graha: 'Mars' | 'Saturn' | 'Sun' | 'Rahu'; /** * Whole-sign bhava 1 to 12 counted from the reference on this row, which is NOT the bhava from the Lagna unless the reference is the Lagna. Only the six afflicting bhavas 1, 2, 4, 7, 8 and 12 appear here, because a malefic anywhere else contributes nothing. */ house: number; }>; }>; }; /** * Whether the two charts carry comparable affliction. "balanced" when the bride total is equal to or below the groom total, "unbalanced" when the bride carries more. Canonical English, never translated, so it is safe to branch on. Both totals are published, so a desk that also caps how far the groom may exceed the bride, or that allows the bride a small tolerance, can apply its own band without a second request. */ verdict: 'balanced' | 'unbalanced'; /** * One sentence stating the comparison and what it means, localized by the lang query parameter. Renders directly; the machine value to branch on is verdict. */ recommendation: string; }; export type PapasamyamRequest = { /** * Birth data of the GROOM. The comparison is directional, so this field is not interchangeable with person2: the match reads as balanced only when the bride carries no more affliction than the groom, and swapping the two people can flip the verdict. */ person1: { /** * Birth date in YYYY-MM-DD format. Date determines planetary positions and nakshatra calculations for Vedic kundli (janam patri). Accurate birth date is essential for dashas, yoga calculations, and divisional charts (vargas). */ date: string; /** * Birth time in 24-hour HH:MM:SS format. Time is CRITICAL for Lagna (Ascendant) calculation and house divisions. It changes every two hours roughly. Even minutes matter for accurate nakshatra pada and divisional chart (D9, D10) calculations. Without exact time, Lagna and house-based predictions will be incorrect. */ time: string; /** * Birth location latitude in decimal degrees. Location determines local sidereal time for Lagna calculation and affects bhava (house) cusps. Example: Delhi 28.6139, Mumbai 19.0760, Kathmandu 27.7172. */ latitude: number; /** * Birth location longitude in decimal degrees. Affects local time calculations and ayanamsha adjustments. Example: Delhi 77.2090, Mumbai 72.8777, Kathmandu 85.3240. */ longitude: number; /** * Timezone: IANA name (e.g. "America/New_York", "Europe/London") OR decimal hours from UTC (e.g. -5 for EST, 1 for CET). IANA strings are resolved to the offset in force at the given date and time, so you can pass `cities[0].timezone` from /location/search directly. Defaults to 5.5. */ timezone?: number | string; }; /** * Birth data of the BRIDE. Date, time and location determine the Lagna, the Moon and Venus, which are the three points every papa point is counted from. */ person2: { /** * Birth date in YYYY-MM-DD format. Date determines planetary positions and nakshatra calculations for Vedic kundli (janam patri). Accurate birth date is essential for dashas, yoga calculations, and divisional charts (vargas). */ date: string; /** * Birth time in 24-hour HH:MM:SS format. Time is CRITICAL for Lagna (Ascendant) calculation and house divisions. It changes every two hours roughly. Even minutes matter for accurate nakshatra pada and divisional chart (D9, D10) calculations. Without exact time, Lagna and house-based predictions will be incorrect. */ time: string; /** * Birth location latitude in decimal degrees. Location determines local sidereal time for Lagna calculation and affects bhava (house) cusps. Example: Delhi 28.6139, Mumbai 19.0760, Kathmandu 27.7172. */ latitude: number; /** * Birth location longitude in decimal degrees. Affects local time calculations and ayanamsha adjustments. Example: Delhi 77.2090, Mumbai 72.8777, Kathmandu 85.3240. */ longitude: number; /** * Timezone: IANA name (e.g. "America/New_York", "Europe/London") OR decimal hours from UTC (e.g. -5 for EST, 1 for CET). IANA strings are resolved to the offset in force at the given date and time, so you can pass `cities[0].timezone` from /location/search directly. Defaults to 5.5. */ timezone?: number | string; }; /** * Sidereal frame (ayanamsa) the chart is cast in. "lahiri" is Lahiri/Chitrapaksha, the traditional Vedic standard used by most software, and is the default. "raman" is the B.V. Raman ayanamsa from Hindu Predictive Astrology, about 1.45 degrees below Lahiri. "kp-newcomb" and "kp-old" are the two Krishnamurti Paddhati frames. "custom" takes your own value in degrees via ayanamsaValue, for reconciling exactly against a specific reference program. The frame rotates the whole zodiac, so a graha sitting within 1.45 degrees of a boundary can change rashi or nakshatra when you switch: pick the one your reference software uses and keep it. */ ayanamsa?: 'kp-newcomb' | 'kp-old' | 'lahiri' | 'raman' | 'custom'; /** * Custom ayanamsa value in degrees. When provided, overrides the computed ayanamsa from the selected type. Use for testing with specific ayanamsa values or matching a particular reference source. */ ayanamsaValue?: number; }; /** * Every graha keyed by its English name: Sun, Moon, Mars, Mercury, Jupiter, Venus, Saturn, Rahu, Ketu, plus Lagna for the Ascendant. Read a placement straight off the key you want, such as `response.Sun`, and iterate the keys to render a full navagraha table. */ export type PlanetaryPositionsResponse = { [key: string]: { /** * Vedic planet (graha) name. One of the Navagraha: Sun, Moon, Mars, Mercury, Jupiter, Venus, Saturn, Rahu, Ketu, or Lagna (Ascendant). */ graha: string; /** * Zodiac sign (rashi) the planet occupies. One of 12 Vedic rashis from Aries to Pisces. */ rashi: string; /** * Sidereal longitude in degrees (0-360) using Lahiri ayanamsa. Precise planetary position for chart calculations. */ longitude: number; /** * Ecliptic latitude in degrees, the angular distance north (positive) or south (negative) of the ecliptic. Used in planetary war (graha yuddha) winner resolution and latitude-sensitive analysis. Omitted for the Lagna (Ascendant). */ latitude?: number; /** * House number (1-12) the planet occupies using Whole Sign house system. House 1 is the Lagna (Ascendant) sign. Essential for bhava analysis and house-level predictions. */ house: number; /** * Nakshatra (lunar mansion) data with optional interpretive details from Vedic tradition. */ nakshatra: { /** * Nakshatra (lunar mansion) the planet occupies. One of 27 Vedic nakshatras spanning 13 degrees 20 minutes each. */ name: string; /** * Nakshatra pada (quarter, 1-4). Each nakshatra divides into 4 padas of 3 degrees 20 minutes. Determines Navamsa sign. */ pada: number; /** * Nakshatra sequence number (1-27) in zodiac order starting from Ashwini. Used for Tara Bala and dasha calculations. */ key: number; /** * Presiding deity of the nakshatra from Vedic mythology. Influences the spiritual quality and karmic themes of the planet placement. */ deity?: string; /** * Traditional symbol representing the nakshatra. Reflects core energy and life themes associated with this lunar mansion. */ symbol?: string; /** * Personality traits and behavioral tendencies when a planet occupies this nakshatra. Used for character analysis and prediction. */ characteristics?: string; }; /** * Vedic zodiac sign (rashi) details including Sanskrit name, symbol, elemental energy, and personality characteristics. Present when interpretation data is available. */ rashiDetails?: { /** * Sanskrit name of the zodiac sign as used in traditional Jyotish texts. */ vedicName?: string; /** * Traditional symbol representing this zodiac sign. */ symbol?: string; /** * Elemental and gender classification of the rashi (Masculine/Feminine, Fire/Earth/Air/Water). */ energy?: string; /** * Key personality traits and behavioral tendencies of this zodiac sign in Vedic astrology. */ characteristics?: string; }; /** * Whether the planet is in retrograde motion (vakri). Rahu and Ketu are always retrograde in Vedic astrology. */ isRetrograde: boolean; /** * Whether the planet is combust (asta, moudhya). A planet is combust when too close to the Sun, weakening its significations. Limits per Surya Siddhanta: Moon 12 deg, Mars 17 deg, Mercury 14 deg (12 deg if retrograde), Jupiter 11 deg, Venus 10 deg (8 deg if retrograde), Saturn 15 deg. Compared against the difference in ecliptic longitude, which is the standard interpretive convention and matches what other Vedic software reports. It is a chart judgement and not a statement about naked-eye visibility, which additionally depends on the observer latitude: for that use the heliacal endpoint, which applies the same limits in the classical degrees of time. The field is omitted entirely for Sun, Rahu, Ketu and Lagna, since the question does not apply to them rather than the answer being no. */ isCombust?: boolean; /** * Angular distance from the Sun in degrees (0-180). Smaller values indicate closer proximity. Null for Sun, Rahu, Ketu, and Lagna. Useful for gauging combustion severity and planetary strength analysis. */ combustionDistance?: number; /** * Baladi avastha, the planetary age-state set by the graha degree within its sign: Bala (infant), Kumara (child), Yuva (adult, strongest results), Vriddha (old), Mrita (dead, weakest). Bands run forward in odd signs and reversed in even signs. */ awastha?: 'Bala' | 'Kumara' | 'Yuva' | 'Vriddha' | 'Mrita'; }; }; export type PlanetaryPositionsRequest = { /** * Birth date in YYYY-MM-DD format. Date determines planetary positions and nakshatra calculations for Vedic kundli (janam patri). Accurate birth date is essential for dashas, yoga calculations, and divisional charts (vargas). */ date: string; /** * Birth time in 24-hour HH:MM:SS format. Time is CRITICAL for Lagna (Ascendant) calculation and house divisions. It changes every two hours roughly. Even minutes matter for accurate nakshatra pada and divisional chart (D9, D10) calculations. Without exact time, Lagna and house-based predictions will be incorrect. */ time: string; /** * Birth location latitude in decimal degrees. Location determines local sidereal time for Lagna calculation and affects bhava (house) cusps. Example: Delhi 28.6139, Mumbai 19.0760, Kathmandu 27.7172. */ latitude: number; /** * Birth location longitude in decimal degrees. Affects local time calculations and ayanamsha adjustments. Example: Delhi 77.2090, Mumbai 72.8777, Kathmandu 85.3240. */ longitude: number; /** * Timezone: IANA name (e.g. "America/New_York", "Europe/London") OR decimal hours from UTC (e.g. -5 for EST, 1 for CET). IANA strings are resolved to the offset in force at the given date and time, so you can pass `cities[0].timezone` from /location/search directly. Defaults to 5.5. */ timezone?: number | string; /** * Sidereal frame (ayanamsa) the chart is cast in. "lahiri" is Lahiri/Chitrapaksha, the traditional Vedic standard used by most software, and is the default. "raman" is the B.V. Raman ayanamsa from Hindu Predictive Astrology, about 1.45 degrees below Lahiri. "kp-newcomb" and "kp-old" are the two Krishnamurti Paddhati frames. "custom" takes your own value in degrees via ayanamsaValue, for reconciling exactly against a specific reference program. The frame rotates the whole zodiac, so a graha sitting within 1.45 degrees of a boundary can change rashi or nakshatra when you switch: pick the one your reference software uses and keep it. */ ayanamsa?: 'kp-newcomb' | 'kp-old' | 'lahiri' | 'raman' | 'custom'; /** * Custom ayanamsa value in degrees. When provided, overrides the computed ayanamsa from the selected type. Use for testing with specific ayanamsa values or matching a particular reference source. */ ayanamsaValue?: number; }; export type ManglikResponse = { /** * The sidereal frame this response was computed in, so a cached or forwarded payload is self describing. */ frame: { /** * Sidereal frame this chart was cast in, echoing the ayanamsa request field. "lahiri" when the field was omitted. */ ayanamsa: string; /** * Degrees actually subtracted from every tropical longitude to produce this chart, read at the birth instant. Subtract it back to recover the tropical positions, or compare it against your reference software to confirm you are in the same frame before chasing a placement difference. */ ayanamsaDegrees: number; }; /** * Whether Manglik dosha (Kuja dosha) is present based on Mars placement from Lagna */ present: boolean; /** * Manglik dosha intensity, Mild (houses 2, 12), Moderate (houses 4, 7), Severe (houses 1, 8) */ severity?: 'Mild' | 'Moderate' | 'Severe'; /** * Human-readable Manglik dosha analysis with Mars house placement */ description: string; /** * Classical cancellation factors that reduce Manglik dosha severity (own sign, exaltation, benefic aspects) */ exceptions?: Array; /** * Traditional Vedic remedies for Manglik dosha mitigation based on severity level */ remedies?: Array; /** * Manglik dosha effects on marriage, personality, and relationships */ effects?: { /** * Impact of Manglik dosha on marriage and marital harmony */ marriage: string; /** * Influence on temperament and behavioral traits */ personality: string; /** * Age-related intensity and Mars maturity effects */ timing: string; /** * Impact on interpersonal and spousal relationships */ relationships: string; }; }; export type ManglikRequest = { /** * Birth date in YYYY-MM-DD format. Date determines planetary positions and nakshatra calculations for Vedic kundli (janam patri). Accurate birth date is essential for dashas, yoga calculations, and divisional charts (vargas). */ date: string; /** * Birth time in 24-hour HH:MM:SS format. Time is CRITICAL for Lagna (Ascendant) calculation and house divisions. It changes every two hours roughly. Even minutes matter for accurate nakshatra pada and divisional chart (D9, D10) calculations. Without exact time, Lagna and house-based predictions will be incorrect. */ time: string; /** * Birth location latitude in decimal degrees. Location determines local sidereal time for Lagna calculation and affects bhava (house) cusps. Example: Delhi 28.6139, Mumbai 19.0760, Kathmandu 27.7172. */ latitude: number; /** * Birth location longitude in decimal degrees. Affects local time calculations and ayanamsha adjustments. Example: Delhi 77.2090, Mumbai 72.8777, Kathmandu 85.3240. */ longitude: number; /** * Timezone: IANA name (e.g. "America/New_York", "Europe/London") OR decimal hours from UTC (e.g. -5 for EST, 1 for CET). IANA strings are resolved to the offset in force at the given date and time, so you can pass `cities[0].timezone` from /location/search directly. Defaults to 5.5. */ timezone?: number | string; /** * Sidereal frame (ayanamsa) the chart is cast in. "lahiri" is Lahiri/Chitrapaksha, the traditional Vedic standard used by most software, and is the default. "raman" is the B.V. Raman ayanamsa from Hindu Predictive Astrology, about 1.45 degrees below Lahiri. "kp-newcomb" and "kp-old" are the two Krishnamurti Paddhati frames. "custom" takes your own value in degrees via ayanamsaValue, for reconciling exactly against a specific reference program. The frame rotates the whole zodiac, so a graha sitting within 1.45 degrees of a boundary can change rashi or nakshatra when you switch: pick the one your reference software uses and keep it. */ ayanamsa?: 'kp-newcomb' | 'kp-old' | 'lahiri' | 'raman' | 'custom'; /** * Custom ayanamsa value in degrees. When provided, overrides the computed ayanamsa from the selected type. Use for testing with specific ayanamsa values or matching a particular reference source. */ ayanamsaValue?: number; }; export type KalsarpaResponse = { /** * The sidereal frame this response was computed in, so a cached or forwarded payload is self describing. */ frame: { /** * Sidereal frame this chart was cast in, echoing the ayanamsa request field. "lahiri" when the field was omitted. */ ayanamsa: string; /** * Degrees actually subtracted from every tropical longitude to produce this chart, read at the birth instant. Subtract it back to recover the tropical positions, or compare it against your reference software to confirm you are in the same frame before chasing a placement difference. */ ayanamsaDegrees: number; }; /** * Whether Kalsarpa dosha (Kalsarpa yoga) is present, all planets hemmed between Rahu-Ketu axis */ present: boolean; /** * Kalsarpa dosha intensity based on Rahu-Ketu house positions */ severity?: 'Mild' | 'Moderate' | 'Severe'; /** * One of 12 Kalsarpa types based on Rahu house position (Ananta, Kulik, Vasuki, Shankhapala, Padma, Mahapadma, Takshak, Karkotak, Shankhachud, Ghatak, Vishdhar, Sheshnag) */ type?: string; /** * Human-readable Kalsarpa dosha analysis with Rahu-Ketu axis details */ description: string; /** * Traditional Vedic remedies for Kalsarpa dosha including puja, mantras, and spiritual practices */ remedies?: Array; /** * Kalsarpa dosha effects on career, health, mindset, and relationships */ effects?: { /** * When Kalsarpa effects are most active in Vimshottari dasha */ duration: string; /** * Impact on professional growth and career progress */ career: string; /** * Physical and mental health implications */ health: string; /** * Impact on family bonds and personal relationships */ relationships: string; /** * Psychological and emotional effects */ mindset: string; /** * Potential spiritual and personal growth benefits */ positive: string; }; }; export type KalsarpaRequest = { /** * Birth date in YYYY-MM-DD format. Date determines planetary positions and nakshatra calculations for Vedic kundli (janam patri). Accurate birth date is essential for dashas, yoga calculations, and divisional charts (vargas). */ date: string; /** * Birth time in 24-hour HH:MM:SS format. Time is CRITICAL for Lagna (Ascendant) calculation and house divisions. It changes every two hours roughly. Even minutes matter for accurate nakshatra pada and divisional chart (D9, D10) calculations. Without exact time, Lagna and house-based predictions will be incorrect. */ time: string; /** * Birth location latitude in decimal degrees. Location determines local sidereal time for Lagna calculation and affects bhava (house) cusps. Example: Delhi 28.6139, Mumbai 19.0760, Kathmandu 27.7172. */ latitude: number; /** * Birth location longitude in decimal degrees. Affects local time calculations and ayanamsha adjustments. Example: Delhi 77.2090, Mumbai 72.8777, Kathmandu 85.3240. */ longitude: number; /** * Timezone: IANA name (e.g. "America/New_York", "Europe/London") OR decimal hours from UTC (e.g. -5 for EST, 1 for CET). IANA strings are resolved to the offset in force at the given date and time, so you can pass `cities[0].timezone` from /location/search directly. Defaults to 5.5. */ timezone?: number | string; /** * Sidereal frame (ayanamsa) the chart is cast in. "lahiri" is Lahiri/Chitrapaksha, the traditional Vedic standard used by most software, and is the default. "raman" is the B.V. Raman ayanamsa from Hindu Predictive Astrology, about 1.45 degrees below Lahiri. "kp-newcomb" and "kp-old" are the two Krishnamurti Paddhati frames. "custom" takes your own value in degrees via ayanamsaValue, for reconciling exactly against a specific reference program. The frame rotates the whole zodiac, so a graha sitting within 1.45 degrees of a boundary can change rashi or nakshatra when you switch: pick the one your reference software uses and keep it. */ ayanamsa?: 'kp-newcomb' | 'kp-old' | 'lahiri' | 'raman' | 'custom'; /** * Custom ayanamsa value in degrees. When provided, overrides the computed ayanamsa from the selected type. Use for testing with specific ayanamsa values or matching a particular reference source. */ ayanamsaValue?: number; }; export type SadhesatiResponse = { /** * The sidereal frame this response was computed in, so a cached or forwarded payload is self describing. */ frame: { /** * Sidereal frame this chart was cast in, echoing the ayanamsa request field. "lahiri" when the field was omitted. */ ayanamsa: string; /** * Degrees actually subtracted from every tropical longitude to produce this chart, read at the birth instant. Subtract it back to recover the tropical positions, or compare it against your reference software to confirm you are in the same frame before chasing a placement difference. */ ayanamsaDegrees: number; }; /** * Whether Sade Sati is currently active, Saturn transiting 12th, 1st, or 2nd house from natal Moon */ present: boolean; /** * Sadhesati intensity: Moderate for Rising/Setting phases, Severe for Peak phase (Saturn over natal Moon) */ severity?: 'Mild' | 'Moderate' | 'Severe'; /** * Current Sadhesati phase: Rising (12th house), Peak (1st house), or Setting (2nd house) */ type?: string; /** * Human-readable Sadhesati analysis with current Saturn transit phase relative to natal Moon */ description: string; /** * Traditional Vedic remedies for Shani Sade Sati including Shani mantras, donations, and worship */ remedies?: Array; /** * Sadhesati effects by transit phase with general and phase-specific impacts */ effects?: { /** * Overall impact of Saturn transit during Sade Sati period */ general: string; /** * Phase-specific effects for the current Sadhesati stage (Rising/Peak/Setting) */ phases: { [key: string]: string; }; }; }; export type SadhesatiRequest = { /** * Birth date in YYYY-MM-DD format. Date determines planetary positions and nakshatra calculations for Vedic kundli (janam patri). Accurate birth date is essential for dashas, yoga calculations, and divisional charts (vargas). */ date: string; /** * Birth time in 24-hour HH:MM:SS format. Time is CRITICAL for Lagna (Ascendant) calculation and house divisions. It changes every two hours roughly. Even minutes matter for accurate nakshatra pada and divisional chart (D9, D10) calculations. Without exact time, Lagna and house-based predictions will be incorrect. */ time: string; /** * Birth location latitude in decimal degrees. Location determines local sidereal time for Lagna calculation and affects bhava (house) cusps. Example: Delhi 28.6139, Mumbai 19.0760, Kathmandu 27.7172. */ latitude: number; /** * Birth location longitude in decimal degrees. Affects local time calculations and ayanamsha adjustments. Example: Delhi 77.2090, Mumbai 72.8777, Kathmandu 85.3240. */ longitude: number; /** * Timezone: IANA name (e.g. "America/New_York", "Europe/London") OR decimal hours from UTC (e.g. -5 for EST, 1 for CET). IANA strings are resolved to the offset in force at the given date and time, so you can pass `cities[0].timezone` from /location/search directly. Defaults to 5.5. */ timezone?: number | string; /** * Sidereal frame (ayanamsa) the chart is cast in. "lahiri" is Lahiri/Chitrapaksha, the traditional Vedic standard used by most software, and is the default. "raman" is the B.V. Raman ayanamsa from Hindu Predictive Astrology, about 1.45 degrees below Lahiri. "kp-newcomb" and "kp-old" are the two Krishnamurti Paddhati frames. "custom" takes your own value in degrees via ayanamsaValue, for reconciling exactly against a specific reference program. The frame rotates the whole zodiac, so a graha sitting within 1.45 degrees of a boundary can change rashi or nakshatra when you switch: pick the one your reference software uses and keep it. */ ayanamsa?: 'kp-newcomb' | 'kp-old' | 'lahiri' | 'raman' | 'custom'; /** * Custom ayanamsa value in degrees. When provided, overrides the computed ayanamsa from the selected type. Use for testing with specific ayanamsa values or matching a particular reference source. */ ayanamsaValue?: number; }; export type YogaDetail = { /** * Glossary id (lowercase, kebab-case) matching an entry in the 301-entry planetary-yoga catalog. Use with GET /yoga/{id} to retrieve the full glossary text. */ id: string; /** * Classical Sanskrit name of the yoga as referenced in BPHS (Brihat Parashara Hora Shastra), Phaladeepika, and B.V. Raman *Three Hundred Important Combinations*. */ name: string; /** * Brief classical formation rule. Identifies the planetary placement, lordship, dignity, aspect pattern, sign modality, or whole-chart bhava distribution required for the yoga to form. */ description: string; /** * Classical phala (life-effect) description of the yoga when present, sourced from the parashari and phaladeepika tradition. */ result: string; /** * Overall nature. Auspicious yogas (Pancha Mahapurusha, Gajakesari) bestow benefits; inauspicious yogas (Kemadruma) indicate challenges; Both denotes context-dependent effects. */ quality: 'Positive' | 'Negative' | 'Both'; /** * Nabhasa family this yoga belongs to, present only on the 32 Nabhasa distribution yogas: asraya (3, sign modality), dala (2, benefic or malefic kendra tenancy), akriti (20, bhava shape) and sankhya (7, count of occupied rasis). Absent on every other glossary row, which is most of the catalog, since those are single-combination yogas outside the Nabhasa scheme. Group or filter the catalog on this key; it is never translated. */ family?: 'classical' | 'asraya' | 'dala' | 'akriti' | 'sankhya'; }; export type YogaDetectResponse = { /** * Array of 48 detected yogas, always the full set so a caller can render absent verdicts too. Every entry carries a `present` boolean and a `quality` (Positive, Negative, or Both = auspicious, inauspicious, or context-dependent); filter on present === true for active yogas. Evidence text names the rule that triggered or failed, or the precedence norm that outranked it. */ yogas: Array<{ /** * Glossary id (lowercase, kebab-case) matching an entry in the 301-entry planetary-yoga catalog. Use with GET /yoga/{id} to retrieve the full glossary text. */ id: string; /** * Classical Sanskrit name of the yoga as referenced in BPHS (Brihat Parashara Hora Shastra), Phaladeepika, and B.V. Raman *Three Hundred Important Combinations*. */ name: string; /** * Brief classical formation rule. Identifies the planetary placement, lordship, dignity, aspect pattern, sign modality, or whole-chart bhava distribution required for the yoga to form. */ description: string; /** * Classical phala (life-effect) description of the yoga when present, sourced from the parashari and phaladeepika tradition. */ result: string; /** * Overall nature. Auspicious yogas (Pancha Mahapurusha, Gajakesari) bestow benefits; inauspicious yogas (Kemadruma) indicate challenges; Both denotes context-dependent effects. */ quality: 'Positive' | 'Negative' | 'Both'; /** * Classical grouping, ALWAYS present on a detection verdict: one of the four Nabhasa families (asraya, dala, akriti, sankhya) or classical for the twelve single-combination yogas such as Gajakesari and the Pancha Mahapurusha. Group the verdict list on this key to render a Nabhasa result the way the tradition arranges it. Never translated, so grouping works identically under any lang. */ family: 'classical' | 'asraya' | 'dala' | 'akriti' | 'sankhya'; /** * True if every classical condition for the yoga is satisfied by the given chart. False means one of TWO different things: the rule failed, or the rule held and a stronger family outranked it. Read `suppressedBy` to tell those apart, which is exact and locale-independent; `evidence` says the same thing in English prose. */ present: boolean; /** * Set ONLY when this yoga matched its own classical rule and was then silenced by a higher-ranking family, so `present` is false for a reason a practitioner reads very differently from a failed rule. Names the family that took precedence, under the four classical norms: Akriti outranks Asraya, and Akriti, Asraya and Dala each outrank Sankhya. Absent means the rule genuinely did not hold. */ suppressedBy?: 'classical' | 'asraya' | 'dala' | 'akriti' | 'sankhya'; /** * Human-readable rationale naming the specific rule that triggered or failed the detection, including planetary positions, dignity, kendradhipati status, lordship, malefic drishti, sign modality, or whole-chart bhava distribution. For a Nabhasa yoga that matched its own rule but was outranked, this names the precedence norm that silenced it, for example that an Akriti yoga outranks Asraya or that any other Nabhasa family suppresses Sankhya. English in every language, like the per-graha stateSource on POST /daily, because it is provenance to be checked against a text rather than display copy. */ evidence?: string; }>; /** * The sidereal frame this response was computed in, so a cached or forwarded payload is self describing. */ frame: { /** * Sidereal frame this chart was cast in, echoing the ayanamsa request field. "lahiri" when the field was omitted. */ ayanamsa: string; /** * Degrees actually subtracted from every tropical longitude to produce this chart, read at the birth instant. Subtract it back to recover the tropical positions, or compare it against your reference software to confirm you are in the same frame before chasing a placement difference. */ ayanamsaDegrees: number; }; /** * Count of yogas where present === true in this chart. Range 0-48, though real charts sit in the low single digits: the Nabhasa families are mutually constrained by the precedence norms, and most shape yogas are rare. */ total: number; /** * Echo of the resolved birth data used for detection. Timezone is the numeric offset that the chart engine consumed (IANA names are resolved upstream). */ birthDetails: { /** * Birth date the kundli was cast for, YYYY-MM-DD, echoed back from the request. */ date: string; /** * Birth time the kundli was cast for, 24-hour HH:MM:SS, echoed back from the request. Lagna moves roughly one rashi every two hours, so this is what pins the bhava-dependent yogas. */ time: string; /** * Birth latitude in decimal degrees, echoed back from the request. Feeds the local sidereal time behind the Lagna. */ latitude: number; /** * Birth longitude in decimal degrees, echoed back from the request. East is positive, west is negative. */ longitude: number; /** * Numeric UTC offset in decimal hours that the chart engine actually consumed. An IANA name sent on the request is resolved to its DST-correct offset upstream, so this is always a number. */ timezone: number; }; }; export type YogaDetectRequest = { /** * Birth date in YYYY-MM-DD format. Date determines planetary positions and nakshatra calculations for Vedic kundli (janam patri). Accurate birth date is essential for dashas, yoga calculations, and divisional charts (vargas). */ date: string; /** * Birth time in 24-hour HH:MM:SS format. Time is CRITICAL for Lagna (Ascendant) calculation and house divisions. It changes every two hours roughly. Even minutes matter for accurate nakshatra pada and divisional chart (D9, D10) calculations. Without exact time, Lagna and house-based predictions will be incorrect. */ time: string; /** * Birth location latitude in decimal degrees. Location determines local sidereal time for Lagna calculation and affects bhava (house) cusps. Example: Delhi 28.6139, Mumbai 19.0760, Kathmandu 27.7172. */ latitude: number; /** * Birth location longitude in decimal degrees. Affects local time calculations and ayanamsha adjustments. Example: Delhi 77.2090, Mumbai 72.8777, Kathmandu 85.3240. */ longitude: number; /** * Timezone: IANA name (e.g. "America/New_York", "Europe/London") OR decimal hours from UTC (e.g. -5 for EST, 1 for CET). IANA strings are resolved to the offset in force at the given date and time, so you can pass `cities[0].timezone` from /location/search directly. Defaults to 5.5. */ timezone?: number | string; /** * Sidereal frame (ayanamsa) the chart is cast in. "lahiri" is Lahiri/Chitrapaksha, the traditional Vedic standard used by most software, and is the default. "raman" is the B.V. Raman ayanamsa from Hindu Predictive Astrology, about 1.45 degrees below Lahiri. "kp-newcomb" and "kp-old" are the two Krishnamurti Paddhati frames. "custom" takes your own value in degrees via ayanamsaValue, for reconciling exactly against a specific reference program. The frame rotates the whole zodiac, so a graha sitting within 1.45 degrees of a boundary can change rashi or nakshatra when you switch: pick the one your reference software uses and keep it. */ ayanamsa?: 'kp-newcomb' | 'kp-old' | 'lahiri' | 'raman' | 'custom'; /** * Custom ayanamsa value in degrees. When provided, overrides the computed ayanamsa from the selected type. Use for testing with specific ayanamsa values or matching a particular reference source. */ ayanamsaValue?: number; }; export type KpAyanamsaResponse = { /** * Date for which ayanamsa was calculated */ date: string; /** * The exact UTC instant the value was computed for, after applying the time and timezone. Echoed so a client reconciling to the arcsecond can confirm the moment rather than infer it from the date alone. Equals midnight UTC of the date when no time was supplied. */ instant: string; /** * KP-Newcomb ayanamsa value in degrees */ ayanamsa: number; /** * Ayanamsa type identifier */ type: string; /** * Mathematical basis for ayanamsa calculation */ formula: string; /** * UTC timestamp when calculation was performed */ calculated: string; }; export type KpPlanetsResponse = { /** * Applied ayanamsa value in degrees */ ayanamsa: number; planets: Array<{ /** * Vedic graha name (Sun, Moon, Mars, Mercury, Jupiter, Venus, Saturn, Rahu, Ketu). */ planet: string; /** * KP sidereal longitude in degrees (0-360). Used to determine Placidus house placement and KP subdivision (sign, star, sub). */ longitude: number; /** * Zodiac sign (rashi) this planet occupies in the sidereal zodiac. */ sign: string; /** * Rashi lord (sign ruler). First level of the KP significator hierarchy. Its house ownership determines L4 significations. */ signLord: string; /** * Nakshatra (lunar mansion) this planet occupies. One of 27 nakshatras, each spanning 13 degrees 20 minutes. */ nakshatra: string; /** * Nakshatra sequence number (1-27). Ashwini=1 through Revati=27. */ nakshatraNumber: number; /** * Nakshatra lord (star ruler) from the Vimshottari dasha sequence. Determines the nature of results this planet delivers in KP. */ nakshatraLord: string; /** * Nakshatra pada/quarter (1-4) */ pada: number; /** * Star-lord (same as nakshatra lord in KP system) */ starLord: string; /** * Sub-lord based on 249-level KP subdivision */ subLord: string; /** * Sub-sub lord (SSL) based on 2241-level KP subdivision. Third level of Vimshottari dasha proportions. */ subSubLord: string; /** * KP horary number (1-249) */ kpNumber: number; /** * Whether planet is in retrograde motion */ retrograde: boolean; }>; }; export type KpPlanetsRequest = { /** * Birth date in YYYY-MM-DD format */ date: string; /** * Birth time in 24-hour HH:MM:SS format */ time: string; /** * Birth location latitude in decimal degrees */ latitude: number; /** * Birth location longitude in decimal degrees */ longitude: number; /** * Timezone offset from UTC in hours. Defaults to 5.5 (IST) for Vedic astrology. */ timezone?: number | string; /** * Ayanamsa system for sidereal conversion. "kp-newcomb" uses the KP-Newcomb dynamic formula (most common for KP). "kp-old" uses the Krishnamurti original table. "lahiri" uses Lahiri/Chitrapaksha ayanamsa matching most traditional Vedic software. "raman" uses the B.V. Raman ayanamsa, about 1.45 degrees below Lahiri. "custom" allows providing your own value via ayanamsaValue. Defaults to "kp-newcomb". */ ayanamsa?: 'kp-newcomb' | 'kp-old' | 'lahiri' | 'raman' | 'custom'; /** * Custom ayanamsa value in degrees. When provided, overrides the computed ayanamsa from the selected type. Use for testing with specific ayanamsa values or matching a particular reference source. */ ayanamsaValue?: number; /** * Lunar node convention. "mean" is the smoothed average node, which always moves retrograde; "true" is the osculating node, which tracks the real perturbed node, oscillates up to about 1.5 degrees either side of the mean on a 173-day cycle, and can briefly turn direct. Neither is more correct and they almost always fall in the same sign. Applies to the Rahu and Ketu positions. Mean is the traditional Vedic default and what printed panchangs use; the choice can move a KP sub-lord in narrow boundary cases, where a span can be as small as 0.5 degrees. Defaults to "mean". */ nodeType?: 'mean' | 'true'; }; export type KpCuspsResponse = { /** * Applied ayanamsa value in degrees */ ayanamsa: number; /** * House system used for calculations */ houseSystem: string; cusps: Array<{ /** * House number (1-12) */ house: number; /** * Cusp longitude in degrees (0-360) */ longitude: number; /** * Zodiac sign of the cusp */ sign: string; /** * Rashi lord (sign ruler) of this cusp. In KP, the cusp sign lord is a significator for this house. */ signLord: string; /** * Nakshatra (lunar mansion) at this cusp degree. The cusp nakshatra lord and sublord together determine the houses complete significator chain. */ nakshatra: string; /** * Nakshatra lord (star ruler) of the cusp. One of 9 Vimshottari dasha lords. Determines which planet activates this cusp in KP predictions. */ nakshatraLord: string; /** * Nakshatra pada/quarter (1-4) */ pada: number; /** * Star-lord (nakshatra lord) */ starLord: string; /** * Sub-lord based on KP 249-level subdivision */ subLord: string; /** * Sub-sub lord (SSL) based on 2241-level KP subdivision. Third level of Vimshottari dasha proportions. */ subSubLord: string; /** * KP horary number (1-249) */ kpNumber: number; }>; /** * Significations of each of the twelve bhavas (houses), keyed by house number 1 to 12, as short keywords. Bhava 1 is the Lagna (self, body, vitality), 2 wealth and speech, 4 home and mother, 7 marriage and partnership, 10 career and status, 11 gains. Use it to label the house numbers returned elsewhere in the response: a Vimshottari dasha period signifying houses 2, 7 and 8, or a KP significator carrying houses 11 and 6, becomes readable text without a separate lookup call. Returned once per response rather than repeated per period, and localized by the lang query parameter alongside every other interpretation field. */ houseThemes: { [key: string]: Array; }; /** * Which signification vocabulary produced the houseThemes keywords in this response, echoing the focus query parameter. Always present, and "general" when the parameter was omitted. Read it to label a rendered house legend, or to tell two cached responses apart when only one asked for the finance lens. */ focus: 'general' | 'finance'; }; export type KpCuspsRequest = { /** * Birth date in YYYY-MM-DD format */ date: string; /** * Birth time in 24-hour HH:MM:SS format */ time: string; /** * Birth location latitude in decimal degrees */ latitude: number; /** * Birth location longitude in decimal degrees */ longitude: number; /** * Timezone offset from UTC in hours. Defaults to 5.5 (IST) for Vedic astrology. */ timezone?: number | string; /** * Ayanamsa system for sidereal conversion. "kp-newcomb" uses the KP-Newcomb dynamic formula (most common for KP). "kp-old" uses the Krishnamurti original table. "lahiri" uses Lahiri/Chitrapaksha ayanamsa matching most traditional Vedic software. "raman" uses the B.V. Raman ayanamsa, about 1.45 degrees below Lahiri. "custom" allows providing your own value via ayanamsaValue. Defaults to "kp-newcomb". */ ayanamsa?: 'kp-newcomb' | 'kp-old' | 'lahiri' | 'raman' | 'custom'; /** * Custom ayanamsa value in degrees. When provided, overrides the computed ayanamsa from the selected type. Use for testing with specific ayanamsa values or matching a particular reference source. */ ayanamsaValue?: number; }; export type KpChartResponse = { /** * Chart metadata including birth data, ayanamsa, and house system. */ meta: { /** * Birth date in YYYY-MM-DD format used for this KP chart calculation. */ date: string; /** * Birth time in HH:MM:SS format used for Lagna and Placidus cusp calculations. */ time: string; /** * Birth location latitude in decimal degrees. Determines Placidus house cusps and Ascendant. */ latitude: number; /** * Birth location longitude in decimal degrees. Affects local sidereal time for house calculations. */ longitude: number; /** * Timezone offset from UTC in decimal hours used for time conversion. */ timezone: number; /** * KP Newcomb ayanamsa value in degrees. Precession correction applied to convert tropical to sidereal positions. */ ayanamsa: number; /** * Ayanamsa system used, echoing the ayanamsa field of the request: "kp-newcomb", "kp-old", "lahiri", "raman" or "custom". */ ayanamsaType: string; /** * House system used (Placidus, standard for KP astrology). */ houseSystem: string; }; /** * Ascendant (Lagna) details with full KP stellar hierarchy. */ ascendant: { /** * Sidereal longitude of Ascendant (Lagna) in degrees. */ longitude: number; /** * Zodiac sign of the Ascendant. */ sign: string; /** * Ruling planet of the Ascendant sign (the rashi lord). In KP this is the weakest of the four lords, ranked below the star lord and sub lord, but it still sets the broad temperament of the Lagna. */ signLord: string; /** * Nakshatra (star) of the Ascendant. */ nakshatra: string; /** * Lord of the Ascendant nakshatra. */ nakshatraLord: string; /** * Nakshatra pada (1-4) of the Ascendant. */ pada: number; /** * KP star lord of the Ascendant position. */ starLord: string; /** * KP sub lord of the Ascendant. crucial for KP predictions. The Ascendant sub lord determines overall life promise. */ subLord: string; /** * KP sub-sub lord (SSL) of the Ascendant. Third level of the Vimshottari subdivision hierarchy, used for fine-tuning predictions. */ subSubLord: string; /** * KP number (1-249) for the Ascendant degree. */ kpNumber: number; }; /** * All 12 Placidus house cusps with KP stellar hierarchy. Cusp sub lords are the primary predictive tool in KP astrology. */ cusps: Array<{ /** * House number (1-12). */ house: number; /** * Placidus cusp longitude in sidereal degrees. */ longitude: number; /** * Zodiac sign at the cusp. */ sign: string; /** * Lord of the zodiac sign at the cusp (house owner). */ signLord: string; /** * Nakshatra at the cusp degree. */ nakshatra: string; /** * Lord of the nakshatra at the cusp. */ nakshatraLord: string; /** * Nakshatra pada (1-4) at the cusp. */ pada: number; /** * KP star lord of the cusp. */ starLord: string; /** * KP sub lord of the cusp. the deciding factor for house-level predictions in KP astrology. */ subLord: string; /** * KP sub-sub lord (SSL) of the cusp. Third level of Vimshottari subdivision for fine-grained cusp analysis. */ subSubLord: string; /** * KP number (1-249) for the cusp degree. */ kpNumber: number; }>; /** * Positions of all 7 visible planets with complete KP stellar breakdown. */ planets: Array<{ /** * Planet name (Sun through Saturn, 7 visible planets). */ planet: string; /** * Sidereal longitude in degrees (KP ayanamsa corrected). */ longitude: number; /** * Zodiac sign the planet occupies. */ sign: string; /** * Rashi lord (sign ruler). First level of the KP significator hierarchy. Its house ownership determines L4 significations. */ signLord: string; /** * House number (1-12) based on Placidus cusps. */ house: number; /** * Nakshatra the planet occupies. */ nakshatra: string; /** * Nakshatra lord (same as star lord). */ nakshatraLord: string; /** * Nakshatra pada (1-4). */ pada: number; /** * KP star lord, determines primary house signification. */ starLord: string; /** * KP sub lord, the decisive factor. Planet gives results of the houses signified by its sub lord. */ subLord: string; /** * KP sub-sub lord (SSL) of the planet. Third level of Vimshottari subdivision for precise timing analysis. */ subSubLord: string; /** * KP number (1-249). */ kpNumber: number; /** * True if planet is retrograde. Retrograde planets may delay or deny results in KP system. */ retrograde: boolean; }>; /** * Lunar nodes (Rahu and Ketu) with KP stellar hierarchy. Nodes are powerful agents that amplify the significations of their dispositors. */ nodes: { /** * Rahu (North Lunar Node), shadow planet, always retrograde, acts as agent of its sign lord and star lord. */ rahu: { /** * Sidereal longitude of Rahu (North Node). */ longitude: number; /** * Zodiac sign Rahu occupies. */ sign: string; /** * Rashi lord of the sign Rahu occupies. Rahu has no sign of its own and acts as agent of this lord. */ signLord: string; /** * Occupied house number (1-12) based on Placidus cusps. */ house: number; /** * Nakshatra of Rahu. */ nakshatra: string; /** * Nakshatra pada (1-4) of Rahu. */ pada: number; /** * KP star lord of Rahu. */ starLord: string; /** * KP sub lord of Rahu. */ subLord: string; /** * KP sub-sub lord (SSL) of Rahu. */ subSubLord: string; /** * KP number (1-249) locating Rahu in the 249-division sub-lord scheme. Each of the 249 divisions maps to a unique sign, star lord and sub lord triple, so one integer pins the position precisely enough for KP event timing. */ kpNumber: number; }; /** * Ketu (South Lunar Node), shadow planet, spiritual karmic indicator. */ ketu: { /** * Sidereal longitude of Ketu (South Node). Always 180 degrees from Rahu. */ longitude: number; /** * Zodiac sign Ketu occupies. */ sign: string; /** * Rashi lord of the sign Ketu occupies. Ketu has no sign of its own and acts as agent of this lord. */ signLord: string; /** * Occupied house number (1-12) based on Placidus cusps. */ house: number; /** * Nakshatra of Ketu. */ nakshatra: string; /** * Nakshatra pada (1-4) of Ketu. */ pada: number; /** * KP star lord of Ketu. */ starLord: string; /** * KP sub lord of Ketu. */ subLord: string; /** * KP sub-sub lord (SSL) of Ketu. */ subSubLord: string; /** * KP number (1-249) locating Ketu in the 249-division sub-lord scheme. Each of the 249 divisions maps to a unique sign, star lord and sub lord triple, so one integer pins the position precisely enough for KP event timing. */ kpNumber: number; }; }; /** * KP significators for event prediction and timing. Shows which planets signify each house (house-wise) and which houses each planet signifies (planet-wise). Strength order: Level 1 (planets in star of occupant) > Level 2 (occupants) > Level 3 (planets in star of owner) > Level 4 (house owner). */ significators: { houseWise: Array<{ /** * House number 1-12 */ house: number; significators: Array<{ /** * KP significator strength level (1-4). L1: planets in star of occupant (strongest). L2: occupant itself. L3: planets in star of owner. L4: sign owner. Lower number = stronger signification for this house. */ level: number; /** * Human-readable label for this KP significator level. */ description: string; /** * Planets signifying this house at this strength level. */ planets: Array; }>; /** * The four levels flattened, strongest first, repeats included: a planet that reaches the house at two levels appears once per level, so the length counts level hits. The levels beside it are the per-level view. */ all: Array; }>; planetWise: Array<{ /** * Vedic graha (planet) being analyzed for its house significations. */ planet: string; signifies: Array<{ /** * KP significator strength level (1-4). L1 strongest, L4 weakest. */ level: number; /** * House numbers this planet signifies at this strength level. */ houses: Array; }>; /** * The four levels flattened, strongest first, repeats included: a house appears once per level the planet reaches it at, so the length counts level hits. The levels beside it are the per-level view. */ allHouses: Array; }>; }; /** * Significations of each of the twelve bhavas (houses), keyed by house number 1 to 12, as short keywords. Bhava 1 is the Lagna (self, body, vitality), 2 wealth and speech, 4 home and mother, 7 marriage and partnership, 10 career and status, 11 gains. Use it to label the house numbers returned elsewhere in the response: a Vimshottari dasha period signifying houses 2, 7 and 8, or a KP significator carrying houses 11 and 6, becomes readable text without a separate lookup call. Returned once per response rather than repeated per period, and localized by the lang query parameter alongside every other interpretation field. */ houseThemes: { [key: string]: Array; }; /** * Which signification vocabulary produced the houseThemes keywords in this response, echoing the focus query parameter. Always present, and "general" when the parameter was omitted. Read it to label a rendered house legend, or to tell two cached responses apart when only one asked for the finance lens. */ focus: 'general' | 'finance'; }; export type KpChartRequest = { /** * Birth date in YYYY-MM-DD format */ date: string; /** * Birth time in 24-hour HH:MM:SS format. CRITICAL for accurate Lagna and house calculations. */ time: string; /** * Birth location latitude in decimal degrees */ latitude: number; /** * Birth location longitude in decimal degrees */ longitude: number; /** * Timezone offset from UTC in hours. Defaults to 5.5 (IST) for Vedic astrology. */ timezone?: number | string; /** * Ayanamsa system for sidereal conversion. "kp-newcomb" uses the KP-Newcomb dynamic formula (most common for KP). "kp-old" uses the Krishnamurti original table. "lahiri" uses Lahiri/Chitrapaksha ayanamsa matching most traditional Vedic software. "raman" uses the B.V. Raman ayanamsa, about 1.45 degrees below Lahiri. "custom" allows providing your own value via ayanamsaValue. Defaults to "kp-newcomb". */ ayanamsa?: 'kp-newcomb' | 'kp-old' | 'lahiri' | 'raman' | 'custom'; /** * Custom ayanamsa value in degrees. When provided, overrides the computed ayanamsa from the selected type. Use for testing with specific ayanamsa values or matching a particular reference source. */ ayanamsaValue?: number; /** * Lunar node convention. "mean" is the smoothed average node, which always moves retrograde; "true" is the osculating node, which tracks the real perturbed node, oscillates up to about 1.5 degrees either side of the mean on a 173-day cycle, and can briefly turn direct. Neither is more correct and they almost always fall in the same sign. Applies to the Rahu and Ketu positions. Mean is the traditional Vedic default and what printed panchangs use; the choice can move a KP sub-lord in narrow boundary cases, where a span can be as small as 0.5 degrees. Defaults to "mean". */ nodeType?: 'mean' | 'true'; }; export type KpRulingPlanetsResponse = { /** * Calculation datetime (ISO 8601) */ datetime: string; /** * Observer location coordinates */ location: { /** * Observer latitude in decimal degrees, echoed back from the request. Sets the local sidereal time behind the KP ascendant and therefore the Lagna sublord. */ latitude: number; /** * Observer longitude in decimal degrees, echoed back from the request. East is positive, west is negative. */ longitude: number; /** * Numeric UTC offset in decimal hours the calculation consumed. An IANA name sent on the request is resolved to its DST-correct offset upstream, so this is always a number. */ timezone: number; }; /** * Lord of the weekday (Sun=Sunday through Saturn=Saturday) */ dayLord: string; /** * Lord of the zodiac sign where Moon is placed */ moonSignLord: string; /** * Lord of the nakshatra where Moon is placed */ moonStarLord: string; /** * Sub-lord of the KP division where Moon is placed */ moonSublord: string; /** * Sub-sub lord (SSL) of the KP division where Moon is placed */ moonSubSublord: string; /** * Lord of the rising zodiac sign (Ascendant) */ lagnaSignLord: string; /** * Lord of the nakshatra where Ascendant falls */ lagnaStarLord: string; /** * Sub-lord of the KP division where Ascendant falls */ lagnaSublord: string; /** * Sub-sub lord (SSL) of the KP division where Ascendant falls */ lagnaSubSublord: string; /** * Unique ruling planets in order of strength. Strongest planet appears first. */ rulingPlanets: Array; /** * Houses signified by each ruling planet (only when birthDate and birthTime provided). Based on 4-level KP significator hierarchy from birth chart. */ significators?: Array<{ /** * Planet abbreviation. */ planet: string; /** * Houses this planet signifies, ordered by KP 4-level strength: L1 (planet in star of occupant, strongest), L2 (planet occupies), L3 (planet in star of owner), L4 (planet owns). First element is the strongest signification, not the occupied house. */ signifies: Array; }>; /** * Significations of each of the twelve bhavas (houses), keyed by house number 1 to 12, as short keywords. Bhava 1 is the Lagna (self, body, vitality), 2 wealth and speech, 4 home and mother, 7 marriage and partnership, 10 career and status, 11 gains. Use it to label the house numbers returned elsewhere in the response: a Vimshottari dasha period signifying houses 2, 7 and 8, or a KP significator carrying houses 11 and 6, becomes readable text without a separate lookup call. Returned once per response rather than repeated per period, and localized by the lang query parameter alongside every other interpretation field. */ houseThemes?: { [key: string]: Array; }; /** * Which signification vocabulary produced the houseThemes keywords in this response, echoing the focus query parameter. Always present, and "general" when the parameter was omitted. Read it to label a rendered house legend, or to tell two cached responses apart when only one asked for the finance lens. */ focus?: 'general' | 'finance'; }; export type KpRulingPlanetsIntervalResponse = { /** * Start of the KP ruling planets interval range (ISO 8601). */ startDatetime: string; /** * End of the KP ruling planets interval range (ISO 8601). */ endDatetime: string; /** * Time gap between consecutive ruling planet calculations in minutes. */ intervalMinutes: number; /** * Observer location coordinates used for erecting the Placidus prashna chart at each interval. */ location: { /** * Observer latitude used for Placidus house and Lagna (Ascendant) calculation. */ latitude: number; /** * Observer longitude used for local sidereal time and Ascendant degree. */ longitude: number; /** * Timezone offset applied to output times and sunrise-based Day Lord calculation. */ timezone: number; }; /** * Total number of intervals returned */ totalIntervals: number; /** * Ruling planets with significators at each interval */ intervals: Array<{ /** * UTC date for this interval (YYYY-MM-DD). */ date: string; /** * UTC time for this interval (HH:MM, 24-hour). */ time: string; /** * Full ISO 8601 timestamp for this interval. */ datetime: string; /** * Ruling planet of the weekday based on Hindu sunrise Vara. Changes at local sunrise, not midnight. */ dayLord: string; /** * Lord of the zodiac sign (rashi) where Moon is placed at this moment. */ moonSignLord: string; /** * Lord of the nakshatra (star, 1 of 27) where Moon is placed. Follows Vimshottari dasha sequence. */ moonStarLord: string; /** * KP sublord of Moons exact position within the nakshatra subdivision (1 of 249). */ moonSublord: string; /** * KP sub-sublord (SSL) of Moons position. Finest subdivision for precise timing. */ moonSubSublord: string; /** * Lord of the Ascendant (Lagna) zodiac sign. Changes roughly every 2 hours as houses rotate. */ lagnaSignLord: string; /** * Lord of the nakshatra where the Ascendant degree falls. */ lagnaStarLord: string; /** * KP sublord of the Ascendant degree. Changes every few minutes. key for birth time rectification. */ lagnaSublord: string; /** * KP sub-sublord of the Ascendant. Most granular level for pinpointing exact moments. */ lagnaSubSublord: string; /** * Unique set of ruling planets derived from Day Lord, Moon Sign/Star Lords, and Lagna Sign/Star Lords. In KP astrology, events manifest when dasha/transit planets match these ruling planets. */ rulingPlanets: Array; /** * KP significators for each ruling planet calculated from this moments Placidus chart. Shows which houses (1-12) each ruling planet signifies right now. Significators change as the Ascendant rotates through signs. */ significators: Array<{ /** * Ruling planet name. */ planet: string; /** * Unique house numbers this planet signifies, ordered by strength. Uses 4-level KP hierarchy: Level 1 (strongest) planets in star of occupant, Level 2 occupants, Level 3 planets in star of owner, Level 4 owner. */ signifies: Array; }>; /** * KP 4-level significator breakdown for the Moon Sign Lord planet. Shows which houses the Moon rashi lord activates at this moment, broken down by strength tier. */ moonSignLordSignifies: { /** * Level 1, the strongest signification (grade A). Houses influenced because this planet sits in the nakshatra (star) of a planet occupying those houses. For Rahu and Ketu, also includes the L1 houses of their agent planets (conjoined, aspecting, sign lord). */ L1: Array; /** * Level 2 (grade B). The house this planet physically occupies. For Rahu and Ketu, also includes houses occupied by their agent planets. */ L2: Array; /** * Level 3 (grade C). Houses influenced because this planet sits in the nakshatra of the sign lord (owner) of those houses. For Rahu and Ketu, also includes the L3 houses of their agent planets. */ L3: Array; /** * Level 4, the weakest signification (grade D). Houses this planet rules by zodiac sign ownership, up to 2 for Sun through Saturn and 3 where a sign is intercepted. Rahu and Ketu own no sign, so their L4 comes entirely from their agent planets. */ L4: Array; }; /** * KP 4-level significator breakdown for the Moon Star Lord (nakshatra lord) planet. The star lord determines the nature of results Moon delivers. */ moonStarLordSignifies: { /** * Level 1, the strongest signification (grade A). Houses influenced because this planet sits in the nakshatra (star) of a planet occupying those houses. For Rahu and Ketu, also includes the L1 houses of their agent planets (conjoined, aspecting, sign lord). */ L1: Array; /** * Level 2 (grade B). The house this planet physically occupies. For Rahu and Ketu, also includes houses occupied by their agent planets. */ L2: Array; /** * Level 3 (grade C). Houses influenced because this planet sits in the nakshatra of the sign lord (owner) of those houses. For Rahu and Ketu, also includes the L3 houses of their agent planets. */ L3: Array; /** * Level 4, the weakest signification (grade D). Houses this planet rules by zodiac sign ownership, up to 2 for Sun through Saturn and 3 where a sign is intercepted. Rahu and Ketu own no sign, so their L4 comes entirely from their agent planets. */ L4: Array; }; /** * KP 4-level significator breakdown for the Moon Sub Lord planet. The sub lord determines whether Moon-related events will manifest. */ moonSublordSignifies: { /** * Level 1, the strongest signification (grade A). Houses influenced because this planet sits in the nakshatra (star) of a planet occupying those houses. For Rahu and Ketu, also includes the L1 houses of their agent planets (conjoined, aspecting, sign lord). */ L1: Array; /** * Level 2 (grade B). The house this planet physically occupies. For Rahu and Ketu, also includes houses occupied by their agent planets. */ L2: Array; /** * Level 3 (grade C). Houses influenced because this planet sits in the nakshatra of the sign lord (owner) of those houses. For Rahu and Ketu, also includes the L3 houses of their agent planets. */ L3: Array; /** * Level 4, the weakest signification (grade D). Houses this planet rules by zodiac sign ownership, up to 2 for Sun through Saturn and 3 where a sign is intercepted. Rahu and Ketu own no sign, so their L4 comes entirely from their agent planets. */ L4: Array; }; /** * KP 4-level significator breakdown for Moon itself. Shows which bhavas Moon directly activates based on its position and star lord in the current moment chart. */ moonSignifies: { /** * Level 1, the strongest signification (grade A). Houses influenced because this planet sits in the nakshatra (star) of a planet occupying those houses. For Rahu and Ketu, also includes the L1 houses of their agent planets (conjoined, aspecting, sign lord). */ L1: Array; /** * Level 2 (grade B). The house this planet physically occupies. For Rahu and Ketu, also includes houses occupied by their agent planets. */ L2: Array; /** * Level 3 (grade C). Houses influenced because this planet sits in the nakshatra of the sign lord (owner) of those houses. For Rahu and Ketu, also includes the L3 houses of their agent planets. */ L3: Array; /** * Level 4, the weakest signification (grade D). Houses this planet rules by zodiac sign ownership, up to 2 for Sun through Saturn and 3 where a sign is intercepted. Rahu and Ketu own no sign, so their L4 comes entirely from their agent planets. */ L4: Array; }; }>; /** * Significations of each of the twelve bhavas (houses), keyed by house number 1 to 12, as short keywords. Bhava 1 is the Lagna (self, body, vitality), 2 wealth and speech, 4 home and mother, 7 marriage and partnership, 10 career and status, 11 gains. Use it to label the house numbers returned elsewhere in the response: a Vimshottari dasha period signifying houses 2, 7 and 8, or a KP significator carrying houses 11 and 6, becomes readable text without a separate lookup call. Returned once per response rather than repeated per period, and localized by the lang query parameter alongside every other interpretation field. */ houseThemes: { [key: string]: Array; }; /** * Which signification vocabulary produced the houseThemes keywords in this response, echoing the focus query parameter. Always present, and "general" when the parameter was omitted. Read it to label a rendered house legend, or to tell two cached responses apart when only one asked for the finance lens. */ focus: 'general' | 'finance'; }; export type KpSublordChangesResponse = { /** * Vedic graha tracked for KP sublord transitions across the 249-division zodiac. */ planet: string; /** * Beginning of the sublord change search range (YYYY-MM-DD). */ startDate: string; /** * End of the sublord change search range (YYYY-MM-DD). */ endDate: string; /** * Total Krishnamurti sublord transitions detected. The Moon, the fastest body, crosses about 9 sublords a day. */ totalChanges: number; /** * Chronological list of KP sublord boundary crossings. Each entry marks when the tracked graha moves from one Krishnamurti subdivision to the next in the 249-part zodiac. */ changes: Array<{ /** * Date of the sublord boundary crossing (YYYY-MM-DD). Adjusted to requested timezone. */ date: string; /** * Sublord transition time (HH:MM, 24-hour): the instant is found to the second and shown to the minute it falls in. Adjusted to requested timezone. */ time: string; /** * Full datetime of the KP sublord change. Adjusted to requested timezone for prashna kundali timing. */ datetime: string; /** * Previous KP number (1-249) in the Vimshottari-based zodiac subdivision the planet occupied. */ fromKp: number; /** * New KP number (1-249) the planet enters. Each number maps to a unique star lord and sublord combination. */ toKp: number; /** * KP sublord planet before transition. The sublord determines whether an event signified by the star lord will manifest. */ fromSublord: string; /** * New KP sublord planet after transition. A change in sublord shifts the houses signified by the tracked planet. */ toSublord: string; /** * Nakshatra lord (star lord) before transition. Follows the Vimshottari dasha sequence of 9 planets. */ fromNakshatraLord: string; /** * Nakshatra lord after transition. Changes only when the planet crosses a nakshatra boundary (every 13d20m). */ toNakshatraLord: string; }>; }; export type KpSublordChangesRequest = { /** * Planet to track (case-insensitive). Valid values: Sun, Moon, Mars, Mercury, Jupiter, Venus, Saturn */ planet: 'Sun' | 'Moon' | 'Mars' | 'Mercury' | 'Jupiter' | 'Venus' | 'Saturn'; /** * First day of the search (YYYY-MM-DD), a calendar day in `timezone`. */ startDate: string; /** * Last day of the search, inclusive (YYYY-MM-DD), a calendar day in `timezone`. Not before startDate, at most 365 days after it. */ endDate: string; /** * IANA name (e.g. "America/New_York", "Europe/London"), a fixed offset like "+05:30", OR decimal hours from UTC. One offset is taken from startDate (DST-correct for that date) and used for the whole range, so a window crossing a daylight-saving change is read on the earlier offset throughout; send a fixed offset if you need that explicit. The two dates are read as calendar days in this timezone and output times are converted to it, so one date with 5.5 is that whole Indian day. Defaults to 0 (UTC). */ timezone?: number | string; /** * Ayanamsa system for sidereal conversion. "kp-newcomb" uses the KP-Newcomb dynamic formula, the most common choice for KP astrology. "kp-old" uses the Krishnamurti original table from KP Reader-1 with constant precession rate. "lahiri" uses Lahiri/Chitrapaksha ayanamsa, matching most traditional Vedic software. "raman" uses the B.V. Raman ayanamsa from Hindu Predictive Astrology, a recognised traditional school that sits about 1.45 degrees below Lahiri. Defaults to "kp-newcomb". */ ayanamsa?: 'kp-newcomb' | 'kp-old' | 'lahiri' | 'raman'; /** * Lunar node convention. "mean" is the smoothed average node, which always moves retrograde; "true" is the osculating node, which tracks the real perturbed node, oscillates up to about 1.5 degrees either side of the mean on a 173-day cycle, and can briefly turn direct. Neither is more correct and they almost always fall in the same sign. Applies to the Rahu and Ketu positions. Mean is the traditional Vedic default and what printed panchangs use; the choice can move a KP sub-lord in narrow boundary cases, where a span can be as small as 0.5 degrees. Defaults to "mean". */ nodeType?: 'mean' | 'true'; }; export type KpRasiChangesResponse = { /** * Vedic graha being tracked for rasi parivartan (sign ingress) events. */ planet: string; /** * Beginning of the rasi change search range (YYYY-MM-DD). */ startDate: string; /** * End of the rasi change search range (YYYY-MM-DD). */ endDate: string; /** * Total rasi parivartan events detected in the date range. Moon averages 12-13 per month, Sun once per month. */ totalChanges: number; /** * Chronological list of rasi parivartan (zodiac sign change) events with precise ingress timestamps. Each entry marks when the tracked graha crosses a 30-degree sign boundary. */ changes: Array<{ /** * Date of the rasi ingress event (YYYY-MM-DD). Adjusted to requested timezone for local panchang use. */ date: string; /** * Ingress time (HH:MM, 24-hour): the instant is found to the second and shown to the minute it falls in. Adjusted to requested timezone. */ time: string; /** * Full rasi parivartan datetime. Adjusted to requested timezone for transit calendar integration. */ datetime: string; /** * Zodiac sign (rashi) the planet is leaving. One of 12 sidereal signs using KP ayanamsa. */ fromSign: string; /** * Rashi lord (planetary ruler) of the departing sign. Determines the Vimshottari dasha connection. */ fromSignLord: string; /** * New zodiac sign entered by the planet. Marks the beginning of a new transit phase in Vedic gochar analysis. */ toSign: string; /** * Rashi lord of the newly entered sign. Key for KP significator analysis and dasha-transit matching. */ toSignLord: string; }>; }; export type KpRasiChangesRequest = { /** * Planet to track (case-insensitive). Valid values: Sun, Moon, Mars, Mercury, Jupiter, Venus, Saturn */ planet: 'Sun' | 'Moon' | 'Mars' | 'Mercury' | 'Jupiter' | 'Venus' | 'Saturn'; /** * First day of the search (YYYY-MM-DD), a calendar day in `timezone`. */ startDate: string; /** * Last day of the search, inclusive (YYYY-MM-DD), a calendar day in `timezone`. Not before startDate, at most 365 days after it. */ endDate: string; /** * IANA name (e.g. "America/New_York", "Europe/London"), a fixed offset like "+05:30", OR decimal hours from UTC. One offset is taken from startDate (DST-correct for that date) and used for the whole range, so a window crossing a daylight-saving change is read on the earlier offset throughout; send a fixed offset if you need that explicit. The two dates are read as calendar days in this timezone and output times are converted to it, so one date with 5.5 is that whole Indian day. Defaults to 0 (UTC). */ timezone?: number | string; /** * Ayanamsa system for sidereal conversion. "kp-newcomb" uses the KP-Newcomb dynamic formula, the most common choice for KP astrology. "kp-old" uses the Krishnamurti original table from KP Reader-1 with constant precession rate. "lahiri" uses Lahiri/Chitrapaksha ayanamsa, matching most traditional Vedic software. "raman" uses the B.V. Raman ayanamsa from Hindu Predictive Astrology, a recognised traditional school that sits about 1.45 degrees below Lahiri. Defaults to "kp-newcomb". */ ayanamsa?: 'kp-newcomb' | 'kp-old' | 'lahiri' | 'raman'; /** * Lunar node convention. "mean" is the smoothed average node, which always moves retrograde; "true" is the osculating node, which tracks the real perturbed node, oscillates up to about 1.5 degrees either side of the mean on a 173-day cycle, and can briefly turn direct. Neither is more correct and they almost always fall in the same sign. Applies to the Rahu and Ketu positions. Mean is the traditional Vedic default and what printed panchangs use; the choice can move a KP sub-lord in narrow boundary cases, where a span can be as small as 0.5 degrees. Defaults to "mean". */ nodeType?: 'mean' | 'true'; }; export type KpPlanetsIntervalResponse = { /** * Start of the KP ephemeris interval range (ISO 8601). */ startDatetime: string; /** * End of the KP ephemeris interval range (ISO 8601). */ endDatetime: string; /** * Time gap between consecutive planetary snapshots in minutes. Determines the granularity of the KP transit table. */ intervalMinutes: number; /** * Total number of time points calculated (inclusive of both start and end). */ totalIntervals: number; /** * Ayanamsa system used for this calculation. "kp-newcomb" = KP-Newcomb (dynamic), "kp-old" = Krishnamurti original (constant rate), "lahiri" = Lahiri/Chitrapaksha. */ ayanamsa: string; /** * Ayanamsa value in degrees used for sidereal conversion. Verify this against your reference source to confirm correct ayanamsa is applied. */ ayanamsaValue: number; /** * Array of planetary snapshots at each time interval */ intervals: Array<{ /** * Date for this data point (YYYY-MM-DD). Adjusted to requested timezone. */ date: string; /** * Time for this data point (HH:MM). Adjusted to requested timezone. */ time: string; /** * Full datetime for this data point. Adjusted to requested timezone. */ datetime: string; /** * Planet positions keyed by planet name (Sun, Moon, Mars, Mercury, Jupiter, Venus, Saturn, Rahu, Ketu) */ planets: { [key: string]: { /** * Sidereal longitude in degrees (0-360) using KP ayanamsa. The primary coordinate for all KP sublord lookups. */ longitude: number; /** * Degree within the current rashi (0-30). Useful for gauging how far into a sign the planet has progressed. */ degreeInSign: number; /** * Sidereal zodiac sign (rashi) the planet occupies at this interval. */ sign: string; /** * Rashi lord (sign ruler). First level of the KP significator hierarchy. Its house ownership determines L4 significations for this planet. */ signLord: string; /** * Nakshatra (lunar mansion) the planet occupies. One of 27 Vedic nakshatras spanning 13 degrees 20 minutes each. */ nakshatra: string; /** * Star lord (nakshatra ruler) from Vimshottari dasha sequence. Determines the nature of results this planet delivers. Its occupied and owned houses become L1 and L3 significations. */ nakshatraLord: string; /** * KP sublord within the 249-part zodiac division. The deciding factor in KP predictions. An event manifests only if the sublord signifies the relevant house. */ sublord: string; /** * KP sub-sublord (SSL). Third level of Vimshottari subdivision (2,241 divisions). Refines timing within the sublord period for precise event prediction. */ subSublord: string; /** * KP number (1-249) identifying the exact Vimshottari subdivision. Each number maps to a unique star lord and sublord combination. */ kpNumber: number; /** * True if the planet is in retrograde (vakri) motion. Rahu and Ketu are always retrograde. Retrograde planets deliver results differently in KP analysis. */ isRetrograde: boolean; }; }; }>; }; export type KpPlanetsIntervalRequest = { /** * Start datetime in ISO 8601 (YYYY-MM-DDTHH:MM:SS). Interpreted as local time when a non-zero timezone is provided (a trailing Z is accepted but ignored); with timezone 0 it is UTC. */ startDatetime: string; /** * End datetime in ISO 8601 (YYYY-MM-DDTHH:MM:SS). Maximum 7 days from start. Interpreted as local time when a non-zero timezone is provided (a trailing Z is accepted but ignored); with timezone 0 it is UTC. */ endDatetime: string; /** * Time between calculations in minutes. Range: 15 (quarter-hourly) to 1440 (daily). */ intervalMinutes: number; /** * Observer latitude in decimal degrees (for future Lagna calculations) */ latitude: number; /** * Observer longitude in decimal degrees (for future Lagna calculations) */ longitude: number; /** * IANA name (e.g. "America/New_York", "Europe/London") OR decimal hours from UTC. IANA resolved to the DST-correct offset for the startDatetime date. When non-zero, all datetimes are treated as local time in this timezone (Z suffix is ignored). Defaults to 0 (UTC). */ timezone?: number | string; /** * Ayanamsa system for sidereal conversion. "kp-newcomb" uses the KP-Newcomb dynamic formula, the most common choice for KP astrology. "kp-old" uses the Krishnamurti original table from KP Reader-1 with constant precession rate. "lahiri" uses Lahiri/Chitrapaksha ayanamsa, matching most traditional Vedic software. "raman" uses the B.V. Raman ayanamsa from Hindu Predictive Astrology, a recognised traditional school that sits about 1.45 degrees below Lahiri. Defaults to "kp-newcomb". */ ayanamsa?: 'kp-newcomb' | 'kp-old' | 'lahiri' | 'raman'; /** * Lunar node convention. "mean" is the smoothed average node, which always moves retrograde; "true" is the osculating node, which tracks the real perturbed node, oscillates up to about 1.5 degrees either side of the mean on a 173-day cycle, and can briefly turn direct. Neither is more correct and they almost always fall in the same sign. Applies to the Rahu and Ketu positions. Mean is the traditional Vedic default and what printed panchangs use; the choice can move a KP sub-lord in narrow boundary cases, where a span can be as small as 0.5 degrees. Defaults to "mean". */ nodeType?: 'mean' | 'true'; }; /** * A complete KP horary (Prashna) chart: the Ascendant from the number, the cusps and planets from the moment of the question, plus ruling planets and four-level significators. */ export type KpHoraryResponse = { /** * The number that was asked for, echoed so a stored chart is self describing. */ horaryNumber: number; /** * UTC instant the chart was cast for, resolved from the date, time and timezone. */ questionTime: string; /** * Sidereal frame used, echoed back. */ ayanamsaType: string; /** * Degrees subtracted from every tropical longitude to produce this chart. Compare it against your reference software before treating a placement difference as a disagreement. */ ayanamsaDegrees: number; /** * The Ascendant the horary number produced. This is the ONLY part of the chart that comes from the number; everything else comes from the sky at the moment of the question. */ ascendant: { /** * Sidereal longitude of the horary Ascendant, taken as the MIDPOINT of the sub division the number names. */ longitude: number; /** * Degrees into the sign, 0 to 30, which is what a chart displays. */ degreeInSign: number; /** * Zodiac sign (rashi) of this point. */ sign: string; /** * Nakshatra (star) this point falls in. */ star: string; /** * Nakshatra lord (star lord), the second level of the KP hierarchy. */ starLord: string; /** * Sub lord, the decisive level in KP. A cusp sub lord is what answers the question: it is read for whether the matter is promised, before any timing is attempted. */ subLord: string; /** * KP horary number 1 to 249 of the sub division holding this point. Matches the standard published KP table. */ kpNumber: number; /** * Sidereal longitude where this numbered sub division begins. */ spanFrom: number; /** * Sidereal longitude where it ends. The Ascendant sits midway between this and spanFrom. */ spanTo: number; }; /** * Twelve Placidus cusps, house 1 first. House 1 is the horary Ascendant; the other eleven follow from the house frame that Ascendant implies at this latitude. */ cusps: Array<{ /** * House (bhava) number 1 to 12. */ house: number; /** * Sidereal longitude of the cusp. */ longitude: number; /** * Zodiac sign (rashi) of this point. */ sign: string; /** * Nakshatra (star) this point falls in. */ star: string; /** * Nakshatra lord (star lord), the second level of the KP hierarchy. */ starLord: string; /** * Sub lord, the decisive level in KP. A cusp sub lord is what answers the question: it is read for whether the matter is promised, before any timing is attempted. */ subLord: string; /** * KP horary number 1 to 249 of the sub division holding this point. Matches the standard published KP table. */ kpNumber: number; }>; /** * The nine grahas at the moment of the question, placed against the horary cusps. These come from the real sky, not from the number. */ planets: Array<{ /** * Graha name. */ planet: string; /** * Sidereal longitude at the moment of the question. */ longitude: number; /** * Placidus house the graha occupies in this horary chart, counted against the cusps above rather than by whole sign. */ house: number; /** * Retrograde motion flag. */ isRetrograde: boolean; /** * Sub-sub lord, the fourth KP level, used to refine timing. */ subSubLord: string; /** * Zodiac sign (rashi) of this point. */ sign: string; /** * Nakshatra (star) this point falls in. */ star: string; /** * Nakshatra lord (star lord), the second level of the KP hierarchy. */ starLord: string; /** * Sub lord, the decisive level in KP. A cusp sub lord is what answers the question: it is read for whether the matter is promised, before any timing is attempted. */ subLord: string; /** * KP horary number 1 to 249 of the sub division holding this point. Matches the standard published KP table. */ kpNumber: number; }>; /** * Ruling planets at the moment of the question. NOTE the lagna values here are from the TIME-based ascendant, which is the classical ruling-planet definition, not from the horary number. */ rulingPlanets: { /** * Lord of the Hindu weekday, counted from sunrise. */ dayLord: string; /** * Sign lord of the Moon. */ moonSignLord: string; /** * Star lord of the Moon. */ moonStarLord: string; /** * Sub lord of the Moon. */ moonSublord: string; /** * Sub-sub lord of the Moon. */ moonSubSublord: string; /** * Sign lord of the ascendant at the question moment. */ lagnaSignLord: string; /** * Star lord of that ascendant. */ lagnaStarLord: string; /** * Sub lord of that ascendant. */ lagnaSublord: string; /** * Sub-sub lord of that ascendant. */ lagnaSubSublord: string; /** * The distinct ruling planets in KP order of strength. They validate the chart: when they repeat the significators of the houses the question needs, the judgment is considered reliable. */ rulingPlanets: Array; }; /** * KP significators for event prediction and timing. Shows which planets signify each house (house-wise) and which houses each planet signifies (planet-wise). Strength order: Level 1 (planets in star of occupant) > Level 2 (occupants) > Level 3 (planets in star of owner) > Level 4 (house owner). */ significators: { houseWise: Array<{ /** * House number 1-12 */ house: number; significators: Array<{ /** * KP significator strength level (1-4). L1: planets in star of occupant (strongest). L2: occupant itself. L3: planets in star of owner. L4: sign owner. Lower number = stronger signification for this house. */ level: number; /** * Human-readable label for this KP significator level. */ description: string; /** * Planets signifying this house at this strength level. */ planets: Array; }>; /** * The four levels flattened, strongest first, repeats included: a planet that reaches the house at two levels appears once per level, so the length counts level hits. The levels beside it are the per-level view. */ all: Array; }>; planetWise: Array<{ /** * Vedic graha (planet) being analyzed for its house significations. */ planet: string; signifies: Array<{ /** * KP significator strength level (1-4). L1 strongest, L4 weakest. */ level: number; /** * House numbers this planet signifies at this strength level. */ houses: Array; }>; /** * The four levels flattened, strongest first, repeats included: a house appears once per level the planet reaches it at, so the length counts level hits. The levels beside it are the per-level view. */ allHouses: Array; }>; }; /** * Significations of each of the twelve bhavas (houses), keyed by house number 1 to 12, as short keywords. Bhava 1 is the Lagna (self, body, vitality), 2 wealth and speech, 4 home and mother, 7 marriage and partnership, 10 career and status, 11 gains. Use it to label the house numbers returned elsewhere in the response: a Vimshottari dasha period signifying houses 2, 7 and 8, or a KP significator carrying houses 11 and 6, becomes readable text without a separate lookup call. Returned once per response rather than repeated per period, and localized by the lang query parameter alongside every other interpretation field. */ houseThemes: { [key: string]: Array; }; /** * Which signification vocabulary produced the houseThemes keywords in this response, echoing the focus query parameter. Always present, and "general" when the parameter was omitted. Read it to label a rendered house legend, or to tell two cached responses apart when only one asked for the finance lens. */ focus: 'general' | 'finance'; }; export type KpHoraryRequest = { /** * Horary number from 1 to 249, given by the querent while focused on their question. It maps to one of the 249 KP sub divisions of the zodiac, and that division sets the Ascendant of the chart. The querent should give the first number that comes to mind and use it once for that question; the astrologer never chooses it. Numbers outside 1 to 249 are rejected rather than wrapped, because a wrapped number would silently answer a different question. */ horaryNumber: number; /** * Date the question was taken up for judgment, YYYY-MM-DD. Not a birth date: a horary chart needs no birth details at all, which is the point of the method. */ date: string; /** * Time the question was taken up for judgment, 24-hour HH:MM:SS. In KP practice this is the moment the astrologer receives and understands the question, not the moment the querent first thought of it. It sets every planetary position and all twelve cusps except the Ascendant. */ time: string; /** * Latitude where the question is judged, decimal degrees. The house cusps are Placidus and therefore latitude dependent, so this is the place of judgment, not the querent birthplace. */ latitude: number; /** * Longitude where the question is judged, decimal degrees. */ longitude: number; /** * Timezone: IANA name (e.g. "Asia/Kolkata") OR decimal hours from UTC. Defaults to 5.5. */ timezone?: number | string; /** * Ayanamsa system for sidereal conversion. "kp-newcomb" uses the KP-Newcomb dynamic formula (most common for KP). "kp-old" uses the Krishnamurti original table. "lahiri" uses Lahiri/Chitrapaksha ayanamsa matching most traditional Vedic software. "raman" uses the B.V. Raman ayanamsa, about 1.45 degrees below Lahiri. "custom" allows providing your own value via ayanamsaValue. Defaults to "kp-newcomb". */ ayanamsa?: 'kp-newcomb' | 'kp-old' | 'lahiri' | 'raman' | 'custom'; /** * Custom ayanamsa value in degrees. When provided, overrides the computed ayanamsa from the selected type. Use for testing with specific ayanamsa values or matching a particular reference source. */ ayanamsaValue?: number; /** * Lunar node convention. "mean" is the smoothed average node, which always moves retrograde; "true" is the osculating node, which tracks the real perturbed node, oscillates up to about 1.5 degrees either side of the mean on a 173-day cycle, and can briefly turn direct. Neither is more correct and they almost always fall in the same sign. Applies to the Rahu and Ketu positions. Mean is the traditional Vedic default and what printed panchangs use; the choice can move a KP sub-lord in narrow boundary cases, where a span can be as small as 0.5 degrees. Defaults to "mean". */ nodeType?: 'mean' | 'true'; }; export type KpDailyFinanceResponse = { /** * The civil date read. */ date: string; /** * The reading moment, local datetime in the request timezone. The ruling planets and the dasha lords are read here. */ readingAt: string; /** * Ayanamsa system for sidereal conversion. "kp-newcomb" uses the KP-Newcomb dynamic formula, the most common choice for KP astrology. "kp-old" uses the Krishnamurti original table from KP Reader-1 with constant precession rate. "lahiri" uses Lahiri/Chitrapaksha ayanamsa, matching most traditional Vedic software. "raman" uses the B.V. Raman ayanamsa from Hindu Predictive Astrology, a recognised traditional school that sits about 1.45 degrees below Lahiri. Defaults to "kp-newcomb". */ ayanamsa?: 'kp-newcomb' | 'kp-old' | 'lahiri' | 'raman'; /** * Degrees subtracted from the tropical longitudes, resolved at the birth date. One frame for the whole reading: cusps, significators, Vimshottari balance, ruling planets and Moon windows alike. */ ayanamsaDegrees: number; houses: { /** * The gain houses this reading used, the request override or the convention. */ gain: Array; /** * The loss houses this reading used, the request override or the convention. */ loss: Array; }; significators: { /** * Every planet that signifies at least one gain house at any tier. The set every row is judged against. */ gain: Array; /** * Every planet that signifies at least one loss house at any tier. A planet in both sets reads "mixed" everywhere. */ loss: Array; /** * The per-house evidence the two sets are built from, so any row can be traced to the tier that put its planet in a set. */ byHouse: Array<{ /** * The house, 1 to 12. */ house: number; /** * Which set this house feeds. Canonical English machine value. */ group: 'gain' | 'loss'; /** * The four tier significators of the house, strongest tier first: planets in the star of an occupant, occupants, planets in the star of the sign lord, the sign lord. A planet appears once per tier it reaches the house at, exactly as the KP chart route lists them. */ significators: Array; }>; }; layers: { /** * Structural promise: each cusp of the two groups judged by its sub lord, the loss cusps inverted, the mean over the rows. */ cusps: { /** * Which layer this is. Canonical English machine value, the same as its key. */ layer: 'cusps'; /** * Percent of the final score this layer carries. The four weights are cusps 30, dasha 40, rulingPlanets 15, moonWindows 15. */ weight: number; /** * The layer on its own, 0 to 100, one decimal: the mean of its rows, or for the dasha layer the level-weighted sum. The final score is the weight-sum of the four layer scores. */ score: number; rows: Array<{ /** * Whether the planet signifies at least one gain house at any of the four tiers. */ inGain: boolean; /** * Whether the planet signifies at least one loss house at any of the four tiers. */ inLoss: boolean; /** * The one classification every layer uses: "favourable" when the planet signifies a gain house and no loss house (100), "mixed" when it signifies both (50), "unfavourable" when it signifies a loss house and no gain house (0), "neutral" when it signifies neither (50). Canonical English machine value. */ verdict: 'favourable' | 'mixed' | 'unfavourable' | 'neutral'; /** * The cusp judged, 1 to 12. */ house: number; /** * Sidereal longitude of the cusp in the requested ayanamsa, degrees. */ longitude: number; /** * Lord of the sign the cusp falls in. */ signLord: string; /** * Lord of the nakshatra the cusp falls in. */ starLord: string; /** * The KP sub lord of the cusp, the one lord that decides whether the house delivers. It is the planet the row classifies. */ subLord: string; /** * True on a loss house, where the verdict score is inverted: a loss cusp whose sub lord signifies only loss scores 100, because a denied loss is good news for the native. */ inverted: boolean; /** * The verdict score, 100 / 50 / 0 / 50, after the inversion on a loss house. */ score: number; }>; }; /** * Timing: the four running Vimshottari lords at the reading moment, in the same sidereal frame as the chart, each judged and penalised if retrograde, then weighed by level. */ dasha: { /** * Which layer this is. Canonical English machine value, the same as its key. */ layer: 'dasha'; /** * Percent of the final score this layer carries. The four weights are cusps 30, dasha 40, rulingPlanets 15, moonWindows 15. */ weight: number; /** * The layer on its own, 0 to 100, one decimal: the mean of its rows, or for the dasha layer the level-weighted sum. The final score is the weight-sum of the four layer scores. */ score: number; rows: Array<{ /** * Whether the planet signifies at least one gain house at any of the four tiers. */ inGain: boolean; /** * Whether the planet signifies at least one loss house at any of the four tiers. */ inLoss: boolean; /** * The one classification every layer uses: "favourable" when the planet signifies a gain house and no loss house (100), "mixed" when it signifies both (50), "unfavourable" when it signifies a loss house and no gain house (0), "neutral" when it signifies neither (50). Canonical English machine value. */ verdict: 'favourable' | 'mixed' | 'unfavourable' | 'neutral'; /** * Which Vimshottari level this lord runs, outermost first. */ level: 'mahadasha' | 'antardasha' | 'pratyantardasha' | 'sookshmaDasha'; /** * The running lord at this level. */ lord: string; /** * ISO instant the period began. */ startDate: string; /** * ISO instant the period ends. */ endDate: string; /** * Whether the lord is retrograde in transit at the reading moment. Rahu and Ketu always are. Costs 10 points, floored at 0. */ retrograde: boolean; /** * The verdict score after the retrograde penalty. */ score: number; /** * Percent of the dasha layer this level carries, the finer levels weighed more: mahadasha 10, antardasha 20, pratyantardasha 30, sookshmaDasha 40. */ weight: number; }>; }; /** * The pulse of the moment: the KP ruling planets at the reading moment, each once, judged and penalised if retrograde, the mean over the rows. */ rulingPlanets: { /** * Which layer this is. Canonical English machine value, the same as its key. */ layer: 'rulingPlanets'; /** * Percent of the final score this layer carries. The four weights are cusps 30, dasha 40, rulingPlanets 15, moonWindows 15. */ weight: number; /** * The layer on its own, 0 to 100, one decimal: the mean of its rows, or for the dasha layer the level-weighted sum. The final score is the weight-sum of the four layer scores. */ score: number; rows: Array<{ /** * Whether the planet signifies at least one gain house at any of the four tiers. */ inGain: boolean; /** * Whether the planet signifies at least one loss house at any of the four tiers. */ inLoss: boolean; /** * The one classification every layer uses: "favourable" when the planet signifies a gain house and no loss house (100), "mixed" when it signifies both (50), "unfavourable" when it signifies a loss house and no gain house (0), "neutral" when it signifies neither (50). Canonical English machine value. */ verdict: 'favourable' | 'mixed' | 'unfavourable' | 'neutral'; /** * One ruling planet of the reading moment, listed once: the day lord, the sign and star lords of the Moon, and the sign and star lords of the ascendant. */ planet: string; /** * Whether the planet is retrograde in transit at the reading moment. Costs 10 points, floored at 0. */ retrograde: boolean; /** * The verdict score after the penalty. */ score: number; }>; }; /** * The hour hand: every stretch of the civil day over which the Moon holds one sub lord, each judged, the mean over the windows. Window boundaries are found by bisection and printed to the second. */ moonWindows: { /** * Which layer this is. Canonical English machine value, the same as its key. */ layer: 'moonWindows'; /** * Percent of the final score this layer carries. The four weights are cusps 30, dasha 40, rulingPlanets 15, moonWindows 15. */ weight: number; /** * The layer on its own, 0 to 100, one decimal: the mean of its rows, or for the dasha layer the level-weighted sum. The final score is the weight-sum of the four layer scores. */ score: number; rows: Array<{ /** * Whether the planet signifies at least one gain house at any of the four tiers. */ inGain: boolean; /** * Whether the planet signifies at least one loss house at any of the four tiers. */ inLoss: boolean; /** * The one classification every layer uses: "favourable" when the planet signifies a gain house and no loss house (100), "mixed" when it signifies both (50), "unfavourable" when it signifies a loss house and no gain house (0), "neutral" when it signifies neither (50). Canonical English machine value. */ verdict: 'favourable' | 'mixed' | 'unfavourable' | 'neutral'; /** * Local datetime the window opens, in the request timezone. */ from: string; /** * Local datetime the window closes. The last window of the day closes at the next midnight. */ to: string; /** * The KP sub lord the Moon holds through this window, the planet the row classifies. */ subLord: string; /** * The verdict score of the window. */ score: number; }>; }; }; /** * The weight-sum of the four layer scores, 0 to 100, one decimal: cusps 30, dasha 40, rulingPlanets 15, moonWindows 15, each divided by 100. Recomputable from the layers printed above. The house groups, the classification, the inversion on the loss cusps, the retrograde penalty, the level weights and the layer weights are a KP practitioner convention adopted as the published convention of this route: no classical KP text weighs these four layers against each other, and every table behind the number is printed so the result can be checked line by line rather than trusted. The score measures what the method outputs for the day, never the probability of a gain or a loss. */ score: number; /** * The score as one of five bands, each entered at its edge: "strong" from 70, "favourable" from 55, "mixed" from 45, "caution" from 30, "unfavourable" below 30. "mixed" is the ordinary day. Canonical English machine values. */ band: 'strong' | 'favourable' | 'mixed' | 'caution' | 'unfavourable'; /** * The favourable Moon window of the day, the longest when several qualify, or null when the day has none. The one stretch the method backs outright. */ bestWindow: { /** * Whether the planet signifies at least one gain house at any of the four tiers. */ inGain: boolean; /** * Whether the planet signifies at least one loss house at any of the four tiers. */ inLoss: boolean; /** * The one classification every layer uses: "favourable" when the planet signifies a gain house and no loss house (100), "mixed" when it signifies both (50), "unfavourable" when it signifies a loss house and no gain house (0), "neutral" when it signifies neither (50). Canonical English machine value. */ verdict: 'favourable' | 'mixed' | 'unfavourable' | 'neutral'; /** * Local datetime the window opens, in the request timezone. */ from: string; /** * Local datetime the window closes. The last window of the day closes at the next midnight. */ to: string; /** * The KP sub lord the Moon holds through this window, the planet the row classifies. */ subLord: string; /** * The verdict score of the window. */ score: number; } | null; /** * Every unfavourable Moon window of the day, in clock order. */ worstWindows: Array<{ /** * Whether the planet signifies at least one gain house at any of the four tiers. */ inGain: boolean; /** * Whether the planet signifies at least one loss house at any of the four tiers. */ inLoss: boolean; /** * The one classification every layer uses: "favourable" when the planet signifies a gain house and no loss house (100), "mixed" when it signifies both (50), "unfavourable" when it signifies a loss house and no gain house (0), "neutral" when it signifies neither (50). Canonical English machine value. */ verdict: 'favourable' | 'mixed' | 'unfavourable' | 'neutral'; /** * Local datetime the window opens, in the request timezone. */ from: string; /** * Local datetime the window closes. The last window of the day closes at the next midnight. */ to: string; /** * The KP sub lord the Moon holds through this window, the planet the row classifies. */ subLord: string; /** * The verdict score of the window. */ score: number; }>; }; export type KpDailyFinanceRequest = { /** * Birth date, YYYY-MM-DD. Fixes the Placidus cusps, the four tier significators and the Vimshottari balance every layer reads. */ birthDate: string; /** * Birth time, HH:MM:SS, 24 hour, local to the birth place. The cusp sub lords move about one sub every four minutes of clock time, so this is the input the whole reading is most sensitive to. */ birthTime: string; /** * Birth latitude in decimal degrees. Sets the Placidus cusps; also the place the ruling planets and the Moon windows are read at. */ latitude: number; /** * Birth longitude in decimal degrees, east positive. */ longitude: number; /** * Timezone as an IANA name (Asia/Kolkata) or decimal hours from UTC. Applies to the birth time, to the reading date and time, and to every local timestamp in the response. IANA names resolve to the offset in force on the date being read. */ timezone?: number | string; /** * Civil date to read, YYYY-MM-DD in the request timezone. Defaults to today (UTC). The Moon windows cover this date from midnight to midnight. */ date?: string; /** * Reading moment on that date, HH:MM:SS local. The ruling planets and the running sookshma lord are read at this instant. Defaults to 12:00:00; pass a market open or any hour for an intraday read. */ time?: string; /** * Ayanamsa system for sidereal conversion. "kp-newcomb" uses the KP-Newcomb dynamic formula, the most common choice for KP astrology. "kp-old" uses the Krishnamurti original table from KP Reader-1 with constant precession rate. "lahiri" uses Lahiri/Chitrapaksha ayanamsa, matching most traditional Vedic software. "raman" uses the B.V. Raman ayanamsa from Hindu Predictive Astrology, a recognised traditional school that sits about 1.45 degrees below Lahiri. Defaults to "kp-newcomb". */ ayanamsa?: 'kp-newcomb' | 'kp-old' | 'lahiri' | 'raman'; /** * Lunar node convention. "mean" is the smoothed average node, which always moves retrograde; "true" is the osculating node, which tracks the real perturbed node, oscillates up to about 1.5 degrees either side of the mean on a 173-day cycle, and can briefly turn direct. Neither is more correct and they almost always fall in the same sign. Applies to the Rahu and Ketu positions. Mean is the traditional Vedic default and what printed panchangs use; the choice can move a KP sub-lord in narrow boundary cases, where a span can be as small as 0.5 degrees. Defaults to "mean". */ nodeType?: 'mean' | 'true'; /** * Houses whose significators count as gain, 1 to 12. Defaults to the convention, 2 and 11. Override it to run your own school: the two lists may not share a house. */ gainHouses?: Array; /** * Houses whose significators count as loss, 1 to 12. Defaults to the convention, 6 and 8 and 12. Override it to run your own school: the two lists may not share a house. */ lossHouses?: Array; /** * Layer weights in percent, all four required, summing to 100. Defaults to the convention, cusps 30, dasha 40, rulingPlanets 15, moonWindows 15. Seventy percent of the default sits on the cusps and the outer dasha levels, which hold for months, so a chart reads inside a narrow band all month and the bands separate charts more than days. Move weight onto rulingPlanets and moonWindows for a reading that turns with the day. */ weights?: { /** * Percent of the final score the cusps layer carries. */ cusps: number; /** * Percent of the final score the dasha layer carries. */ dasha: number; /** * Percent of the final score the rulingPlanets layer carries. */ rulingPlanets: number; /** * Percent of the final score the moonWindows layer carries. */ moonWindows: number; }; }; export type RashiListResponse = Array<{ /** * Unique slug identifier for the rashi. Used in URL paths and cross-references. */ id: string; /** * Western zodiac sign name corresponding to this Vedic rashi. */ name: string; /** * Sanskrit name of the rashi as used in Vedic astrology (Jyotish). */ vedicName: string; /** * Approximate sidereal date range when the Sun transits this rashi. */ dateRange: string; /** * Traditional symbol associated with this zodiac sign. */ symbol: string; /** * Aditya (solar deity) governing this rashi in Vedic tradition. */ energy: string; /** * Key personality traits and behavioral tendencies of natives born under this rashi. */ characteristics: string; }>; export type RashiResponse = { /** * Unique slug identifier for the rashi. Used in URL paths and cross-references. */ id: string; /** * Western zodiac sign name corresponding to this Vedic rashi. */ name: string; /** * Sanskrit name of the rashi as used in Vedic astrology (Jyotish). */ vedicName: string; /** * Approximate sidereal date range when the Sun transits this rashi. */ dateRange: string; /** * Traditional symbol associated with this zodiac sign. */ symbol: string; /** * Aditya (solar deity) governing this rashi in Vedic tradition. */ energy: string; /** * Key personality traits and behavioral tendencies of natives born under this rashi. */ characteristics: string; }; export type NakshatraListResponse = Array<{ /** * Unique slug identifier for the nakshatra. Used in URL paths and cross-references. */ id: string; /** * Nakshatra name as used in Vedic astrology. One of 27 lunar mansions spanning 13 degrees 20 minutes each. */ name: string; /** * Sequential number (1-27) of this nakshatra in the zodiac starting from 0 degrees Aries. */ number: number; /** * Sidereal longitude range this nakshatra occupies within its zodiac sign. */ range: string; /** * Ruling planet (nakshatra lord) used in Vimshottari dasha calculations. Determines the planetary period sequence. */ lord: string; /** * Presiding deity of the nakshatra. Influences the spiritual qualities and mythology associated with natives. */ deity: string; /** * Traditional symbol representing this nakshatra. Reflects its core nature and energy. */ symbol: string; /** * Personality traits, behavioral tendencies, and life themes for natives born under this nakshatra. */ characteristics: string; /** * Traditional Vedic remedies including mantras, gemstones, and rituals for this nakshatra. */ remedies: { /** * Recommended mantras for this nakshatra to enhance positive qualities. */ mantras: string; /** * Recommended gemstones aligned with the ruling planet of this nakshatra. */ gemstones: string; /** * Spiritual practices and daily rituals beneficial for natives of this nakshatra. */ rituals: string; }; }>; export type NakshatraResponse = { /** * Unique slug identifier for the nakshatra. Used in URL paths and cross-references. */ id: string; /** * Nakshatra name as used in Vedic astrology. One of 27 lunar mansions spanning 13 degrees 20 minutes each. */ name: string; /** * Sequential number (1-27) of this nakshatra in the zodiac starting from 0 degrees Aries. */ number: number; /** * Sidereal longitude range this nakshatra occupies within its zodiac sign. */ range: string; /** * Ruling planet (nakshatra lord) used in Vimshottari dasha calculations. Determines the planetary period sequence. */ lord: string; /** * Presiding deity of the nakshatra. Influences the spiritual qualities and mythology associated with natives. */ deity: string; /** * Traditional symbol representing this nakshatra. Reflects its core nature and energy. */ symbol: string; /** * Personality traits, behavioral tendencies, and life themes for natives born under this nakshatra. */ characteristics: string; /** * Traditional Vedic remedies including mantras, gemstones, and rituals for this nakshatra. */ remedies: { /** * Recommended mantras for this nakshatra to enhance positive qualities. */ mantras: string; /** * Recommended gemstones aligned with the ruling planet of this nakshatra. */ gemstones: string; /** * Spiritual practices and daily rituals beneficial for natives of this nakshatra. */ rituals: string; }; }; /** * Complete upagraha positions for a birth chart */ export type UpagrahaResponse = { /** * The sidereal frame this response was computed in, so a cached or forwarded payload is self describing. */ frame: { /** * Sidereal frame this chart was cast in, echoing the ayanamsa request field. "lahiri" when the field was omitted. */ ayanamsa: string; /** * Degrees actually subtracted from every tropical longitude to produce this chart, read at the birth instant. Subtract it back to recover the tropical positions, or compare it against your reference software to confirm you are in the same frame before chasing a placement difference. */ ayanamsaDegrees: number; }; /** * Time-based upagrahas derived from the 8-part division of day or night. Gulika and Mandi are from Saturn segment, others from Sun, Mars, Mercury, Jupiter segments. Positions depend on birth time, location, and weekday. */ timeBased: Array<{ /** * Upagraha name. Time-based: Gulika, Mandi, Kala, Mrityu, Ardhaprahara, Yamaghantaka. Sun-based: Dhuma, Vyatipata, Parivesha, Indra Chapa, Upaketu. */ name: string; /** * Sidereal longitude in degrees (0 to 360). Used for house placement and aspect analysis. */ longitude: number; /** * Zodiac sign (rashi) the upagraha occupies. One of 12 Vedic rashis from Aries to Pisces. */ rashi: string; /** * Degree position within the occupied rashi (0 to 30). */ degreeInSign: number; /** * Nakshatra (lunar mansion) the upagraha occupies. One of 27 Vedic nakshatras. */ nakshatra: string; /** * Nakshatra number (1 to 27). Ashwini = 1, Bharani = 2, through Revati = 27. */ nakshatraIndex: number; /** * Pada (quarter) within the nakshatra (1 to 4). Each pada spans 3 degrees 20 minutes. */ nakshatraPada: number; }>; /** * Sun-longitude-based upagrahas (Dhuma group). Pure arithmetic from the Sun sidereal position. Dhuma = Sun + 133d20m, then each derived from the previous. */ sunBased: Array<{ /** * Upagraha name. Time-based: Gulika, Mandi, Kala, Mrityu, Ardhaprahara, Yamaghantaka. Sun-based: Dhuma, Vyatipata, Parivesha, Indra Chapa, Upaketu. */ name: string; /** * Sidereal longitude in degrees (0 to 360). Used for house placement and aspect analysis. */ longitude: number; /** * Zodiac sign (rashi) the upagraha occupies. One of 12 Vedic rashis from Aries to Pisces. */ rashi: string; /** * Degree position within the occupied rashi (0 to 30). */ degreeInSign: number; /** * Nakshatra (lunar mansion) the upagraha occupies. One of 27 Vedic nakshatras. */ nakshatra: string; /** * Nakshatra number (1 to 27). Ashwini = 1, Bharani = 2, through Revati = 27. */ nakshatraIndex: number; /** * Pada (quarter) within the nakshatra (1 to 4). Each pada spans 3 degrees 20 minutes. */ nakshatraPada: number; }>; }; export type UpagrahaRequest = { /** * Birth date in YYYY-MM-DD format. Date determines planetary positions and nakshatra calculations for Vedic kundli (janam patri). Accurate birth date is essential for dashas, yoga calculations, and divisional charts (vargas). */ date: string; /** * Birth time in 24-hour HH:MM:SS format. Time is CRITICAL for Lagna (Ascendant) calculation and house divisions. It changes every two hours roughly. Even minutes matter for accurate nakshatra pada and divisional chart (D9, D10) calculations. Without exact time, Lagna and house-based predictions will be incorrect. */ time: string; /** * Birth location latitude in decimal degrees. Location determines local sidereal time for Lagna calculation and affects bhava (house) cusps. Example: Delhi 28.6139, Mumbai 19.0760, Kathmandu 27.7172. */ latitude: number; /** * Birth location longitude in decimal degrees. Affects local time calculations and ayanamsha adjustments. Example: Delhi 77.2090, Mumbai 72.8777, Kathmandu 85.3240. */ longitude: number; /** * Timezone: IANA name (e.g. "America/New_York", "Europe/London") OR decimal hours from UTC (e.g. -5 for EST, 1 for CET). IANA strings are resolved to the offset in force at the given date and time, so you can pass `cities[0].timezone` from /location/search directly. Defaults to 5.5. */ timezone?: number | string; /** * Sidereal frame (ayanamsa) the chart is cast in. "lahiri" is Lahiri/Chitrapaksha, the traditional Vedic standard used by most software, and is the default. "raman" is the B.V. Raman ayanamsa from Hindu Predictive Astrology, about 1.45 degrees below Lahiri. "kp-newcomb" and "kp-old" are the two Krishnamurti Paddhati frames. "custom" takes your own value in degrees via ayanamsaValue, for reconciling exactly against a specific reference program. The frame rotates the whole zodiac, so a graha sitting within 1.45 degrees of a boundary can change rashi or nakshatra when you switch: pick the one your reference software uses and keep it. */ ayanamsa?: 'kp-newcomb' | 'kp-old' | 'lahiri' | 'raman' | 'custom'; /** * Custom ayanamsa value in degrees. When provided, overrides the computed ayanamsa from the selected type. Use for testing with specific ayanamsa values or matching a particular reference source. */ ayanamsaValue?: number; }; /** * Complete Ashtakavarga analysis for a birth chart */ export type AshtakavargaResponse = { /** * The sidereal frame this response was computed in, so a cached or forwarded payload is self describing. */ frame: { /** * Sidereal frame this chart was cast in, echoing the ayanamsa request field. "lahiri" when the field was omitted. */ ayanamsa: string; /** * Degrees actually subtracted from every tropical longitude to produce this chart, read at the birth instant. Subtract it back to recover the tropical positions, or compare it against your reference software to confirm you are in the same frame before chasing a placement difference. */ ayanamsaDegrees: number; }; /** * Individual planetary strength grids (Bhinnashtakavarga). Eight entries: one for each of the 7 classical planets plus Lagna. Each entry shows how many of the 8 contributors (7 planets + Lagna) give benefic points to that planet in each of the 12 signs. */ bhinnashtakavarga: Array<{ /** * Planet or Lagna name. Seven classical planets (Sun, Moon, Mars, Mercury, Jupiter, Venus, Saturn) plus Lagna (Ascendant). Rahu and Ketu are excluded from Ashtakavarga per BPHS. */ planet: string; /** * Benefic points (bindus) for each of the 12 signs, ordered Aries through Pisces (index 0 = Aries, index 11 = Pisces). Each value ranges from 0 to 8, representing how many of the 8 contributors (7 planets + Lagna) provide a benefic point for this planet in that sign. Higher bindus indicate stronger planetary support. */ bindus: Array; /** * Sum of bindus across all 12 signs. This total is constant per planet regardless of birth chart: Sun = 48, Moon = 49, Mars = 39, Mercury = 54, Jupiter = 56, Venus = 52, Saturn = 39, Lagna = 49. Useful as a validation checksum. */ total: number; }>; /** * Sarvashtakavarga (SAV) combining all 7 planetary Bhinnashtakavarga scores per sign. Total is always 337. */ sarvashtakavarga: { /** * Combined benefic points per sign from all 7 planets (Lagna excluded from SAV), ordered Aries through Pisces. Higher values indicate stronger signs for transit predictions and house strength analysis. Average is approximately 28 per sign. */ bindus: Array; /** * Sum of all SAV bindus across 12 signs. Always equals 337 for every birth chart. This mathematical constant serves as a validation checksum for the calculation. */ total: number; }; /** * Reduced Bhinnashtakavarga after two-step Shodhana (purification) per BPHS Ch. 67-68. Step 1: Trikona Shodhana subtracts minimum bindu among trine groups (1-5-9, 2-6-10, 3-7-11, 4-8-12). Step 2: Ekadipati Shodhana adjusts dual-lordship sign pairs (Mars: Aries/Scorpio, Venus: Taurus/Libra, Mercury: Gemini/Virgo, Jupiter: Sagittarius/Pisces, Saturn: Capricorn/Aquarius). Used as input for Shodhya Pinda planetary strength. */ reducedBhinnashtakavarga: Array<{ /** * Planet or Lagna name. Seven classical planets (Sun, Moon, Mars, Mercury, Jupiter, Venus, Saturn) plus Lagna (Ascendant). Rahu and Ketu are excluded from Ashtakavarga per BPHS. */ planet: string; /** * Benefic points (bindus) for each of the 12 signs, ordered Aries through Pisces (index 0 = Aries, index 11 = Pisces). Each value ranges from 0 to 8, representing how many of the 8 contributors (7 planets + Lagna) provide a benefic point for this planet in that sign. Higher bindus indicate stronger planetary support. */ bindus: Array; /** * Sum of bindus across all 12 signs. This total is constant per planet regardless of birth chart: Sun = 48, Moon = 49, Mars = 39, Mercury = 54, Jupiter = 56, Venus = 52, Saturn = 39, Lagna = 49. Useful as a validation checksum. */ total: number; }>; /** * Reduced Sarvashtakavarga. Sum of the 7 reduced planetary Bhinnashtakavarga values per sign (Lagna excluded). Indicates relative sign strength after Shodhana purification. */ reducedSarvashtakavarga: { /** * Combined benefic points per sign from all 7 planets (Lagna excluded from SAV), ordered Aries through Pisces. Higher values indicate stronger signs for transit predictions and house strength analysis. Average is approximately 28 per sign. */ bindus: Array; /** * Sum of all SAV bindus across 12 signs. Always equals 337 for every birth chart. This mathematical constant serves as a validation checksum for the calculation. */ total: number; }; /** * Shodhya Pinda planetary strength scores per BPHS Ch. 69. Derived from Reduced Ashtakavarga. Each entry contains Rashi Pinda (sign-weighted strength), Graha Pinda (planet-association-weighted strength), and total Shodhya Pinda. Used for comparing planetary strength, predicting dasha results, and transit analysis. */ shodhyaPinda: Array<{ /** * Planet or Lagna name. Shodhya Pinda is calculated for all 7 classical planets plus Lagna. */ planet: string; /** * Rashi Pinda component. Weighted sum of reduced Bhinnashtakavarga bindus per sign multiplied by Rashi Gunakar weights per BPHS Ch. 69. Higher values indicate stronger sign-based planetary strength. */ rashiPinda: number; /** * Graha Pinda component. Weighted sum of reduced Bhinnashtakavarga bindus per sign multiplied by the Graha Gunakar of planets occupying each sign (Sun=5, Moon=5, Mars=8, Mercury=5, Jupiter=10, Venus=7, Saturn=5). Reflects planetary association strength. */ grahaPinda: number; /** * Total Shodhya Pinda (Rashi Pinda + Graha Pinda). Primary planetary strength score derived from Ashtakavarga reduction. Used for comparing relative strength of planets in a birth chart and predicting dasha period results. */ shodhyaPinda: number; }>; /** * Sign names in order, for mapping bindus array indices to zodiac signs. Index 0 = Aries through index 11 = Pisces. */ signs: Array<'Aries' | 'Taurus' | 'Gemini' | 'Cancer' | 'Leo' | 'Virgo' | 'Libra' | 'Scorpio' | 'Sagittarius' | 'Capricorn' | 'Aquarius' | 'Pisces'>; }; export type AshtakavargaRequest = { /** * Birth date in YYYY-MM-DD format. Date determines planetary positions and nakshatra calculations for Vedic kundli (janam patri). Accurate birth date is essential for dashas, yoga calculations, and divisional charts (vargas). */ date: string; /** * Birth time in 24-hour HH:MM:SS format. Time is CRITICAL for Lagna (Ascendant) calculation and house divisions. It changes every two hours roughly. Even minutes matter for accurate nakshatra pada and divisional chart (D9, D10) calculations. Without exact time, Lagna and house-based predictions will be incorrect. */ time: string; /** * Birth location latitude in decimal degrees. Location determines local sidereal time for Lagna calculation and affects bhava (house) cusps. Example: Delhi 28.6139, Mumbai 19.0760, Kathmandu 27.7172. */ latitude: number; /** * Birth location longitude in decimal degrees. Affects local time calculations and ayanamsha adjustments. Example: Delhi 77.2090, Mumbai 72.8777, Kathmandu 85.3240. */ longitude: number; /** * Timezone: IANA name (e.g. "America/New_York", "Europe/London") OR decimal hours from UTC (e.g. -5 for EST, 1 for CET). IANA strings are resolved to the offset in force at the given date and time, so you can pass `cities[0].timezone` from /location/search directly. Defaults to 5.5. */ timezone?: number | string; /** * Sidereal frame (ayanamsa) the chart is cast in. "lahiri" is Lahiri/Chitrapaksha, the traditional Vedic standard used by most software, and is the default. "raman" is the B.V. Raman ayanamsa from Hindu Predictive Astrology, about 1.45 degrees below Lahiri. "kp-newcomb" and "kp-old" are the two Krishnamurti Paddhati frames. "custom" takes your own value in degrees via ayanamsaValue, for reconciling exactly against a specific reference program. The frame rotates the whole zodiac, so a graha sitting within 1.45 degrees of a boundary can change rashi or nakshatra when you switch: pick the one your reference software uses and keep it. */ ayanamsa?: 'kp-newcomb' | 'kp-old' | 'lahiri' | 'raman' | 'custom'; /** * Custom ayanamsa value in degrees. When provided, overrides the computed ayanamsa from the selected type. Use for testing with specific ayanamsa values or matching a particular reference source. */ ayanamsaValue?: number; }; /** * Complete Shadbala (six-fold planetary strength) analysis for a birth chart per Brihat Parashara Hora Shastra (BPHS). */ export type ShadbalaResponse = { /** * Localized name and one-line meaning for each of the six Shadbala components, keyed by the same field names each planet entry uses. Join it to render a readable strength breakdown in any of the eight supported languages instead of showing six untranslated Sanskrit terms. */ balaThemes: { /** * Localized label and meaning for one Shadbala component. */ sthanaBala: { /** * Localized name of this Shadbala component, suitable for a table header or a bar label. */ name: string; /** * One-line localized explanation of what this component measures. */ meaning: string; }; /** * Localized label and meaning for one Shadbala component. */ digBala: { /** * Localized name of this Shadbala component, suitable for a table header or a bar label. */ name: string; /** * One-line localized explanation of what this component measures. */ meaning: string; }; /** * Localized label and meaning for one Shadbala component. */ kalaBala: { /** * Localized name of this Shadbala component, suitable for a table header or a bar label. */ name: string; /** * One-line localized explanation of what this component measures. */ meaning: string; }; /** * Localized label and meaning for one Shadbala component. */ chestaBala: { /** * Localized name of this Shadbala component, suitable for a table header or a bar label. */ name: string; /** * One-line localized explanation of what this component measures. */ meaning: string; }; /** * Localized label and meaning for one Shadbala component. */ naisargikaBala: { /** * Localized name of this Shadbala component, suitable for a table header or a bar label. */ name: string; /** * One-line localized explanation of what this component measures. */ meaning: string; }; /** * Localized label and meaning for one Shadbala component. */ drikBala: { /** * Localized name of this Shadbala component, suitable for a table header or a bar label. */ name: string; /** * One-line localized explanation of what this component measures. */ meaning: string; }; }; /** * The sidereal frame this response was computed in, so a cached or forwarded payload is self describing. */ frame: { /** * Sidereal frame this chart was cast in, echoing the ayanamsa request field. "lahiri" when the field was omitted. */ ayanamsa: string; /** * Degrees actually subtracted from every tropical longitude to produce this chart, read at the birth instant. Subtract it back to recover the tropical positions, or compare it against your reference software to confirm you are in the same frame before chasing a placement difference. */ ayanamsaDegrees: number; }; /** * Shadbala analysis for all 7 classical planets. Ordered: Sun, Moon, Mars, Mercury, Jupiter, Venus, Saturn. Each entry contains all 6 strength components, total strength in virupas and Rupas, Ishta/Kashta Phala, minimum required threshold, strength ratio, and relative rank. */ planets: Array<{ /** * Planet name. One of the 7 classical Vedic planets (Saptgraha): Sun, Moon, Mars, Mercury, Jupiter, Venus, Saturn. Rahu and Ketu are excluded from Shadbala per BPHS. */ planet: string; /** * Sthana Bala (Positional Strength) in virupas. Sum of 5 sub-components: Uchcha Bala (exaltation strength), Saptavargaja Bala (7-divisional friendship), Ojayugma Bala (odd/even sign placement), Kendradi Bala (angular house strength), and Drekkana Bala (decanate gender match). Higher values indicate stronger positional placement. */ sthanaBala: number; /** * Dig Bala (Directional Strength) in virupas. Based on angular distance from the planets directional strength house. Sun and Mars are strong at MC (10th), Moon and Venus at IC (4th), Mercury and Jupiter at ASC (1st), Saturn at DSC (7th). Range 0 to 60. */ digBala: number; /** * Kala Bala (Temporal Strength) in virupas. Sum of 8 sub-components: Nathonnatha (day/night strength), Paksha (lunar phase), Tribhaga (third of day/night), Vara (weekday lord), Hora (planetary hour), Abda (year lord), Masa (month lord), and Ayana (declination-based seasonal strength). */ kalaBala: number; /** * Chesta Bala (Motional Strength) in virupas. Based on planetary motion, so a retrograde graha scores higher because it is closer to Earth and working hardest. The Sun uses its Ayana Bala and the Moon its elongation from the Sun, per BPHS. Mars, Mercury, Jupiter, Venus and Saturn use the Sheeghra Kendra, the arc between the sheeghrochcha and the mean of the true and mean longitudes, with the roles of the mean Sun and the graha swapped for Mercury and Venus. Range 0 to 60. */ chestaBala: number; /** * Naisargika Bala (Natural Strength) in virupas. Fixed luminosity-based values per BPHS: Sun 60.00, Moon 51.43, Venus 42.86, Jupiter 34.29, Mercury 25.71, Mars 17.14, Saturn 8.57. Invariant across all charts. */ naisargikaBala: number; /** * Drik Bala (Aspectual Strength) in virupas. Strength gained or lost from the aspects a graha receives. Benefic aspects add strength and malefic aspects reduce it, so this value is negative when malefics dominate. Mercury counts as benefic or malefic by the company it keeps in its own sign, decided by count with the nearest graha breaking a tie, and the Moon by its paksha. Uses the graded Sputa Drishti curve of BPHS Ch. 26 with the Vishesha (special) aspects of Mars, Jupiter and Saturn applied at their precise DEGREE ranges rather than by whole sign. */ drikBala: number; /** * Total Shadbala in virupas (Shashtiamsas). Sum of all 6 strength components. Higher total indicates a stronger planet in the birth chart. Used for comparing relative planetary strength and evaluating dasha period potential. */ totalVirupas: number; /** * Total Shadbala in Rupas (totalVirupas / 60). 1 Rupa equals 60 virupas. Rupas are the standard unit for comparing planetary strength against minimum required thresholds. */ totalRupas: number; /** * Minimum required strength in Rupas per BPHS. Sun 5.0, Moon 6.0, Mars 5.0, Mercury 7.0, Jupiter 6.5, Venus 5.5, Saturn 5.0. A planet below its minimum is considered weak and may underperform in its dasha periods. */ minRequired: number; /** * Ratio of actual Rupas to minimum required (totalRupas / minRequired). Values above 1.0 indicate sufficient strength. Higher ratios mean proportionally stronger planets. Used for ranking planets by relative strength. */ strengthRatio: number; /** * Ishta Phala (auspicious strength) in virupas. Derived from Uchcha Bala and Chesta Bala: sqrt(ucchaBala * chestaBala). Indicates the planets capacity to produce favorable results during its dasha and transit periods. */ ishtaPhala: number; /** * Kashta Phala (malefic strength) in virupas. Derived from complements of Uchcha and Chesta Bala: sqrt((60 - ucchaBala) * (60 - chestaBala)). Indicates the planets capacity to produce unfavorable results. Zero when both Uchcha and Chesta exceed 60. */ kashtaPhala: number; /** * Relative strength rank among the 7 planets (1 = strongest, 7 = weakest). Ranked by strengthRatio (actual/required), not raw virupas, so each planet is compared fairly against its own BPHS threshold. */ relativeRank: number; }>; }; export type ShadbalaRequest = { /** * Birth date in YYYY-MM-DD format. Date determines planetary positions and nakshatra calculations for Vedic kundli (janam patri). Accurate birth date is essential for dashas, yoga calculations, and divisional charts (vargas). */ date: string; /** * Birth time in 24-hour HH:MM:SS format. Time is CRITICAL for Lagna (Ascendant) calculation and house divisions. It changes every two hours roughly. Even minutes matter for accurate nakshatra pada and divisional chart (D9, D10) calculations. Without exact time, Lagna and house-based predictions will be incorrect. */ time: string; /** * Birth location latitude in decimal degrees. Location determines local sidereal time for Lagna calculation and affects bhava (house) cusps. Example: Delhi 28.6139, Mumbai 19.0760, Kathmandu 27.7172. */ latitude: number; /** * Birth location longitude in decimal degrees. Affects local time calculations and ayanamsha adjustments. Example: Delhi 77.2090, Mumbai 72.8777, Kathmandu 85.3240. */ longitude: number; /** * Timezone: IANA name (e.g. "America/New_York", "Europe/London") OR decimal hours from UTC (e.g. -5 for EST, 1 for CET). IANA strings are resolved to the offset in force at the given date and time, so you can pass `cities[0].timezone` from /location/search directly. Defaults to 5.5. */ timezone?: number | string; /** * Sidereal frame (ayanamsa) the chart is cast in. "lahiri" is Lahiri/Chitrapaksha, the traditional Vedic standard used by most software, and is the default. "raman" is the B.V. Raman ayanamsa from Hindu Predictive Astrology, about 1.45 degrees below Lahiri. "kp-newcomb" and "kp-old" are the two Krishnamurti Paddhati frames. "custom" takes your own value in degrees via ayanamsaValue, for reconciling exactly against a specific reference program. The frame rotates the whole zodiac, so a graha sitting within 1.45 degrees of a boundary can change rashi or nakshatra when you switch: pick the one your reference software uses and keep it. */ ayanamsa?: 'kp-newcomb' | 'kp-old' | 'lahiri' | 'raman' | 'custom'; /** * Custom ayanamsa value in degrees. When provided, overrides the computed ayanamsa from the selected type. Use for testing with specific ayanamsa values or matching a particular reference source. */ ayanamsaValue?: number; }; /** * The twelve Arudha padas of a birth chart, computed per the Jaimini rule with the classical exception applied. */ export type ArudhaResponse = { /** * The sidereal frame this response was computed in, so a cached or forwarded payload is self describing. */ frame: { /** * Sidereal frame this chart was cast in, echoing the ayanamsa request field. "lahiri" when the field was omitted. */ ayanamsa: string; /** * Degrees actually subtracted from every tropical longitude to produce this chart, read at the birth instant. Subtract it back to recover the tropical positions, or compare it against your reference software to confirm you are in the same frame before chasing a placement difference. */ ayanamsaDegrees: number; }; /** * Zodiac sign of the Ascendant (Lagna), which anchors the twelve bhavas the padas are derived from. */ lagnaRashi: string; /** * Zodiac sign of the Arudha Lagna (AL), the pada of the first house and the single most used value in this response. Repeated at the top level so a client rendering only the AL does not have to search the array. */ arudhaLagna: string; /** * Zodiac sign of the Upapada (UL), the pada of the twelfth house, read for marriage and its durability. The second most used value, so it is also lifted to the top level. */ upapada: string; /** * All twelve Arudha padas in bhava order, a1 through a12. Each carries the lord and the count it came from, so the derivation can be checked by hand. */ padas: Array<{ /** * Pada identifier, a1 through a12, matching the bhava it belongs to. a1 is the Arudha Lagna and a12 the Upapada. */ id: string; /** * Practitioner shorthand written on a chart: AL for the Arudha Lagna, A2 through A11, and UL for the Upapada. */ abbreviation: string; /** * Classical Sanskrit name of the pada, for example Arudha Lagna, Dhana Pada, Dara Pada, Upapada. */ name: string; /** * Bhava (house) number 1-12 whose pada this is. The pada is the perceived, outward form of that bhava. */ house: number; /** * Zodiac sign (rashi) occupying that bhava, counted whole-sign from the Lagna. The count to the pada starts here. */ bhavaRashi: string; /** * Lord of the bhava sign. The pada is found by counting to this graha and then the same distance again. */ lord: string; /** * Zodiac sign the bhava lord occupies, which sets the length of the count. */ lordRashi: string; /** * Zodiac sign the pada falls in, after the classical exception is applied. This is the answer most readings start from. */ rashi: string; /** * Which house from the Lagna the pada sits in, counted inclusively 1-12. Reading a pada against the natal Lagna is how its strength is judged. */ houseFromLagna: number; /** * True when the raw pada landed in the same bhava or the seventh from it and was moved to the tenth from there, as the classical rule requires. Surfaced so a reader can see exactly why a pada sits where it does, which is the step implementations most often skip. */ exceptionApplied: boolean; /** * Short label for what this pada is read for, sized for a table cell. */ meaning: string; /** * What this pada governs. Padas describe how a matter is PERCEIVED, which is what separates them from the bhava significations of the same house. */ significations: string; }>; }; export type ArudhaRequest = { /** * Birth date in YYYY-MM-DD format. Date determines planetary positions and nakshatra calculations for Vedic kundli (janam patri). Accurate birth date is essential for dashas, yoga calculations, and divisional charts (vargas). */ date: string; /** * Birth time in 24-hour HH:MM:SS format. Time is CRITICAL for Lagna (Ascendant) calculation and house divisions. It changes every two hours roughly. Even minutes matter for accurate nakshatra pada and divisional chart (D9, D10) calculations. Without exact time, Lagna and house-based predictions will be incorrect. */ time: string; /** * Birth location latitude in decimal degrees. Location determines local sidereal time for Lagna calculation and affects bhava (house) cusps. Example: Delhi 28.6139, Mumbai 19.0760, Kathmandu 27.7172. */ latitude: number; /** * Birth location longitude in decimal degrees. Affects local time calculations and ayanamsha adjustments. Example: Delhi 77.2090, Mumbai 72.8777, Kathmandu 85.3240. */ longitude: number; /** * Timezone: IANA name (e.g. "America/New_York", "Europe/London") OR decimal hours from UTC (e.g. -5 for EST, 1 for CET). IANA strings are resolved to the offset in force at the given date and time, so you can pass `cities[0].timezone` from /location/search directly. Defaults to 5.5. */ timezone?: number | string; /** * Sidereal frame (ayanamsa) the chart is cast in. "lahiri" is Lahiri/Chitrapaksha, the traditional Vedic standard used by most software, and is the default. "raman" is the B.V. Raman ayanamsa from Hindu Predictive Astrology, about 1.45 degrees below Lahiri. "kp-newcomb" and "kp-old" are the two Krishnamurti Paddhati frames. "custom" takes your own value in degrees via ayanamsaValue, for reconciling exactly against a specific reference program. The frame rotates the whole zodiac, so a graha sitting within 1.45 degrees of a boundary can change rashi or nakshatra when you switch: pick the one your reference software uses and keep it. */ ayanamsa?: 'kp-newcomb' | 'kp-old' | 'lahiri' | 'raman' | 'custom'; /** * Custom ayanamsa value in degrees. When provided, overrides the computed ayanamsa from the selected type. Use for testing with specific ayanamsa values or matching a particular reference source. */ ayanamsaValue?: number; }; /** * Chara Karakas for a birth chart: the movable significators of Jaimini astrology, ranked by how far each graha has advanced into its sign. */ export type CharaKarakaResponse = { /** * The sidereal frame this response was computed in, so a cached or forwarded payload is self describing. */ frame: { /** * Sidereal frame this chart was cast in, echoing the ayanamsa request field. "lahiri" when the field was omitted. */ ayanamsa: string; /** * Degrees actually subtracted from every tropical longitude to produce this chart, read at the birth instant. Subtract it back to recover the tropical positions, or compare it against your reference software to confirm you are in the same frame before chasing a placement difference. */ ayanamsaDegrees: number; }; /** * Scheme the ranking used, echoed back so a cached or logged response is self describing. */ scheme: 'seven' | 'eight'; /** * Graha holding the Atmakaraka office, the most consequential single value in Jaimini analysis. Lifted to the top level so a client reading only the Atmakaraka does not have to search the array. */ atmakaraka: string; /** * Graha holding the Darakaraka office, read for the spouse. The second most requested value, so it is also lifted to the top level. */ darakaraka: string; /** * Karaka offices in descending rank, Atmakaraka first. Eight entries in the eight-karaka scheme, seven in the seven-karaka scheme. */ karakas: Array<{ /** * Karaka office identifier: atmakaraka, amatyakaraka, bhratrikaraka, matrikaraka, pitrikaraka, putrakaraka, gnatikaraka, darakaraka. Returned in descending rank, so the first entry is always the Atmakaraka. */ id: string; /** * Classical Sanskrit name of the karaka office. */ name: string; /** * Practitioner shorthand: AK, AmK, BK, MK, PiK, PK, GK, DK, in descending rank order. */ abbreviation: string; /** * Graha holding this office in this chart. */ graha: string; /** * Zodiac sign (rashi) the graha occupies. */ rashi: string; /** * Degree the graha has advanced into its sign, 0 to 30. This is the figure a chart displays. */ degreeInRashi: number; /** * The degree actually ranked. Identical to degreeInRashi for every graha except Rahu, where it is 30 minus that value because Rahu advances backward through the sign. Returned so the ordering can be checked without knowing the rule. */ rankingDegree: number; /** * True only for Rahu, flagging that its degree was measured from the end of the sign rather than the start. */ isReversed: boolean; /** * Short label for what this karaka is read for, sized for a table cell. */ meaning: string; /** * What this karaka office governs in a reading. */ significations: string; }>; }; export type CharaKarakaRequest = { /** * Birth date in YYYY-MM-DD format. Date determines planetary positions and nakshatra calculations for Vedic kundli (janam patri). Accurate birth date is essential for dashas, yoga calculations, and divisional charts (vargas). */ date: string; /** * Birth time in 24-hour HH:MM:SS format. Time is CRITICAL for Lagna (Ascendant) calculation and house divisions. It changes every two hours roughly. Even minutes matter for accurate nakshatra pada and divisional chart (D9, D10) calculations. Without exact time, Lagna and house-based predictions will be incorrect. */ time: string; /** * Birth location latitude in decimal degrees. Location determines local sidereal time for Lagna calculation and affects bhava (house) cusps. Example: Delhi 28.6139, Mumbai 19.0760, Kathmandu 27.7172. */ latitude: number; /** * Birth location longitude in decimal degrees. Affects local time calculations and ayanamsha adjustments. Example: Delhi 77.2090, Mumbai 72.8777, Kathmandu 85.3240. */ longitude: number; /** * Timezone: IANA name (e.g. "America/New_York", "Europe/London") OR decimal hours from UTC (e.g. -5 for EST, 1 for CET). IANA strings are resolved to the offset in force at the given date and time, so you can pass `cities[0].timezone` from /location/search directly. Defaults to 5.5. */ timezone?: number | string; /** * Sidereal frame (ayanamsa) the chart is cast in. "lahiri" is Lahiri/Chitrapaksha, the traditional Vedic standard used by most software, and is the default. "raman" is the B.V. Raman ayanamsa from Hindu Predictive Astrology, about 1.45 degrees below Lahiri. "kp-newcomb" and "kp-old" are the two Krishnamurti Paddhati frames. "custom" takes your own value in degrees via ayanamsaValue, for reconciling exactly against a specific reference program. The frame rotates the whole zodiac, so a graha sitting within 1.45 degrees of a boundary can change rashi or nakshatra when you switch: pick the one your reference software uses and keep it. */ ayanamsa?: 'kp-newcomb' | 'kp-old' | 'lahiri' | 'raman' | 'custom'; /** * Custom ayanamsa value in degrees. When provided, overrides the computed ayanamsa from the selected type. Use for testing with specific ayanamsa values or matching a particular reference source. */ ayanamsaValue?: number; /** * Which Chara Karaka scheme to rank. "eight" includes Rahu, counting its degree in reverse because it moves retrograde, and returns eight offices including Pitrikaraka. "seven" ranks only the seven classical grahas and drops Pitrikaraka. Ketu is excluded from both, since it always mirrors the Rahu degree exactly. The two schemes can produce a different Atmakaraka for the same chart, so select the one your reference software uses. Defaults to "eight". */ scheme?: 'seven' | 'eight'; }; /** * Complete Bhava Bala (house strength) analysis per Brihat Parashara Hora Shastra, with a localized house-meaning legend. */ export type BhavaBalaResponse = { /** * The sidereal frame this response was computed in, so a cached or forwarded payload is self describing. */ frame: { /** * Sidereal frame this chart was cast in, echoing the ayanamsa request field. "lahiri" when the field was omitted. */ ayanamsa: string; /** * Degrees actually subtracted from every tropical longitude to produce this chart, read at the birth instant. Subtract it back to recover the tropical positions, or compare it against your reference software to confirm you are in the same frame before chasing a placement difference. */ ayanamsaDegrees: number; }; /** * House frame the bhavas were built on. Always sripati: Bhava Bala is defined on unequal bhava madhyas, not on whole signs. */ houseSystem: string; /** * Bhava Bala for all twelve houses in order, house 1 first. Each entry carries its own components so a client can explain a score rather than just display it. */ bhavas: Array<{ /** * Bhava (house) number 1 to 12, counted from the Lagna. House 1 is the Ascendant bhava, house 10 the career bhava, house 7 the partnership bhava. */ house: number; /** * Zodiac sign holding this bhavas madhya (mid-cusp). Under the Sripati house system the bhavas are unequal, so this is NOT always the nth sign from the Lagna, and two bhavas can share a sign while another sign holds none. */ rashi: string; /** * Bhava madhya (mid-cusp) longitude in degrees, sidereal Lahiri. The point every strength component below is measured at. Bhavas 1, 4, 7 and 10 sit on the Ascendant, IC, Descendant and Midheaven; the rest trisect the quadrants between them. */ madhya: number; /** * Bhavadhipati (house lord), the ruler of the sign holding the madhya. Its Shadbala is what this bhava inherits, so a house ruled by a strong graha starts strong. */ lord: string; /** * Bhavadhipati Bala in virupas: the total Shadbala of the house lord, carried across unchanged. The dominant term of the three, typically 250 to 650. Two bhavas ruled by the same graha therefore share this value exactly. */ bhavadhipatiBala: number; /** * Bhava Digbala (directional strength) in virupas, 0 to 60 in steps of 10. Each rashi class is strongest in one cardinal bhava (human signs at the Lagna, quadruped at the 10th, watery at the 4th, Scorpio at the 7th) and loses 10 virupas per bhava of separation, reaching 0 at the seventh from it. */ digBala: number; /** * Bhava Drishti Bala (aspectual strength) in virupas, computed on the bhava madhya exactly as Graha Drik Bala is computed on a graha. Benefic aspects add and malefic aspects subtract, so this term is often negative. */ drishtiBala: number; /** * Total Bhava Bala in virupas, the sum of the three components above. Use it to compare houses within one chart: the strongest bhavas are the life areas that unfold with least resistance. */ totalVirupas: number; /** * Total Bhava Bala in rupas (totalVirupas / 60). 1 rupa equals 60 virupas. Rupas are the conventional unit in classical tables. */ totalRupas: number; /** * Strength rank among the twelve bhavas, 1 = strongest. Ranked on totalVirupas, so it never disagrees with the published totals. */ rank: number; }>; /** * Significations of each of the twelve bhavas (houses), keyed by house number 1 to 12, as short keywords. Bhava 1 is the Lagna (self, body, vitality), 2 wealth and speech, 4 home and mother, 7 marriage and partnership, 10 career and status, 11 gains. Use it to label the house numbers returned elsewhere in the response: a Vimshottari dasha period signifying houses 2, 7 and 8, or a KP significator carrying houses 11 and 6, becomes readable text without a separate lookup call. Returned once per response rather than repeated per period, and localized by the lang query parameter alongside every other interpretation field. */ houseThemes: { [key: string]: Array; }; /** * Which signification vocabulary produced the houseThemes keywords in this response, echoing the focus query parameter. Always present, and "general" when the parameter was omitted. Read it to label a rendered house legend, or to tell two cached responses apart when only one asked for the finance lens. */ focus: 'general' | 'finance'; }; export type BhavaBalaRequest = { /** * Birth date in YYYY-MM-DD format. Date determines planetary positions and nakshatra calculations for Vedic kundli (janam patri). Accurate birth date is essential for dashas, yoga calculations, and divisional charts (vargas). */ date: string; /** * Birth time in 24-hour HH:MM:SS format. Time is CRITICAL for Lagna (Ascendant) calculation and house divisions. It changes every two hours roughly. Even minutes matter for accurate nakshatra pada and divisional chart (D9, D10) calculations. Without exact time, Lagna and house-based predictions will be incorrect. */ time: string; /** * Birth location latitude in decimal degrees. Location determines local sidereal time for Lagna calculation and affects bhava (house) cusps. Example: Delhi 28.6139, Mumbai 19.0760, Kathmandu 27.7172. */ latitude: number; /** * Birth location longitude in decimal degrees. Affects local time calculations and ayanamsha adjustments. Example: Delhi 77.2090, Mumbai 72.8777, Kathmandu 85.3240. */ longitude: number; /** * Timezone: IANA name (e.g. "America/New_York", "Europe/London") OR decimal hours from UTC (e.g. -5 for EST, 1 for CET). IANA strings are resolved to the offset in force at the given date and time, so you can pass `cities[0].timezone` from /location/search directly. Defaults to 5.5. */ timezone?: number | string; /** * Sidereal frame (ayanamsa) the chart is cast in. "lahiri" is Lahiri/Chitrapaksha, the traditional Vedic standard used by most software, and is the default. "raman" is the B.V. Raman ayanamsa from Hindu Predictive Astrology, about 1.45 degrees below Lahiri. "kp-newcomb" and "kp-old" are the two Krishnamurti Paddhati frames. "custom" takes your own value in degrees via ayanamsaValue, for reconciling exactly against a specific reference program. The frame rotates the whole zodiac, so a graha sitting within 1.45 degrees of a boundary can change rashi or nakshatra when you switch: pick the one your reference software uses and keep it. */ ayanamsa?: 'kp-newcomb' | 'kp-old' | 'lahiri' | 'raman' | 'custom'; /** * Custom ayanamsa value in degrees. When provided, overrides the computed ayanamsa from the selected type. Use for testing with specific ayanamsa values or matching a particular reference source. */ ayanamsaValue?: number; }; /** * Bhav Chalit (Chalit Kundli): every graha placed by unequal Sripati bhava, with the whole-sign placement beside it for comparison. */ export type BhavChalitResponse = { /** * The sidereal frame this response was computed in, so a cached or forwarded payload is self describing. */ frame: { /** * Sidereal frame this chart was cast in, echoing the ayanamsa request field. "lahiri" when the field was omitted. */ ayanamsa: string; /** * Degrees actually subtracted from every tropical longitude to produce this chart, read at the birth instant. Subtract it back to recover the tropical positions, or compare it against your reference software to confirm you are in the same frame before chasing a placement difference. */ ayanamsaDegrees: number; }; /** * House frame used to build the bhavas. Always sripati for the Chalit chart. */ houseSystem: string; /** * Sidereal Lahiri Ascendant in degrees. The madhya of bhava 1. */ ascendant: number; /** * Sidereal Lahiri Midheaven in degrees. The madhya of bhava 10. */ midheaven: number; /** * The twelve Sripati bhavas in order with their boundaries and occupants. */ bhavas: Array<{ /** * Bhava number 1 to 12. */ house: number; /** * Bhava sandhi (junction) opening this bhava, in degrees. The midpoint between this madhya and the previous one. A graha exactly on a sandhi belongs to the bhava it opens. */ start: number; /** * Bhava madhya (mid-cusp) in degrees. Bhavas 1, 4, 7 and 10 sit exactly on the Ascendant, IC, Descendant and Midheaven; the other eight trisect the quadrant arcs between them. */ madhya: number; /** * Bhava sandhi closing this bhava. Identical to the next bhavas start, so the twelve bhavas tile the zodiac with no gap. */ end: number; /** * Width of the bhava in degrees. Rarely 30: the Ascendant and Midheaven are only 90 degrees apart by coincidence of latitude and epoch, so quadrants stretch and squeeze and the bhavas with them. */ span: number; /** * Sign holding the madhya. Because bhavas are unequal, two bhavas can share a sign while another sign holds no madhya at all. */ rashi: string; /** * Grahas falling inside this bhava. Empty when the bhava is unoccupied. */ grahas: Array; }>; /** * All nine grahas with both their Chalit bhava and their whole-sign Rashi house, plus a moved flag. */ grahas: Array<{ /** * Graha name. All nine are placed, the seven classical grahas plus the lunar nodes Rahu and Ketu. */ graha: string; /** * Sidereal Lahiri longitude in degrees. */ longitude: number; /** * Zodiac sign the graha occupies. Identical to the Rashi (D1) chart. */ rashi: string; /** * Bhava the graha falls in under the unequal Sripati cusps. This is the Bhav Chalit placement and the reason the chart exists. */ bhava: number; /** * House the same graha occupies in the whole-sign Rashi chart, counted from the Lagna sign. Returned alongside bhava so the difference is visible without a second request. */ rashiHouse: number; /** * True when bhava and rashiHouse disagree, i.e. the graha changes house between the Rashi chart and the Chalit chart. These are the placements a practitioner opens this chart to check. */ moved: boolean; }>; /** * How many of the nine grahas change house between the Rashi chart and the Chalit chart. Zero is a perfectly normal result and means the two charts agree for this nativity. */ movedCount: number; /** * Significations of each of the twelve bhavas (houses), keyed by house number 1 to 12, as short keywords. Bhava 1 is the Lagna (self, body, vitality), 2 wealth and speech, 4 home and mother, 7 marriage and partnership, 10 career and status, 11 gains. Use it to label the house numbers returned elsewhere in the response: a Vimshottari dasha period signifying houses 2, 7 and 8, or a KP significator carrying houses 11 and 6, becomes readable text without a separate lookup call. Returned once per response rather than repeated per period, and localized by the lang query parameter alongside every other interpretation field. */ houseThemes: { [key: string]: Array; }; /** * Which signification vocabulary produced the houseThemes keywords in this response, echoing the focus query parameter. Always present, and "general" when the parameter was omitted. Read it to label a rendered house legend, or to tell two cached responses apart when only one asked for the finance lens. */ focus: 'general' | 'finance'; }; export type BhavChalitRequest = { /** * Birth date in YYYY-MM-DD format. Date determines planetary positions and nakshatra calculations for Vedic kundli (janam patri). Accurate birth date is essential for dashas, yoga calculations, and divisional charts (vargas). */ date: string; /** * Birth time in 24-hour HH:MM:SS format. Time is CRITICAL for Lagna (Ascendant) calculation and house divisions. It changes every two hours roughly. Even minutes matter for accurate nakshatra pada and divisional chart (D9, D10) calculations. Without exact time, Lagna and house-based predictions will be incorrect. */ time: string; /** * Birth location latitude in decimal degrees. Location determines local sidereal time for Lagna calculation and affects bhava (house) cusps. Example: Delhi 28.6139, Mumbai 19.0760, Kathmandu 27.7172. */ latitude: number; /** * Birth location longitude in decimal degrees. Affects local time calculations and ayanamsha adjustments. Example: Delhi 77.2090, Mumbai 72.8777, Kathmandu 85.3240. */ longitude: number; /** * Timezone: IANA name (e.g. "America/New_York", "Europe/London") OR decimal hours from UTC (e.g. -5 for EST, 1 for CET). IANA strings are resolved to the offset in force at the given date and time, so you can pass `cities[0].timezone` from /location/search directly. Defaults to 5.5. */ timezone?: number | string; /** * Sidereal frame (ayanamsa) the chart is cast in. "lahiri" is Lahiri/Chitrapaksha, the traditional Vedic standard used by most software, and is the default. "raman" is the B.V. Raman ayanamsa from Hindu Predictive Astrology, about 1.45 degrees below Lahiri. "kp-newcomb" and "kp-old" are the two Krishnamurti Paddhati frames. "custom" takes your own value in degrees via ayanamsaValue, for reconciling exactly against a specific reference program. The frame rotates the whole zodiac, so a graha sitting within 1.45 degrees of a boundary can change rashi or nakshatra when you switch: pick the one your reference software uses and keep it. */ ayanamsa?: 'kp-newcomb' | 'kp-old' | 'lahiri' | 'raman' | 'custom'; /** * Custom ayanamsa value in degrees. When provided, overrides the computed ayanamsa from the selected type. Use for testing with specific ayanamsa values or matching a particular reference source. */ ayanamsaValue?: number; }; /** * Heliacal rising and setting status of the six visible grahas. */ export type HeliacalResponse = { /** * Local calendar date the verdicts were read for, echoed from the request. */ date: string; /** * One entry per visible graha, in classical order. A graha is omitted only when no horizon crossing exists for it at this latitude on this day. */ grahas: Array<{ /** * Graha name. Only the six with a visible body appear: Moon, Mars, Mercury, Jupiter, Venus and Saturn. The Sun cannot be lost in his own glare, and Rahu and Ketu are computed points with nothing to see. */ graha: string; /** * Whether the graha clears the Sun glare on this day. False is the state a practitioner calls asta or combust, during which classical muhurta withholds auspicious ceremonies, most strictly marriage while Jupiter or Venus is invisible. */ visible: boolean; /** * Horizon this graha is currently judged at. West means it sets after the Sun and is an evening object, east that it rises before him and is a morning one. */ horizon: 'east' | 'west'; /** * Separation from the Sun in degrees of TIME (kalamsa), measured along the equator between the two bodies horizon crossings. This is the quantity Surya Siddhanta actually compares against the limit, and it is not the same as the difference of ecliptic longitudes: the two diverge by roughly 3 degrees at Mumbai and by more than 15 further north, because it accounts for the angle the ecliptic makes with the local horizon. */ timeDegrees: number; /** * The limit in degrees of time this graha must clear to be seen, per Surya Siddhanta ch. IX vv.6-8 and ch. X.1: Moon 12, Jupiter 11, Saturn 15, Mars 17, Venus 10 or 8, Mercury 14 or 12. Larger means the graha is fainter and needs more distance from the Sun. */ kalamsa: number; /** * Whether the graha is retrograde, which for Mercury and Venus tightens the limit (Venus 10 to 8, Mercury 14 to 12). Retrograde puts them near inferior conjunction where they are far closer to Earth, so the larger brighter disk survives closer to the Sun. */ retrograde: boolean; /** * Plain angular separation of the two ecliptic longitudes, in degrees. Returned beside timeDegrees so the two measures can be compared: this is what a combustion flag on a birth chart uses, and the gap between them is precisely what a location-aware heliacal calculation adds. */ longitudeSeparation: number; /** * The event that produced the current state, or null when none falls inside the search horizon (up to about one synodic period, so Mars can legitimately have none). */ lastEvent: { /** * Udaya is heliacal rising, the graha re-emerging from the Sun rays and becoming visible again. Asta (also called lopa, moudhya or moudyami) is heliacal setting, the graha disappearing into them. Stable Sanskrit keys, never translated. */ type: 'udaya' | 'asta'; /** * Horizon the event happens at. East means it is read before sunrise, so the graha is a morning object; west means after sunset, an evening object. A graha crosses to the other horizon as it passes the Sun, which is why an asta and the udaya that follows it are usually on opposite horizons. */ horizon: 'east' | 'west'; /** * Local civil datetime of the event (YYYY-MM-DDTHH:MM:SS), being the moment the graha itself crosses the horizon on the day its verdict changes. That instant, rather than sunrise or sunset, is what published Asta tables print. */ datetime: string; /** * Separation from the Sun in degrees of time on the event day, measured the way the classical rule requires. Sits just either side of kalamsa, since that crossing is what defines the event. */ timeDegrees: number; /** * The limit that was crossed. Can differ from the current reading limit for Mercury and Venus, whose limit tightens when they are retrograde, so an asta entered while retrograde may be left at a different threshold. */ kalamsa: number; } | null; /** * The event that will end the current state, or null when none falls inside the search horizon. For an invisible graha this is the udaya a practitioner is waiting for, so it answers when Guru Asta or Shukra Asta lifts. */ nextEvent: { /** * Udaya is heliacal rising, the graha re-emerging from the Sun rays and becoming visible again. Asta (also called lopa, moudhya or moudyami) is heliacal setting, the graha disappearing into them. Stable Sanskrit keys, never translated. */ type: 'udaya' | 'asta'; /** * Horizon the event happens at. East means it is read before sunrise, so the graha is a morning object; west means after sunset, an evening object. A graha crosses to the other horizon as it passes the Sun, which is why an asta and the udaya that follows it are usually on opposite horizons. */ horizon: 'east' | 'west'; /** * Local civil datetime of the event (YYYY-MM-DDTHH:MM:SS), being the moment the graha itself crosses the horizon on the day its verdict changes. That instant, rather than sunrise or sunset, is what published Asta tables print. */ datetime: string; /** * Separation from the Sun in degrees of time on the event day, measured the way the classical rule requires. Sits just either side of kalamsa, since that crossing is what defines the event. */ timeDegrees: number; /** * The limit that was crossed. Can differ from the current reading limit for Mercury and Venus, whose limit tightens when they are retrograde, so an asta entered while retrograde may be left at a different threshold. */ kalamsa: number; } | null; }>; }; export type HeliacalRequest = { /** * Local calendar date to judge, in YYYY-MM-DD format. There is deliberately no time field: heliacal visibility is a once-a-day verdict read at that day sunrise or sunset, so a clock time could only pick a different day. */ date: string; /** * Observer latitude in decimal degrees, restricted to -60 to 60. Visibility depends on the observer, unlike the longitude orb every chart API reports, because the angle the ecliptic makes with the horizon decides how long a graha lingers after the Sun. Beyond this band the classical rule stops describing solar glare and starts describing polar horizon geometry, so it is declined rather than answered wrongly. */ latitude: number; /** * Observer longitude in decimal degrees. Sets local sunrise and sunset, which are the instants the verdict is read at. Example: Mumbai 72.8777, Delhi 77.2090, London -0.1278. */ longitude: number; /** * Timezone: IANA name (e.g. "Asia/Kolkata", "Europe/London") OR decimal hours from UTC. Fixes which local day the date refers to, and every datetime in the response is returned in it. Defaults to 5.5. */ timezone?: number | string; }; export type BasicCard = { /** * Unique card identifier in kebab-case, with no leading article on Major Arcana (e.g. fool, star, ace-of-cups, queen-of-swords). This is the canonical form, whatever spelling was requested. */ id: string; /** * Display name of the tarot card as it appears in the Rider-Waite-Smith tradition. */ name: string; /** * Whether this card belongs to the Major Arcana (22 trump cards representing major life themes) or Minor Arcana (56 suit cards for daily situations). */ arcana: 'major' | 'minor'; /** * Suit of the card (Minor Arcana only). Cups=emotions, Wands=creativity, Swords=intellect, Pentacles=material. Null for Major Arcana cards. */ suit?: 'cups' | 'wands' | 'swords' | 'pentacles'; /** * Card number within its arcana. Major Arcana: 0 (Fool) through 21 (World). Minor Arcana: 1 (Ace) through 14 (King). */ number: number; /** * URL to the tarot card artwork image in the Rider-Waite-Smith style. */ imageUrl: string; }; export type Card = { /** * Unique card identifier in kebab-case, with no leading article on Major Arcana (e.g. fool, star, ace-of-cups, queen-of-swords). This is the canonical form, whatever spelling was requested. */ id: string; /** * Display name of the tarot card as it appears in the Rider-Waite-Smith tradition. */ name: string; /** * Whether this card belongs to the Major Arcana (22 trump cards representing major life themes) or Minor Arcana (56 suit cards for daily situations). */ arcana: 'major' | 'minor'; /** * Suit of the card (Minor Arcana only). Cups=emotions, Wands=creativity, Swords=intellect, Pentacles=material. Null for Major Arcana cards. */ suit?: 'cups' | 'wands' | 'swords' | 'pentacles'; /** * Card number within its arcana. Major Arcana: 0 (Fool) through 21 (World). Minor Arcana: 1 (Ace) through 14 (King). */ number: number; /** * Keywords for both upright and reversed orientations of this tarot card, useful for quick divination reference. */ keywords: { /** * Key themes when the card is drawn upright. Used for quick tarot reference and reading summaries. */ upright: Array; /** * Key themes when the card is drawn reversed (inverted). Reversed meanings often indicate blocked or internalized energy. */ reversed: Array; }; /** * Complete upright interpretation including description, keywords, and guidance across love, career, finances, health, and spirituality domains. */ upright: { /** * Key themes and concepts for this card in the given orientation (upright or reversed). Used for quick tarot reference and divination summaries. */ keywords: Array; /** * Full narrative interpretation of the card in this orientation. Covers symbolism, life lessons, and guidance for the querent. */ description: string; /** * Love and relationship interpretation for this orientation. Covers romantic partnerships, dating, emotional connections, and matters of the heart. */ love?: string; /** * Career and professional interpretation for this orientation. Covers workplace dynamics, job transitions, ambition, and vocational purpose. */ career?: string; /** * Financial interpretation for this orientation. Covers money management, investments, material prosperity, and abundance mindset. */ finances?: string; /** * Health and wellbeing interpretation for this orientation. Covers physical vitality, mental health, energy levels, and self-care guidance. */ health?: string; /** * Spiritual interpretation for this orientation. Covers personal growth, inner wisdom, soul purpose, and metaphysical development. */ spirituality?: string; }; /** * Complete reversed (inverted) interpretation including description, keywords, and guidance across love, career, finances, health, and spirituality domains. Reversed cards carry modified or blocked energy. */ reversed: { /** * Key themes and concepts for this card in the given orientation (upright or reversed). Used for quick tarot reference and divination summaries. */ keywords: Array; /** * Full narrative interpretation of the card in this orientation. Covers symbolism, life lessons, and guidance for the querent. */ description: string; /** * Love and relationship interpretation for this orientation. Covers romantic partnerships, dating, emotional connections, and matters of the heart. */ love?: string; /** * Career and professional interpretation for this orientation. Covers workplace dynamics, job transitions, ambition, and vocational purpose. */ career?: string; /** * Financial interpretation for this orientation. Covers money management, investments, material prosperity, and abundance mindset. */ finances?: string; /** * Health and wellbeing interpretation for this orientation. Covers physical vitality, mental health, energy levels, and self-care guidance. */ health?: string; /** * Spiritual interpretation for this orientation. Covers personal growth, inner wisdom, soul purpose, and metaphysical development. */ spirituality?: string; }; /** * URL to the tarot card artwork image in the Rider-Waite-Smith style. */ imageUrl: string; }; export type DrawnCard = { /** * Unique card identifier in kebab-case (e.g. the-fool, ace-of-cups). */ id: string; /** * Display name of the tarot card. */ name: string; /** * Whether this card belongs to the Major Arcana (22 trump cards, major life themes) or Minor Arcana (56 suit cards, daily situations). */ arcana: 'major' | 'minor'; /** * Suit of the card (Minor Arcana only). Cups=emotions, Wands=creativity, Swords=intellect, Pentacles=material. Null for Major Arcana cards. */ suit?: 'cups' | 'wands' | 'swords' | 'pentacles'; /** * Card number within its arcana. Major Arcana: 0 (Fool) through 21 (World). Minor Arcana: 1 (Ace) through 14 (King). Null when not applicable. */ number?: number; /** * Position index of this card in the draw sequence (1-based). Useful for mapping cards to spread positions. */ position: number; /** * True if the card was drawn reversed (upside down). Reversed cards carry modified or blocked energy compared to upright position. */ reversed: boolean; /** * Key themes and concepts associated with this card in its current orientation (upright or reversed). */ keywords: Array; /** * Full interpretation of this card in its current orientation, providing detailed divination guidance. */ meaning: string; /** * Love and relationship interpretation for the drawn orientation. Covers romantic partnerships, dating, emotional connections, and matters of the heart. */ love?: string; /** * Career and professional interpretation for the drawn orientation. Covers workplace dynamics, job transitions, ambition, and vocational purpose. */ career?: string; /** * Financial interpretation for the drawn orientation. Covers money management, investments, material prosperity, and abundance mindset. */ finances?: string; /** * Health and wellbeing interpretation for the drawn orientation. Covers physical vitality, mental health, energy levels, and self-care guidance. */ health?: string; /** * Spiritual interpretation for the drawn orientation. Covers personal growth, inner wisdom, soul purpose, and metaphysical development. */ spirituality?: string; /** * URL to the tarot card artwork image. */ imageUrl: string; }; export type AyurvedaConstitutionRequest = { /** * Birth date in YYYY-MM-DD format. It sets the sidereal positions the whole reading is built from, so an approximate date gives an approximate constitution. */ date: string; /** * Birth time in 24-hour HH:MM:SS format. The rising sign turns roughly every two hours and carries the heaviest weight of the three factors, so time is the input a reading is most sensitive to. */ time: string; /** * Birth latitude in decimal degrees. It sets the local sidereal time behind the rising sign, and it feeds the strength of each graha through the sunrise at that place. */ latitude: number; /** * Birth longitude in decimal degrees. It sets the local sidereal time behind the rising sign, together with the latitude. */ longitude: number; /** * Timezone as an IANA name such as "Asia/Kolkata", or as decimal hours from UTC such as 5.5. An IANA name is resolved to the offset in force on the birth date, so a summer-time birth is placed correctly. Defaults to 5.5. */ timezone?: number | string; /** * Sidereal frame the chart is cast in. "lahiri" is the traditional Vedic standard used by most software and is the default. "raman" sits about 1.45 degrees below it. "kp-newcomb" and "kp-old" are the two Krishnamurti Paddhati frames. "custom" takes your own value in degrees via ayanamsaValue. The frame rotates the whole zodiac, so a graha within 1.45 degrees of a boundary can change rashi when you switch, which moves both sign factors of the reading. */ ayanamsa?: 'kp-newcomb' | 'kp-old' | 'lahiri' | 'raman' | 'custom'; /** * Custom sidereal frame value in degrees. Required when ayanamsa is "custom" and ignored otherwise. Use it to reconcile exactly against a specific reference program. */ ayanamsaValue?: number; /** * Which classical sign table the rising sign and the Moon sign are read through. "satyacharya" is the twelve-sign extract appended to Brihat Jataka 18.20, carried in two independent public-domain translations that agree on all twelve rows, and is the default. "bphs" is the Brihat Parasara Hora Sastra rule by elemental triplicity. The two agree exactly on three signs of twelve, overlap in part on seven, and share no humour at all on Scorpio or Sagittarius, so the choice can change the reading outright and is echoed in the response. */ signDoshaScheme?: 'satyacharya' | 'bphs'; }; export type AyurvedaDinacharyaRequest = { /** * The local calendar date, in YYYY-MM-DD format. Sunrise and sunset are computed for this date at the given place, and the whole routine follows from them, so the answer changes through the year at any latitude away from the equator. */ date: string; /** * Latitude in decimal degrees. It sets how long the day and the night actually are, which is the whole difference between this and a printed timetable: at 51 north in June the day runs about sixteen and a half hours and its thirds are five and a half hours each. */ latitude: number; /** * Longitude in decimal degrees. It sets the clock time of sunrise at this place. */ longitude: number; /** * Timezone as an IANA name such as "Europe/London", or as decimal hours from UTC such as 5.5. An IANA name is resolved to the offset in force on the requested date. It decides which local day is meant and, on the clock-hour grid, where the blocks fall. Defaults to 0. */ timezone?: number | string; /** * How the six dosha periods are cut. "sunrise-anchored" divides the actual day and the actual night at this place into thirds, which is the division the frame chapter states, and is the default. "clock-hours" is the modern grid of six four-hour blocks from six in the morning; no classical text assigns clock hours, and the grid is only exact at an equinox near the equator. Both sets are returned whichever is chosen, so a caller can show one and reconcile against the other. */ doshaClock?: 'sunrise-anchored' | 'clock-hours'; }; export type AyurvedaRitucharyaRequest = { /** * The date to resolve, in YYYY-MM-DD format. The season is read at midday UTC on this date, because a season boundary is an instant and a calendar day has to be reduced to one; on a day that carries a boundary, the half the midday falls in is the answer. */ date: string; /** * Which six-season division the year is cut into. "sutrasthana-6" is the standard set of sisira, vasanta, grisma, varsa, sarad and hemanta, and is the default. "vimana-8" is the alternate division in which three seasons of extreme character alternate with three of moderate character and pravrt, the season of the first rains, replaces sisira. The alternate is not a relabelling: five of the six boundaries move, and because its verse gives no solar-month boundaries the month allocation is a RoxyAPI convention, stated in the response. */ ritucharyaScheme?: 'sutrasthana-6' | 'vimana-8'; /** * Which zodiac the solar-month boundaries are measured in. "sayana" is the tropical reading, which is what published almanacs use for seasons and is the default. "nirayana" is the sidereal reading in the Lahiri frame, which runs about 24 days later. The gap is the size of the ayanamsa, so near a boundary the two answer with different seasons for the same date, which is why the value is echoed in every response. */ rituZodiac?: 'sayana' | 'nirayana'; /** * Which half of the world the season names are stated for. Defaults to "northern", which is the half the primary text describes. It is NEVER inferred from a latitude: a silent flip would change the answer without the caller asking, and no classical text handles the southern case at all. Passing "southern" rotates the six season names by three places, following a modern almanac rather than a verse, and the response says so and states what was not rotated with them. */ hemisphere?: 'northern' | 'southern'; }; export type ChangingLine = { /** * Line position (1-6, bottom to top). In I-Ching, each hexagram has six lines (yao) read from bottom upward. */ position: number; /** * The oracle statement for this line. It applies when this specific line comes up changing (old yin or old yang) in a casting, and it speaks in the concrete imagery of the tradition. */ text: string; /** * What the line statement asks of the querent, read from its position in the hexagram (1 is the hidden beginning, 3 is the exposed threshold, 5 is the ruling line, 6 is past the peak) and from whether the line is yin or yang. This is the meaning behind the image, so a consuming agent does not have to invent one. */ meaning?: string; }; export type BasicHexagram = { /** * Hexagram number in King Wen sequence (1-64). */ number: number; /** * Unicode hexagram symbol for display. */ symbol: string; /** * Original Chinese name of the hexagram. */ chinese: string; /** * English translation of the hexagram name. */ english: string; /** * Pinyin romanization of the Chinese name with tone marks. */ pinyin: string; /** * Upper trigram (lines 4-6). One of 8 trigrams: Heaven, Earth, Thunder, Wind, Water, Fire, Mountain, Lake. */ upperTrigram: string; /** * Lower trigram (lines 1-3). Combines with upper trigram to form the hexagram. */ lowerTrigram: string; }; export type Hexagram = { /** * Hexagram number in the traditional King Wen sequence (1-64), the standard ordering used in I-Ching divination for over 3,000 years. */ number: number; /** * Unicode hexagram symbol (U+4DC0 block) representing all six lines. Use for visual display in I-Ching apps and divination interfaces. */ symbol: string; /** * Original Chinese character name of the hexagram in traditional script. */ chinese: string; /** * English translation of the hexagram name, conveying the core concept and life situation it represents. */ english: string; /** * Pinyin romanization of the Chinese name with tone marks for correct pronunciation. */ pinyin: string; /** * Binary line pattern (6 digits, bottom to top). 1 = yang (solid line), 0 = yin (broken line). Lines 1-3 form the lower trigram, lines 4-6 form the upper trigram. */ binary: string; /** * Upper trigram (lines 4-6). One of 8 trigrams: Heaven, Earth, Thunder, Wind, Water, Fire, Mountain, Lake. */ upperTrigram: string; /** * Lower trigram (lines 1-3). Combines with the upper trigram to form the hexagram and its meaning. */ lowerTrigram: string; /** * The Judgment (Tuan) text, the primary oracle statement of the hexagram offering core guidance and outcome. */ judgment: string; /** * The Image (Xiang) text, symbolic guidance derived from the trigram combination describing the ideal attitude and action. */ image: string; interpretation: Interpretation; /** * Changing line interpretations for all 6 lines */ changingLines: Array; }; export type Interpretation = { /** * General life situation interpretation of this hexagram. */ general: string; /** * Love and relationship guidance from this hexagram. */ love: string; /** * Career and professional life interpretation. */ career: string; /** * Decision-making guidance for whether to act, wait, retreat, or advance based on this hexagram. */ decision: string; /** * Practical wisdom and actionable advice from this hexagram for daily life application. */ advice: string; }; export type BasicTrigram = { /** * Trigram number (1-8) */ number: number; /** * Unicode trigram symbol */ symbol: string; /** * Chinese name */ chinese: string; /** * English name */ english: string; /** * Pinyin romanization */ pinyin: string; /** * Binary representation (1=Yang solid, 0=Yin broken) */ binary: string; /** * Core attribute/quality */ attribute: string; }; export type Trigram = { /** * Stable identifier for the trigram, 1 to 8. This is our lookup key, not a canonical sequence: the tradition has several orderings (King Wen, Fu Xi, Earlier and Later Heaven) and they disagree, so do not read ranking or precedence into it. */ number: number; /** * Unicode trigram symbol (three lines) for visual display in I-Ching interfaces and Bagua diagrams. */ symbol: string; /** * Original Chinese character name of the trigram in traditional script. */ chinese: string; /** * English name representing the natural force or element this trigram embodies. */ english: string; /** * Pinyin romanization of the Chinese name with tone marks for correct pronunciation. */ pinyin: string; /** * Three-digit binary representation of the trigram lines (bottom to top). 1 = yang (solid), 0 = yin (broken). */ binary: string; /** * Five element (Wu Xing) correspondence: Metal, Wood, Water, Fire, or Earth. Used in Chinese metaphysics and feng shui analysis. */ element: string; /** * Core attribute or quality this trigram represents in I-Ching philosophy (e.g., Creative, Receptive, Arousing). */ attribute: string; /** * Family archetype in the Bagua system. Each trigram corresponds to a family role (Father, Mother, First Son, First Daughter, etc.). */ familyMember: string; /** * Compass direction in the King Wen (Later Heaven) Bagua arrangement. Used in feng shui spatial analysis. */ direction: string; /** * Body part associated with this trigram in traditional Chinese medicine and I-Ching body mapping. */ bodyPart: string; /** * Animal symbol associated with this trigram in classical I-Ching imagery and divination. */ animal: string; /** * Season or time period associated with this trigram in the annual cycle of Chinese cosmology. */ season: string; /** * Energetic quality describing the dynamic nature of this trigram (e.g., Strong, Devoted, Joyous, Gentle). */ quality: string; /** * Concise interpretation of the trigram covering its symbolic meaning, key associations, and guidance for understanding hexagrams containing this trigram. */ meaning: string; }; export type BasicDreamSymbol = { /** * Unique symbol identifier in kebab-case. */ id: string; /** * Display name of the dream symbol. */ name: string; /** * Starting letter for alphabetical filtering. */ letter: string; }; export type DreamSymbol = { /** * Unique symbol identifier in kebab-case. Use this to fetch full interpretation via /symbols/{id}. */ id: string; /** * Display name of the dream symbol. */ name: string; /** * Starting letter (a-z) for alphabetical dream dictionary navigation. */ letter: string; /** * Full psychological dream interpretation explaining the subconscious symbolism, emotional significance, and waking-life connections of this dream symbol. */ meaning: string; }; export type GetFieldLabelsData = { body?: never; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/languages/field-labels'; }; export type GetFieldLabelsErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetFieldLabelsError = GetFieldLabelsErrors[keyof GetFieldLabelsErrors]; export type GetFieldLabelsResponses = { /** * Form labels resolved for the requested language */ 200: { /** * Language these labels resolved to. Echoes the `lang` query parameter, or `en` when it is omitted. */ lang: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; /** * Label per request field or parameter name. Keys are the wire names used in request bodies and query parameters, such as `birthDate`, `timezone` or `houseSystem`. */ fields: { [key: string]: string; }; /** * Label per selectable option, keyed `{fieldName}.{value}` so the same value can read differently under different fields. For example `nodeType.mean` and `houseSystem.whole-sign`. Split on the first dot: the field name is before it, and everything after it is the value you send back unchanged. */ enums: { [key: string]: string; }; }; }; export type GetFieldLabelsResponse = GetFieldLabelsResponses[keyof GetFieldLabelsResponses]; export type ListZodiacSignsData = { body?: never; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/astrology/signs'; }; export type ListZodiacSignsErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type ListZodiacSignsError = ListZodiacSignsErrors[keyof ListZodiacSignsErrors]; export type ListZodiacSignsResponses = { /** * All 12 tropical zodiac signs with names, symbols, elements, date ranges, and descriptions. */ 200: Array<{ /** * Lowercase sign identifier (e.g., aries, taurus, gemini). */ id: string; /** * Display name of the zodiac sign. */ name: string; /** * Unicode zodiac symbol for this sign. */ symbol?: string; /** * Elemental classification: fire, earth, air, or water. Always one of these four English literals, whatever the lang parameter says, so it stays safe to compare against in code. Use elementLocalized for anything a reader sees. */ element: 'fire' | 'earth' | 'air' | 'water'; /** * Element name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ elementLocalized?: string; /** * Tropical zodiac date range for this sign. */ dates: { /** * Start date of this sign in the tropical zodiac. */ start: string; /** * End date of this sign in the tropical zodiac. */ end: string; }; /** * Brief overview of this zodiac sign personality and themes. */ description: string; }>; }; export type ListZodiacSignsResponse = ListZodiacSignsResponses[keyof ListZodiacSignsResponses]; export type GetZodiacSignData = { body?: never; path: { /** * Sign ID (lowercase, e.g., aries, taurus) or display name (case-insensitive, e.g., Aries, TAURUS). */ id: string; }; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/astrology/signs/{id}'; }; export type GetZodiacSignErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Zodiac sign not found */ 404: { /** * Human-readable error message. The wording may change, so do not parse it programmatically. Switch on the stable code instead. */ error: string; /** * Machine-readable error code. Stable identifier for programmatic error handling. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself. The same URL in every environment, so it is safe to log, print in a CLI, or paste into a bug report. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetZodiacSignError = GetZodiacSignErrors[keyof GetZodiacSignErrors]; export type GetZodiacSignResponses = { /** * Successfully retrieved zodiac sign */ 200: { /** * Lowercase sign identifier. */ id: string; /** * Display name of the zodiac sign. */ name: string; /** * Unicode zodiac symbol. */ symbol?: string; /** * Symbol name or mascot associated with this sign. */ symbolName: string; /** * Elemental classification: fire, earth, air, or water. Determines temperament and compatibility group. Always one of these four English literals, whatever the lang parameter says, so it stays safe to compare against in code. Use elementLocalized for anything a reader sees. */ element: 'fire' | 'earth' | 'air' | 'water'; /** * Element name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ elementLocalized?: string; /** * Quality/modality: cardinal (initiating), fixed (sustaining), or mutable (adapting). Always one of these three English literals, whatever the lang parameter says, so it stays safe to compare against in code. Use modalityLocalized for anything a reader sees. */ modality: 'cardinal' | 'fixed' | 'mutable'; /** * Modality name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ modalityLocalized?: string; /** * Traditional ruling planet that governs this sign. Always English, whatever the lang parameter says, so it stays safe to compare against in code. Use rulingPlanetLocalized for anything a reader sees. */ rulingPlanet: string; /** * Ruling planet name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ rulingPlanetLocalized?: string; /** * Tropical zodiac date range for this sign. */ dates: { /** * Start date of this sign season. */ start: string; /** * End date of this sign season. */ end: string; }; /** * Key personality traits and descriptive words for this sign. */ keywords: Array; /** * Sign description in short and long form. */ description: { /** * Brief 1-2 sentence personality overview. */ short: string; /** * Detailed multi-paragraph sign profile with personality analysis. */ long: string; }; /** * Notable people born under this zodiac sign. */ famous?: Array; /** * Key strengths and lovable qualities of this sign. */ strengths?: Array; /** * Signature motto or tagline for this sign. */ motto?: string; /** * Greatest gifts and natural talents of this sign. */ gifts?: string; /** * Greatest challenges and growth areas for this sign. */ challenges?: string; /** * Secret weapon or superpower of this sign. */ weapon?: string; /** * Most compatible zodiac signs for this sign. Trine partners (same element, 120 degrees apart) listed first, followed by a sextile partner (complementary element, 60 degrees apart). Use for compatibility widgets, dating app onboarding, sign profile cards, and zodiac matchmaking. */ compatibleSigns: Array; }; }; export type GetZodiacSignResponse = GetZodiacSignResponses[keyof GetZodiacSignResponses]; export type ListPlanetMeaningsData = { body?: never; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/astrology/planet-meanings'; }; export type ListPlanetMeaningsErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type ListPlanetMeaningsError = ListPlanetMeaningsErrors[keyof ListPlanetMeaningsErrors]; export type ListPlanetMeaningsResponses = { /** * All 14 astrological bodies with names, symbols, taglines, categories, and brief descriptions. */ 200: Array<{ /** * Lowercase planet identifier (e.g., sun, moon, mercury). */ id: string; /** * Display name of the planet. */ name: string; /** * Unicode astronomical symbol for this planet. */ symbol: string; /** * Short tagline summarizing this planet in astrology. */ tagline: string; /** * Planet classification: personal (Sun-Mars), social (Jupiter-Saturn), or generational (Uranus-Pluto). */ category?: string; /** * Zodiac sign this planet rules. The sign where the planet operates most naturally. Absent for the lunar nodes, Chiron, and Black Moon Lilith. */ rulership?: string; /** * Brief overview of the planet and its astrological significance. */ description: string; }>; }; export type ListPlanetMeaningsResponse = ListPlanetMeaningsResponses[keyof ListPlanetMeaningsResponses]; export type GetPlanetMeaningData = { body?: never; path: { /** * Planet ID (lowercase, e.g., sun, moon, mercury) or display name (case-insensitive, e.g., Sun, MOON). Spaces, hyphens and underscores are interchangeable, so the two lunar nodes answer to north-node and south-node as well as to their ids north node and south node, and Black Moon Lilith answers to black-moon-lilith as well as to lilith. */ id: string; }; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/astrology/planet-meanings/{id}'; }; export type GetPlanetMeaningErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Planet not found */ 404: { /** * Human-readable error message. The wording may change, so do not parse it programmatically. Switch on the stable code instead. */ error: string; /** * Machine-readable error code. Stable identifier for programmatic error handling. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself. The same URL in every environment, so it is safe to log, print in a CLI, or paste into a bug report. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetPlanetMeaningError = GetPlanetMeaningErrors[keyof GetPlanetMeaningErrors]; export type GetPlanetMeaningResponses = { /** * Successfully retrieved planet meaning */ 200: { /** * Lowercase planet identifier. */ id: string; /** * Display name of the planet. */ name: string; /** * Unicode astronomical symbol. */ symbol: string; /** * Short tagline summarizing this planet. */ tagline: string; /** * Planet classification: personal (Sun-Mars), social (Jupiter-Saturn), or generational (Uranus-Pluto). */ category?: string; /** * Traditional planet temperature (Hot, Cold, or Neutral). */ temperature: string; /** * Orbital period around the Sun or zodiac cycle length. */ orbit: string; /** * Whether this planet can appear retrograde. Always false for Sun and Moon. */ retrograde?: boolean; /** * Zodiac sign this planet rules (domicile). Where the planet operates most naturally. Absent for the lunar nodes, Chiron, and Black Moon Lilith. */ rulership?: string; /** * Sign of detriment. Opposite the rulership sign, where the planet struggles. Absent for the lunar nodes, Chiron, and Black Moon Lilith. */ detriment?: string; /** * Sign of exaltation. Where the planet is honored and amplified. Absent for the lunar nodes, Chiron, and Black Moon Lilith. */ exaltation?: string; /** * Deprecated: use exaltation. Retained for backward compatibility, scheduled for removal in v3. Sign of exaltation, carrying the same value as the exaltation field. */ exultation?: string; /** * Sign of fall. Opposite the exaltation sign, where the planet is weakened. Absent for the lunar nodes, Chiron, and Black Moon Lilith. */ fall?: string; /** * Positive and negative keyword associations for this planet. */ keywords: { /** * Positive traits and keywords when this planet is well-aspected. */ positive: Array; /** * Shadow traits when this planet is challenged or afflicted. */ negative: Array; }; /** * Planet description in short and long form. */ description: { /** * Brief 1-2 sentence overview of the planet. */ short: string; /** * Detailed multi-paragraph description of the planet, its symbolism, and astrological meaning. */ long: string; }; }; }; export type GetPlanetMeaningResponse = GetPlanetMeaningResponses[keyof GetPlanetMeaningResponses]; export type GenerateNatalChartData = { body?: NatalChartRequest; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/astrology/natal-chart'; }; export type GenerateNatalChartErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GenerateNatalChartError = GenerateNatalChartErrors[keyof GenerateNatalChartErrors]; export type GenerateNatalChartResponses = { /** * Successful natal chart calculation with complete astrological data */ 200: NatalChartResponse; }; export type GenerateNatalChartResponse = GenerateNatalChartResponses[keyof GenerateNatalChartResponses]; export type GetPlanetaryPositionsData = { body?: { /** * Target date for planetary positions in YYYY-MM-DD format. Use current date for transit positions, or any historical/future date for research. Planets move daily, so this date determines their zodiac positions. */ date: string; /** * Time in 24-hour HH:MM:SS format for precise calculations. Moon moves ~13° per day, so time matters for accurate lunar position. Use 12:00:00 (noon) as default if exact time not needed. */ time: string; /** * Lunar node convention. "mean" is the smoothed average node, which always moves retrograde; "true" is the osculating node, which tracks the real perturbed node, oscillates up to about 1.5 degrees either side of the mean on a 173-day cycle, and can briefly turn direct. Neither is more correct and they almost always fall in the same sign. Applies to the North and South Node. True is the osculating node and the default, because it is what most Western chart software reports; mean is the smoothed node preferred by several evolutionary schools, so pass "mean" to match one. Nothing else in the chart changes, and the two agree on the sign except when the node sits within about 1.8 degrees of a cusp. Defaults to "true". */ nodeType?: 'mean' | 'true'; /** * Observer latitude in decimal degrees (-90 to 90). While planetary longitudes are geocentric (same worldwide), this is needed for house calculations if extending functionality. For basic ephemeris, use 0 as default. */ latitude: number; /** * Observer longitude in decimal degrees (-180 to 180). Used for precise local time conversion. For basic planetary positions, this has minimal impact but ensures accuracy. */ longitude: number; /** * Decimal hours from UTC (e.g. -5 for EST, 5.5 for IST, 9 for JST, 5.75 for NPT) OR IANA name (e.g. "America/New_York"). IANA resolved to the DST-correct offset for the chart date. */ timezone: number | string; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/astrology/planets'; }; export type GetPlanetaryPositionsErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetPlanetaryPositionsError = GetPlanetaryPositionsErrors[keyof GetPlanetaryPositionsErrors]; export type GetPlanetaryPositionsResponses = { /** * Planetary positions calculated successfully */ 200: { /** * All 14 celestial bodies (10 classical planets, lunar nodes, Chiron, Black Moon Lilith) with zodiac signs, speeds, retrograde status, meanings, and interpretations. */ planets: Array<{ /** * Planet name (Sun, Moon, Mercury, Venus, Mars, Jupiter, Saturn, Uranus, Neptune, Pluto, North Node, South Node, Chiron, Black Moon Lilith). The lunar nodes follow the request nodeType, which defaults to the true (osculating) node; pass "mean" for the smoothed node. The two differ by up to about 1.8 degrees and no other body is affected. */ name: string; /** * Apparent geocentric tropical longitude on the true ecliptic of date, in degrees (0-360): light time and aberration applied, nutation included, the convention desktop chart software and the NASA JPL Horizons observer tables print, so it compares directly with either. */ longitude: number; /** * Apparent geocentric ecliptic latitude of date, in degrees. */ latitude: number; /** * Tropical zodiac sign this planet occupies. */ sign: string; /** * Degree within the zodiac sign (0-29.999). */ degree: number; /** * Daily motion in degrees per day. Negative values indicate retrograde. */ speed: number; /** * Whether the planet is in apparent retrograde motion. */ isRetrograde: boolean; /** * Unicode astronomical symbol for this planet. */ symbol?: string; /** * Short tagline summarizing what this planet governs. */ tagline?: string; /** * Brief description of this planet in astrological context. */ description?: string; /** * Key themes and traits associated with this planet. */ keywords?: Array; /** * Planet-in-sign interpretation. How this planet expresses through the zodiac sign it currently occupies. */ interpretation?: { /** * Interpretation of this planet in its current zodiac sign. */ summary: string; /** * General meaning of this planet in astrology. */ planetMeaning: string; /** * How this planet expresses through the current sign. */ signExpression: string; /** * Keywords for this specific planet-in-sign combination. */ keywords: Array; }; }>; }; }; export type GetPlanetaryPositionsResponse = GetPlanetaryPositionsResponses[keyof GetPlanetaryPositionsResponses]; export type GetMonthlyTropicalEphemerisData = { body?: { /** * Year for the monthly ephemeris (1900-2100). Defaults to the current year (UTC). */ year?: number; /** * Month number (1-12) for the ephemeris. Defaults to the current month (UTC). */ month?: number; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/astrology/planets/monthly'; }; export type GetMonthlyTropicalEphemerisErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetMonthlyTropicalEphemerisError = GetMonthlyTropicalEphemerisErrors[keyof GetMonthlyTropicalEphemerisErrors]; export type GetMonthlyTropicalEphemerisResponses = { /** * Monthly ephemeris data */ 200: { /** * Year of the ephemeris. Echoes the year that was requested, or the current UTC year when it was omitted. */ year: number; /** * Month of the ephemeris. Echoes the month that was requested, or the current UTC month when it was omitted. */ month: number; /** * Daily planetary position entries for the entire month. */ days: Array<{ /** * Date in YYYY-MM-DD format. */ date: string; /** * Tropical positions of all 14 Western bodies on this date at noon UTC. */ positions: Array<{ /** * Body name, one of the 14 bodies Western astrology reads: Sun, Moon, Mercury, Venus, Mars, Jupiter, Saturn, Uranus, Neptune, Pluto, North Node, South Node, Chiron, Black Moon Lilith. Always English, whatever the lang parameter says, so it stays safe to compare against in code. Use planetLocalized for anything a reader sees. */ planet: string; /** * Body name in the requested language, for display. Present only when lang is set to a language other than English, since in English it would repeat planet exactly. */ planetLocalized?: string; /** * Tropical ecliptic longitude in degrees (0-360), measured from the vernal equinox. This is the Western zodiac, not the sidereal one, so the two differ by the ayanamsa of roughly 24 degrees. */ longitude: number; /** * Tropical zodiac sign the body occupies on this date. Always English, whatever the lang parameter says, so it stays safe to compare against in code. Use signLocalized for anything a reader sees. */ sign: string; /** * Zodiac sign name in the requested language, for display. Present only when lang is set to a language other than English, since in English it would repeat sign exactly. */ signLocalized?: string; /** * Degrees traversed within the current sign (0-30). Useful for precise transit tracking and for printing a position as sign plus degree. */ degreeInSign: number; /** * Whether the body is in apparent retrograde motion on this date. The lunar nodes are always retrograde and Black Moon Lilith is always direct. */ isRetrograde: boolean; }>; }>; }; }; export type GetMonthlyTropicalEphemerisResponse = GetMonthlyTropicalEphemerisResponses[keyof GetMonthlyTropicalEphemerisResponses]; export type GetCurrentMoonPhaseData = { body?: never; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; /** * Date in YYYY-MM-DD format. Defaults to today if omitted. */ date?: string; /** * Time in 24-hour HH:MM:SS format. Defaults to 12:00:00 (noon). Moon moves ~13 degrees per day so time affects phase precision. */ time?: string; /** * IANA name (e.g. "America/New_York", "Europe/London"), decimal hours (e.g. -5 for EST, 1 for CET), or a fixed UTC offset (e.g. "-05:00"). IANA resolved to the DST-correct offset for the given date. Defaults to 0 (UTC). */ timezone?: string; }; url: '/astrology/moon-phase/current'; }; export type GetCurrentMoonPhaseErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetCurrentMoonPhaseError = GetCurrentMoonPhaseErrors[keyof GetCurrentMoonPhaseErrors]; export type GetCurrentMoonPhaseResponses = { /** * Moon phase calculated successfully */ 200: { /** * Date of this moon phase calculation (YYYY-MM-DD). */ date: string; /** * Current lunar phase name. One of: New Moon, Waxing Crescent Moon, First Quarter Moon, Waxing Gibbous Moon, Full Moon, Waning Gibbous Moon, Last Quarter Moon, Waning Crescent Moon. */ phase: string; /** * Moon illumination percentage (0-100). 0 = New Moon, 100 = Full Moon. */ illumination: number; /** * Lunar age in days since the last New Moon. Full lunation cycle is ~29.53 days. */ age: number; /** * Tropical zodiac sign the Moon currently occupies. */ sign: string; /** * Degree of the Moon within its current zodiac sign (0-29.999). */ degree: number; /** * Distance from Earth to the Moon in kilometers. */ distance: number; /** * Moon phase meaning and astrological interpretation. Includes energy direction, keywords, and guidance for this lunar phase. */ meaning?: { /** * Moon phase display name. */ name: string; /** * Moon phase emoji symbol. */ symbol: string; /** * Astrological interpretation of this lunar phase and its influence on activities, emotions, and intentions. */ description: string; /** * Key themes and activities aligned with this moon phase. */ keywords: Array; /** * Lunar energy direction: waxing (building), waning (releasing), new (beginning), or full (culmination). */ energy: 'waxing' | 'waning' | 'new' | 'full'; /** * Illumination range description for this phase. */ illumination: string; }; }; }; export type GetCurrentMoonPhaseResponse = GetCurrentMoonPhaseResponses[keyof GetCurrentMoonPhaseResponses]; export type GetUpcomingMoonPhasesData = { body?: never; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; /** * Start date in YYYY-MM-DD format. Defaults to today if omitted. */ startDate?: string; /** * Number of upcoming moon phase transitions to return (1-20). Defaults to 8. */ count?: number; }; url: '/astrology/moon-phase/upcoming'; }; export type GetUpcomingMoonPhasesErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetUpcomingMoonPhasesError = GetUpcomingMoonPhasesErrors[keyof GetUpcomingMoonPhasesErrors]; export type GetUpcomingMoonPhasesResponses = { /** * Upcoming moon phases retrieved successfully */ 200: { /** * Upcoming moon phase transition dates in chronological order. */ phases: Array<{ /** * Date of this moon phase transition (YYYY-MM-DD). */ date: string; /** * Lunar phase name (New Moon, First Quarter, Full Moon, Last Quarter). */ phase: string; }>; }; }; export type GetUpcomingMoonPhasesResponse = GetUpcomingMoonPhasesResponses[keyof GetUpcomingMoonPhasesResponses]; export type GetMoonCalendarData = { body?: never; path: { /** * Calendar year (1900-2100). */ year: number; /** * Calendar month (1-12). 1 = January, 12 = December. */ month: number; }; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/astrology/moon-phase/calendar/{year}/{month}'; }; export type GetMoonCalendarErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetMoonCalendarError = GetMoonCalendarErrors[keyof GetMoonCalendarErrors]; export type GetMoonCalendarResponses = { /** * Lunar calendar generated successfully */ 200: { /** * Calendar year for this lunar calendar. */ year: number; /** * Calendar month for this lunar calendar. */ month: number; /** * Month name, localized to the requested language. Saves the caller a lookup table when labelling a calendar heading, since the numeric month alone cannot be rendered without one. */ monthName: string; /** * Daily moon phase and illumination for every day of the month. */ calendar: Array<{ /** * Calendar date (YYYY-MM-DD). */ date: string; /** * Lunar phase name for this date. */ phase: string; /** * Moon illumination percentage (0-100) at noon on this date. */ illumination: number; }>; }; }; export type GetMoonCalendarResponse = GetMoonCalendarResponses[keyof GetMoonCalendarResponses]; export type CalculateSynastryData = { body?: { person1: { /** * Birth date in YYYY-MM-DD format. Determines planetary positions for the specific calendar day. */ date: string; /** * Birth time in 24-hour HH:MM:SS format. Determines the Ascendant (rising sign) and house cusps. Use 12:00:00 if unknown. */ time: string; /** * Birth location latitude in decimal degrees (-90 to 90). Positive = North, negative = South. */ latitude: number; /** * Birth location longitude in decimal degrees (-180 to 180). Positive = East, negative = West. */ longitude: number; /** * Timezone: IANA name (e.g. "America/New_York", "Europe/London") OR decimal hours from UTC (e.g. -5 for EST, 1 for CET). IANA strings are resolved to the offset in force at the given date and time, so you can pass `cities[0].timezone` from /location/search directly. */ timezone: number | string; /** * Lunar node convention. "mean" is the smoothed average node, which always moves retrograde; "true" is the osculating node, which tracks the real perturbed node, oscillates up to about 1.5 degrees either side of the mean on a 173-day cycle, and can briefly turn direct. Neither is more correct and they almost always fall in the same sign. Applies to the North and South Node. True is the osculating node and the default, because it is what most Western chart software reports; mean is the smoothed node preferred by several evolutionary schools, so pass "mean" to match one. Nothing else in the chart changes, and the two agree on the sign except when the node sits within about 1.8 degrees of a cusp. Defaults to "true". */ nodeType?: 'mean' | 'true'; /** * Optional display name for this person. Included in the response for easy identification. */ name?: string; }; person2: { /** * Birth date in YYYY-MM-DD format. Determines planetary positions for the specific calendar day. */ date: string; /** * Birth time in 24-hour HH:MM:SS format. Determines the Ascendant (rising sign) and house cusps. Use 12:00:00 if unknown. */ time: string; /** * Birth location latitude in decimal degrees (-90 to 90). Positive = North, negative = South. */ latitude: number; /** * Birth location longitude in decimal degrees (-180 to 180). Positive = East, negative = West. */ longitude: number; /** * Timezone: IANA name (e.g. "America/New_York", "Europe/London") OR decimal hours from UTC (e.g. -5 for EST, 1 for CET). IANA strings are resolved to the offset in force at the given date and time, so you can pass `cities[0].timezone` from /location/search directly. */ timezone: number | string; /** * Lunar node convention. "mean" is the smoothed average node, which always moves retrograde; "true" is the osculating node, which tracks the real perturbed node, oscillates up to about 1.5 degrees either side of the mean on a 173-day cycle, and can briefly turn direct. Neither is more correct and they almost always fall in the same sign. Applies to the North and South Node. True is the osculating node and the default, because it is what most Western chart software reports; mean is the smoothed node preferred by several evolutionary schools, so pass "mean" to match one. Nothing else in the chart changes, and the two agree on the sign except when the node sits within about 1.8 degrees of a cusp. Defaults to "true". */ nodeType?: 'mean' | 'true'; /** * Optional display name for this person. Included in the response for easy identification. */ name?: string; }; /** * House system for both natal charts. Placidus (default), Whole Sign, Equal, or Koch. */ houseSystem?: 'placidus' | 'whole-sign' | 'equal' | 'koch'; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/astrology/synastry'; }; export type CalculateSynastryErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type CalculateSynastryError = CalculateSynastryErrors[keyof CalculateSynastryErrors]; export type CalculateSynastryResponses = { /** * Synastry calculated successfully with compatibility analysis */ 200: { /** * Person 1 chart highlights: Ascendant, Sun sign, Moon sign, and plotting positions. */ person1: { /** * Display name if provided in the request. */ name?: string; /** * Ascendant position for person 1. Determines first house cusp and outward personality. */ ascendant: { /** * Ascendant (rising sign) of this person. Always English, whatever the lang parameter says. Use signLocalized for anything a reader sees. */ sign: string; /** * Ascendant sign name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ signLocalized?: string; /** * Degree within the Ascendant sign (0-29.999). */ degree: number; }; /** * Sun sign (zodiac sign) of this person. Core identity and ego expression. Always English, whatever the lang parameter says. Use sunSignLocalized for anything a reader sees. */ sunSign: string; /** * Sun sign name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ sunSignLocalized?: string; /** * Moon sign of this person. Emotional nature and inner needs. Always English, whatever the lang parameter says. Use moonSignLocalized for anything a reader sees. */ moonSign: string; /** * Moon sign name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ moonSignLocalized?: string; /** * Planet positions for person 1, enough to render this side of a dual wheel without a second request. Per-planet interpretations are not repeated here; call the natal chart endpoint for an individual reading. */ planets: Array<{ /** * Planet or point name. Matches the names used in interAspects. Always English, whatever the lang parameter says. Use nameLocalized for anything a reader sees. */ name: string; /** * Planet or point name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ nameLocalized?: string; /** * Ecliptic longitude in degrees (0-360) measured from 0 Aries. This is the value a wheel plots. */ longitude: number; /** * Zodiac sign containing the planet. Always English, whatever the lang parameter says. Use signLocalized for anything a reader sees. */ sign: string; /** * Zodiac sign name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ signLocalized?: string; /** * Degree within the sign (0-29.999). */ degree: number; /** * House this planet occupies in the person 1 chart (1-12). This is the placement in this person OWN chart. For the house overlay a synastry reading is built on, read houseInOtherChart. */ house: number; /** * Which of person 2 houses this planet of person 1 falls into (1-12), counted on that person cusps in the same house system. This is the house OVERLAY, the half of synastry the inter-aspects do not cover: an aspect says two bodies are in relationship, an overlay says which area of the other person life this body lands in. Both people get their own overlay, so person 2 planets carry the reverse reading. */ houseInOtherChart: number; /** * True when the planet is retrograde at this moment. */ isRetrograde: boolean; }>; }; /** * Person 2 chart highlights: Ascendant, Sun sign, Moon sign, and plotting positions. */ person2: { /** * Display name if provided in the request. */ name?: string; /** * Ascendant position for person 2. Determines first house cusp and outward personality. */ ascendant: { /** * Ascendant (rising sign) of this person. Always English, whatever the lang parameter says. Use signLocalized for anything a reader sees. */ sign: string; /** * Ascendant sign name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ signLocalized?: string; /** * Degree within the Ascendant sign (0-29.999). */ degree: number; }; /** * Sun sign (zodiac sign) of this person. Core identity and ego expression. Always English, whatever the lang parameter says. Use sunSignLocalized for anything a reader sees. */ sunSign: string; /** * Sun sign name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ sunSignLocalized?: string; /** * Moon sign of this person. Emotional nature and inner needs. Always English, whatever the lang parameter says. Use moonSignLocalized for anything a reader sees. */ moonSign: string; /** * Moon sign name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ moonSignLocalized?: string; /** * Planet positions for person 2, enough to render this side of a dual wheel without a second request. Per-planet interpretations are not repeated here; call the natal chart endpoint for an individual reading. */ planets: Array<{ /** * Planet or point name. Matches the names used in interAspects. Always English, whatever the lang parameter says. Use nameLocalized for anything a reader sees. */ name: string; /** * Planet or point name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ nameLocalized?: string; /** * Ecliptic longitude in degrees (0-360) measured from 0 Aries. This is the value a wheel plots. */ longitude: number; /** * Zodiac sign containing the planet. Always English, whatever the lang parameter says. Use signLocalized for anything a reader sees. */ sign: string; /** * Zodiac sign name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ signLocalized?: string; /** * Degree within the sign (0-29.999). */ degree: number; /** * House this planet occupies in the person 2 chart (1-12). This is the placement in this person OWN chart. For the house overlay a synastry reading is built on, read houseInOtherChart. */ house: number; /** * Which of person 1 houses this planet of person 2 falls into (1-12), counted on that person cusps in the same house system. This is the house OVERLAY, the half of synastry the inter-aspects do not cover: an aspect says two bodies are in relationship, an overlay says which area of the other person life this body lands in. Both people get their own overlay, so person 1 planets carry the reverse reading. */ houseInOtherChart: number; /** * True when the planet is retrograde at this moment. */ isRetrograde: boolean; }>; }; /** * Overall compatibility score (0-100). Calculated from the balance of harmonious vs challenging inter-chart aspects weighted by planet importance. */ compatibilityScore: number; /** * All inter-chart (synastry) aspects between person 1 and person 2 planets. Each aspect reveals a specific dynamic in the relationship. */ interAspects: Array<{ /** * Planet from person 1 chart. Always English, whatever the lang parameter says. Use planet1Localized for anything a reader sees. */ planet1: string; /** * Person 1 planet name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ planet1Localized?: string; /** * Planet from person 2 chart. Always English, whatever the lang parameter says. Use planet2Localized for anything a reader sees. */ planet2: string; /** * Person 2 planet name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ planet2Localized?: string; /** * Aspect type (CONJUNCTION, OPPOSITION, TRINE, SQUARE, SEXTILE, etc.). Always English, whatever the lang parameter says. Use typeLocalized for anything a reader sees. */ type: string; /** * Aspect type name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ typeLocalized?: string; /** * Exact angle of this aspect type in degrees. */ angle: number; /** * Distance from exact aspect in degrees. Tighter orb means stronger influence. */ orb: number; /** * Aspect strength percentage (0-100) based on orb tightness. */ strength: number; /** * Aspect nature: harmonious, challenging, or neutral. */ interpretation: string; /** * Aspect meaning with relationship-specific context for this planet pair. */ meaning?: { /** * Aspect display name. */ name: string; /** * Aspect meaning in short and long form. */ description: { /** * Brief aspect description. */ short: string; /** * Detailed aspect description. */ long: string; }; /** * Keywords associated with this aspect type. */ keywords: Array; /** * How this aspect type is characterised in its reference card, in the requested language, exactly like the name, description and keywords beside it. Branch on the aspect-level interpretation field instead, which is always English. */ nature: string; /** * How this specific planetary pair aspect manifests in relationships. */ relationshipContext: string; }; }>; /** * Synastry aspect summary showing the balance of harmonious vs challenging inter-chart connections. */ summary: { /** * Total number of inter-chart aspects found. */ total: number; /** * Count of harmonious aspects (trine, sextile). Natural ease and flow. */ harmonious: number; /** * Count of challenging aspects (square, opposition). Dynamic tension and growth. */ challenging: number; /** * Count of neutral aspects (conjunction). Outcome depends on planets involved. */ neutral: number; /** * Aspect count grouped by type. Shows which aspect patterns dominate the relationship. */ byType: { [key: string]: number; }; }; /** * Relationship analysis with strengths, challenges, and overall assessment. */ analysis: { /** * Overall relationship analysis narrative based on aspect patterns. */ overall: string; /** * Areas where the relationship naturally thrives based on harmonious aspects. */ strengths: Array; /** * Potential friction points and growth opportunities from challenging aspects. */ challenges: Array; }; }; }; export type CalculateSynastryResponse = CalculateSynastryResponses[keyof CalculateSynastryResponses]; export type CalculateHousesData = { body?: { /** * Birth date in YYYY-MM-DD format. Date is critical for house cusp calculations as it determines planetary positions used in some house systems. */ date: string; /** * Birth time in 24-hour HH:MM:SS format. Time is ESSENTIAL for accurate house cusps, and even minutes matter. The Ascendant (1st house cusp) changes roughly every 4 minutes. Without accurate time, house placements will be incorrect. */ time: string; /** * Birth location latitude in decimal degrees (-90 to 90). Location determines the local horizon and meridian, which are fundamental to house division. Higher latitudes cause more distortion in time-based systems like Placidus. */ latitude: number; /** * Birth location longitude in decimal degrees (-180 to 180). Affects local time and horizon calculations for house cusps. */ longitude: number; /** * Decimal hours from UTC (e.g. -5 for EST, 5.5 for IST, 9 for JST) OR IANA name (e.g. "America/New_York"). IANA resolved to the DST-correct offset for the chart date. */ timezone: number | string; /** * House system for dividing ecliptic into 12 houses. Placidus (most popular) uses time, Whole Sign (ancient) uses signs, Equal divides from Ascendant. Use "all" to compare all 4 systems side-by-side for educational purposes. */ houseSystem?: 'placidus' | 'whole-sign' | 'equal' | 'koch' | 'all'; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/astrology/houses'; }; export type CalculateHousesErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type CalculateHousesError = CalculateHousesErrors[keyof CalculateHousesErrors]; export type CalculateHousesResponses = { /** * House cusps calculated successfully */ 200: HousesResponse; }; export type CalculateHousesResponse = CalculateHousesResponses[keyof CalculateHousesResponses]; export type CalculateAspectsData = { body?: AspectsRequest; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/astrology/aspects'; }; export type CalculateAspectsErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type CalculateAspectsError = CalculateAspectsErrors[keyof CalculateAspectsErrors]; export type CalculateAspectsResponses = { /** * Aspects calculated successfully */ 200: AspectsResponse; }; export type CalculateAspectsResponse = CalculateAspectsResponses[keyof CalculateAspectsResponses]; export type GetMonthlyTropicalAspectsData = { body?: { /** * Year for the aspect calendar (1900-2100). Defaults to the current year (UTC). */ year?: number; /** * Month number (1-12). Defaults to the current month (UTC). */ month?: number; /** * Timezone offset from UTC in hours. Event dates and times are reported in this zone, which is what makes a published calendar read correctly for its audience. Defaults to 0 (UTC). */ timezone?: number | string; /** * Lunar node convention. "mean" is the smoothed average node, which always moves retrograde; "true" is the osculating node, which tracks the real perturbed node, oscillates up to about 1.5 degrees either side of the mean on a 173-day cycle, and can briefly turn direct. Neither is more correct and they almost always fall in the same sign. Applies to the North and South Node. True is the osculating node and the default, because it is what most Western chart software reports; mean is the smoothed node preferred by several evolutionary schools, so pass "mean" to match one. Nothing else in the chart changes, and the two agree on the sign except when the node sits within about 1.8 degrees of a cusp. Defaults to "true". */ nodeType?: 'mean' | 'true'; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/astrology/aspects/monthly'; }; export type GetMonthlyTropicalAspectsErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetMonthlyTropicalAspectsError = GetMonthlyTropicalAspectsErrors[keyof GetMonthlyTropicalAspectsErrors]; export type GetMonthlyTropicalAspectsResponses = { /** * Monthly aspect calendar calculated successfully */ 200: { /** * Year of the calendar. Echoes the year requested, or the current UTC year when it was omitted. */ year: number; /** * Month of the calendar. Echoes the month requested, or the current UTC month when it was omitted. */ month: number; /** * Timezone the event dates and times are reported in. Echoes the request. */ timezone: number; /** * Every aspect event in the month, in chronological order across all body pairs. */ events: Array<{ /** * First body forming the aspect. Always canonical English whatever the lang parameter says, so it stays safe to compare against in code. Use planet1Localized for anything a reader sees. */ planet1: string; /** * First body in the requested language. Present only when lang is supplied. */ planet1Localized?: string; /** * Second body forming the aspect. Always canonical English. */ planet2: string; /** * Second body in the requested language. Present only when lang is supplied. */ planet2Localized?: string; /** * Aspect type, canonical English. One of conjunction (0 deg), semi-sextile (30 deg), semi-square (45 deg), sextile (60 deg), square (90 deg), trine (120 deg), sesquiquadrate (135 deg), quincunx (150 deg), opposition (180 deg). */ aspect: string; /** * Aspect name in the requested language. Present only when lang is supplied. */ aspectLocalized?: string; /** * Whether the aspect is harmonious, challenging or neutral. Canonical English, so a calendar can color or filter on it directly. natureLocalized carries the reader-facing form. */ nature: string; /** * Nature in the requested language. Present only when lang is supplied. */ natureLocalized?: string; /** * Date the aspect is closest to exact, in the requested timezone (YYYY-MM-DD). */ date: string; /** * Time the aspect is closest to exact, in the requested timezone (HH:MM). */ time: string; /** * Combined timestamp of closest approach, in the requested timezone. */ datetime: string; /** * Distance from exact in degrees at the reported instant. Effectively zero for an aspect that perfects inside the month, and larger only where the pair turns before reaching exact. */ orb: number; /** * Actual angular separation between the two bodies in degrees at the reported instant, measured the short way round the circle. */ separation: number; /** * Tropical ecliptic longitude of the first body at the reported instant. */ planet1Longitude: number; /** * Tropical ecliptic longitude of the second body at the reported instant. */ planet2Longitude: number; }>; }; }; export type GetMonthlyTropicalAspectsResponse = GetMonthlyTropicalAspectsResponses[keyof GetMonthlyTropicalAspectsResponses]; export type DetectAspectPatternsData = { body?: AspectPatternsRequest; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; /** * Use tighter orbs, so only closely formed patterns are reported. Truthy values (true, 1, yes, on; case-insensitive) narrow trine to 5 degrees, square to 5, sextile to 4, quincunx to 2. Defaults to false, the standard pattern-detection orbs. */ strictOrbs?: string; /** * Comma-separated list of optional bodies to include beyond the classical 10 planets. Valid tokens (case-insensitive): chiron, northNode (also accepts north_node, north-node, northnode). Empty by default. */ include?: string; }; url: '/astrology/aspect-patterns'; }; export type DetectAspectPatternsErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type DetectAspectPatternsError = DetectAspectPatternsErrors[keyof DetectAspectPatternsErrors]; export type DetectAspectPatternsResponses = { /** * Aspect patterns detected successfully */ 200: AspectPatternsResponse; }; export type DetectAspectPatternsResponse = DetectAspectPatternsResponses[keyof DetectAspectPatternsResponses]; export type CalculateTransitsData = { body?: TransitsRequest; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/astrology/transits'; }; export type CalculateTransitsErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type CalculateTransitsError = CalculateTransitsErrors[keyof CalculateTransitsErrors]; export type CalculateTransitsResponses = { /** * Transits calculated successfully */ 200: TransitsResponse; }; export type CalculateTransitsResponse = CalculateTransitsResponses[keyof CalculateTransitsResponses]; export type GetMonthlyTropicalTransitsData = { body?: { /** * Year for the monthly transit table (1900-2100). Defaults to the current year (UTC). */ year?: number; /** * Month number (1-12). Defaults to the current month (UTC). */ month?: number; /** * Timezone offset from UTC in hours. Ingress dates and times are reported in this zone, which is what makes a published calendar read correctly for its audience. Defaults to 0 (UTC). */ timezone?: number | string; /** * Lunar node convention. "mean" is the smoothed average node, which always moves retrograde; "true" is the osculating node, which tracks the real perturbed node, oscillates up to about 1.5 degrees either side of the mean on a 173-day cycle, and can briefly turn direct. Neither is more correct and they almost always fall in the same sign. Applies to the North and South Node. True is the osculating node and the default, because it is what most Western chart software reports; mean is the smoothed node preferred by several evolutionary schools, so pass "mean" to match one. Nothing else in the chart changes, and the two agree on the sign except when the node sits within about 1.8 degrees of a cusp. Defaults to "true". */ nodeType?: 'mean' | 'true'; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/astrology/transits/monthly'; }; export type GetMonthlyTropicalTransitsErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetMonthlyTropicalTransitsError = GetMonthlyTropicalTransitsErrors[keyof GetMonthlyTropicalTransitsErrors]; export type GetMonthlyTropicalTransitsResponses = { /** * Monthly transit table calculated successfully */ 200: { /** * Year of the table. Echoes the year requested, or the current UTC year when it was omitted. */ year: number; /** * Month of the table. Echoes the month requested, or the current UTC month when it was omitted. */ month: number; /** * Timezone the ingress dates and times are reported in. Echoes the request. */ timezone: number; /** * Where every body stands as the month opens, so a calendar can show the run-in as well as the changes. */ startingPositions: Array<{ /** * Body name, canonical English. */ planet: string; /** * Body name in the requested language. */ planetLocalized?: string; /** * Tropical sign the body occupies at the start of the month. */ sign: string; /** * Sign in the requested language. */ signLocalized?: string; /** * Tropical ecliptic longitude in degrees at 00:00 UTC on the first of the month. */ longitude: number; }>; /** * Every sign change in the month, in chronological order across all bodies. Empty only for a month in which nothing changes sign, which cannot happen while the Moon is included. */ transitEvents: Array<{ /** * Body that changes sign during the month. One of the 14 Western bodies. Always canonical English whatever the lang parameter says, so it stays safe to compare against in code. Use planetLocalized for anything a reader sees. */ planet: string; /** * Body name in the requested language. Present only when lang is supplied. */ planetLocalized?: string; /** * Tropical sign the body leaves. Canonical English. */ fromSign: string; /** * Sign left, in the requested language. Present only when lang is supplied. */ fromSignLocalized?: string; /** * Tropical sign the body enters. Canonical English. */ toSign: string; /** * Sign entered, in the requested language. Present only when lang is supplied. */ toSignLocalized?: string; /** * Date of the ingress in the requested timezone (YYYY-MM-DD). */ date: string; /** * Time of the ingress in the requested timezone (HH:MM). */ time: string; /** * Combined ingress timestamp in the requested timezone. */ datetime: string; /** * Whether the body was retrograde at the moment it crossed. A retrograde ingress is the body re-entering a sign it already left, which is why the same body can appear more than once in a month. */ isRetrograde: boolean; }>; }; }; export type GetMonthlyTropicalTransitsResponse = GetMonthlyTropicalTransitsResponses[keyof GetMonthlyTropicalTransitsResponses]; export type CalculateTransitAspectsData = { body?: { /** * Natal chart birth details (date, time, location, timezone). Used to calculate natal planetary positions that transits are compared against. */ natalChart: { /** * Birth date in YYYY-MM-DD format. Determines planetary positions for the specific calendar day. */ date: string; /** * Birth time in 24-hour HH:MM:SS format. Determines the Ascendant (rising sign) and house cusps. Use 12:00:00 if unknown. */ time: string; /** * Birth location latitude in decimal degrees (-90 to 90). Positive = North, negative = South. */ latitude: number; /** * Birth location longitude in decimal degrees (-180 to 180). Positive = East, negative = West. */ longitude: number; /** * Timezone: IANA name (e.g. "America/New_York", "Europe/London") OR decimal hours from UTC (e.g. -5 for EST, 1 for CET). IANA strings are resolved to the offset in force at the given date and time, so you can pass `cities[0].timezone` from /location/search directly. */ timezone: number | string; /** * Lunar node convention. "mean" is the smoothed average node, which always moves retrograde; "true" is the osculating node, which tracks the real perturbed node, oscillates up to about 1.5 degrees either side of the mean on a 173-day cycle, and can briefly turn direct. Neither is more correct and they almost always fall in the same sign. Applies to the North and South Node. True is the osculating node and the default, because it is what most Western chart software reports; mean is the smoothed node preferred by several evolutionary schools, so pass "mean" to match one. Nothing else in the chart changes, and the two agree on the sign except when the node sits within about 1.8 degrees of a cusp. Defaults to "true". */ nodeType?: 'mean' | 'true'; }; /** * Transit date in YYYY-MM-DD format. Defaults to current date if omitted. Use future dates for predictive transit analysis. */ transitDate?: string; /** * Transit time in HH:MM:SS format. Defaults to 12:00:00 (noon) if omitted. */ transitTime?: string; /** * Filter to specific transiting planets. Omit to include all planets. Useful for focusing on slow-moving outer planet transits (Saturn, Jupiter, Pluto). */ planets?: Array<'Sun' | 'Moon' | 'Mercury' | 'Venus' | 'Mars' | 'Jupiter' | 'Saturn' | 'Uranus' | 'Neptune' | 'Pluto' | 'North Node' | 'South Node' | 'Chiron' | 'Black Moon Lilith'>; /** * Filter to specific aspect types (conjunction, opposition, trine, square, sextile, etc.). Omit to include all aspect types. */ aspectTypes?: Array<'CONJUNCTION' | 'OPPOSITION' | 'TRINE' | 'SQUARE' | 'SEXTILE' | 'SEMI_SEXTILE' | 'QUINCUNX' | 'SEMI_SQUARE' | 'SESQUIQUADRATE'>; /** * Minimum aspect strength threshold (0-100). Higher values return only tighter, more potent aspects. Useful for filtering out wide-orb aspects. */ minStrength?: number; /** * House system used to divide the natal chart into 12 houses. Every house number in the response is read against these natal cusps, for the natal bodies and the transiting bodies alike. Placidus (default) is time sensitive and the most widely used in Western astrology. Whole Sign assigns one sign per house. Equal divides into 30 degree segments from the Ascendant. Koch emphasizes higher latitudes. Quadrant systems fall back to Whole Sign above the polar circle. */ houseSystem?: 'placidus' | 'whole-sign' | 'equal' | 'koch'; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/astrology/transit-aspects'; }; export type CalculateTransitAspectsErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type CalculateTransitAspectsError = CalculateTransitAspectsErrors[keyof CalculateTransitAspectsErrors]; export type CalculateTransitAspectsResponses = { /** * Transit aspects calculated successfully */ 200: { /** * Date and time of the transit calculation. */ transitDate: string; /** * House system actually used for the natal cusps behind every house number in this response. Differs from the requested system only above the polar circle, where quadrant systems fall back to Whole Sign. */ houseSystem: 'placidus' | 'whole-sign' | 'equal' | 'koch'; /** * The twelve NATAL house cusps that every house number in this response is read against, in the house system named by houseSystem. Same shape as the natal-chart houses array, so a bi-wheel can be drawn with real house sectors from this one response instead of pairing it with a second call. */ houses: Array<{ /** * House number (1-12). Each house governs specific life themes in Western astrology. */ number: number; /** * Ecliptic longitude of this house cusp in degrees (0-360). */ longitude: number; /** * Zodiac sign on this house cusp. Colors the themes of this life area. */ sign: string; /** * Degree within the zodiac sign on this cusp (0-29.999). */ degree: number; /** * Zodiac sign name on this cusp in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ signLocalized?: string; }>; /** * The natal Ascendant (rising sign): the eastern horizon at birth, and the left-hand horizon a chart wheel is oriented to. Reported alongside the cusps because the two are not the same longitude in every house system: Whole Sign puts the first cusp at 0 degrees of the rising sign, which can sit most of a sign away from the Ascendant itself. */ ascendant: { /** * Tropical zodiac sign on the natal Ascendant. Always English, whatever the lang parameter says. Use signLocalized for anything a reader sees. */ sign: string; /** * Ascendant sign name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ signLocalized?: string; /** * Degree within the Ascendant sign (0-29.999). */ degree: number; /** * Absolute ecliptic longitude of the natal Ascendant in degrees (0-360). */ longitude: number; }; /** * Current transiting positions in the tropical zodiac, each placed in the natal house it is passing through. All 14 celestial bodies: the 10 classical planets (Sun through Pluto), the lunar nodes, Chiron, and Black Moon Lilith. */ transitPlanets: Array<{ /** * Body name. One of the 10 classical planets (Sun, Moon, Mercury, Venus, Mars, Jupiter, Saturn, Uranus, Neptune, Pluto), the lunar nodes (North Node, South Node), Chiron, or Black Moon Lilith (the mean lunar apogee). The lunar nodes follow the request nodeType, which defaults to the true (osculating) node; pass "mean" for the smoothed node. The two differ by up to about 1.8 degrees and no other body is affected. */ name: 'Sun' | 'Moon' | 'Mercury' | 'Venus' | 'Mars' | 'Jupiter' | 'Saturn' | 'Uranus' | 'Neptune' | 'Pluto' | 'North Node' | 'South Node' | 'Chiron' | 'Black Moon Lilith'; /** * Apparent geocentric tropical longitude on the true ecliptic of date, in degrees (0-360): light time and aberration applied, nutation included, the convention desktop chart software and the NASA JPL Horizons observer tables print, so it compares directly with either. Primary coordinate for zodiac sign and aspect calculations. */ longitude: number; /** * Apparent geocentric ecliptic latitude of date, in degrees. Near zero for most planets, varies for the Moon and Pluto, and reaches up to about 5 degrees for Black Moon Lilith (projected from the inclined mean lunar orbit). */ latitude: number; /** * Tropical zodiac sign this planet occupies. Determined by 30-degree divisions of ecliptic longitude. */ sign: string; /** * Degree within the zodiac sign (0-29.999). Indicates how far the planet has progressed through the sign. */ degree: number; /** * Natal house (1-12) this transiting body is currently passing through, read against the natal house cusps. This is the life area the transit activates, so it is driven by the natal birth time and location rather than by the transit moment. */ house: number; /** * Daily motion in degrees per day. Negative values indicate retrograde motion. */ speed: number; /** * Whether the planet appears to move backward from Earth perspective. Retrograde periods signal review and introspection. */ isRetrograde: boolean; /** * Body name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ nameLocalized?: string; /** * Zodiac sign name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ signLocalized?: string; }>; /** * Natal (birth chart) planetary positions used as the baseline for transit aspect comparison, each placed in its natal house. */ natalPlanets: Array<{ /** * Body name. One of the 10 classical planets (Sun, Moon, Mercury, Venus, Mars, Jupiter, Saturn, Uranus, Neptune, Pluto), the lunar nodes (North Node, South Node), Chiron, or Black Moon Lilith (the mean lunar apogee). The lunar nodes follow the request nodeType, which defaults to the true (osculating) node; pass "mean" for the smoothed node. The two differ by up to about 1.8 degrees and no other body is affected. */ name: 'Sun' | 'Moon' | 'Mercury' | 'Venus' | 'Mars' | 'Jupiter' | 'Saturn' | 'Uranus' | 'Neptune' | 'Pluto' | 'North Node' | 'South Node' | 'Chiron' | 'Black Moon Lilith'; /** * Apparent geocentric tropical longitude on the true ecliptic of date, in degrees (0-360): light time and aberration applied, nutation included, the convention desktop chart software and the NASA JPL Horizons observer tables print, so it compares directly with either. Primary coordinate for zodiac sign and aspect calculations. */ longitude: number; /** * Apparent geocentric ecliptic latitude of date, in degrees. Near zero for most planets, varies for the Moon and Pluto, and reaches up to about 5 degrees for Black Moon Lilith (projected from the inclined mean lunar orbit). */ latitude: number; /** * Tropical zodiac sign this planet occupies. Determined by 30-degree divisions of ecliptic longitude. */ sign: string; /** * Degree within the zodiac sign (0-29.999). Indicates how far the planet has progressed through the sign. */ degree: number; /** * House placement (1-12). Determined by the selected house system and birth location. */ house: number; /** * Daily motion in degrees per day. Negative values indicate retrograde motion. */ speed: number; /** * Whether the planet appears to move backward from Earth perspective. Retrograde periods signal review and introspection. */ isRetrograde: boolean; /** * Body name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ nameLocalized?: string; /** * Zodiac sign name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ signLocalized?: string; }>; /** * Transit-to-natal aspects with interpretations, strength ratings, and guidance. Each aspect represents a transiting planet forming a geometric angle to a natal planet. */ aspects: Array<{ /** * First planet in the aspect pair. */ planet1: 'Sun' | 'Moon' | 'Mercury' | 'Venus' | 'Mars' | 'Jupiter' | 'Saturn' | 'Uranus' | 'Neptune' | 'Pluto' | 'North Node' | 'South Node' | 'Chiron' | 'Black Moon Lilith'; /** * Second planet in the aspect pair. */ planet2: 'Sun' | 'Moon' | 'Mercury' | 'Venus' | 'Mars' | 'Jupiter' | 'Saturn' | 'Uranus' | 'Neptune' | 'Pluto' | 'North Node' | 'South Node' | 'Chiron' | 'Black Moon Lilith'; /** * Aspect type. Major: conjunction (0), opposition (180), trine (120), square (90), sextile (60). Minor: semi-sextile, quincunx, semi-square, sesquiquadrate. */ type: 'CONJUNCTION' | 'OPPOSITION' | 'TRINE' | 'SQUARE' | 'SEXTILE' | 'SEMI_SEXTILE' | 'QUINCUNX' | 'SEMI_SQUARE' | 'SESQUIQUADRATE'; /** * Exact angular separation that defines this aspect type in degrees. */ angle: number; /** * Deviation from exact aspect in degrees. Tighter orb means stronger influence. */ orb: number; /** * Whether the aspect is applying (planets moving toward exact) or separating (moving apart). Applying aspects grow stronger. */ isApplying: boolean; /** * Aspect strength percentage (0-100). Based on orb tightness relative to the allowed maximum. */ strength: number; /** * Aspect nature. Harmonious (trine, sextile) flows easily. Challenging (square, opposition) creates tension and growth. Neutral (conjunction) blends energies. Always English, whatever the lang parameter says: it is an identifier consumers switch and style on. Use interpretationLocalized for anything a reader sees. */ interpretation: 'harmonious' | 'challenging' | 'neutral'; /** * First planet name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ planet1Localized?: string; /** * Second planet name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ planet2Localized?: string; /** * Aspect type name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ typeLocalized?: string; /** * Rich interpretation of the transit aspect: narrative summary, timing, impact assessment, practical guidance, and keywords. */ transitInterpretation: { /** * Narrative interpretation of this transit aspect and its life impact. */ summary: string; /** * When this transit is most active and how long its influence lasts, localized. The bucket follows the speed of the transiting body: a few hours for the Moon, a few days for the Sun, Mercury, Venus and Mars, one to two weeks for Jupiter, several weeks for Saturn, and an extended period for Uranus, Neptune and Pluto. */ timing: string; /** * Strength and nature of this transit effect: constructive, challenging, or neutral. */ impact: string; /** * Practical advice for working with this transit energy. */ guidance: string; /** * Key themes activated by this transit aspect. */ keywords: Array; }; }>; /** * Statistical summary of all transit aspects. The harmonious-to-challenging ratio reveals the overall transit weather, meaning whether the current period favors ease or demands effort. */ summary: { /** * Total number of transit-to-natal aspects found. */ total: number; /** * Count of harmonious aspects (trine, sextile). These transits bring ease, flow, and opportunity. */ harmonious: number; /** * Count of challenging aspects (square, opposition, semi-square, sesquiquadrate). These transits bring tension, growth pressure, and action. */ challenging: number; /** * Count of neutral aspects (conjunction, minor aspects). Conjunctions blend energies, so the outcome depends on the planets involved. */ neutral: number; /** * The tightest aspect by orb. This is the most potent transit currently active, and the one most likely to be felt. */ strongest: { /** * First planet in the aspect pair. */ planet1: 'Sun' | 'Moon' | 'Mercury' | 'Venus' | 'Mars' | 'Jupiter' | 'Saturn' | 'Uranus' | 'Neptune' | 'Pluto' | 'North Node' | 'South Node' | 'Chiron' | 'Black Moon Lilith'; /** * Second planet in the aspect pair. */ planet2: 'Sun' | 'Moon' | 'Mercury' | 'Venus' | 'Mars' | 'Jupiter' | 'Saturn' | 'Uranus' | 'Neptune' | 'Pluto' | 'North Node' | 'South Node' | 'Chiron' | 'Black Moon Lilith'; /** * Aspect type. Major: conjunction (0), opposition (180), trine (120), square (90), sextile (60). Minor: semi-sextile, quincunx, semi-square, sesquiquadrate. */ type: 'CONJUNCTION' | 'OPPOSITION' | 'TRINE' | 'SQUARE' | 'SEXTILE' | 'SEMI_SEXTILE' | 'QUINCUNX' | 'SEMI_SQUARE' | 'SESQUIQUADRATE'; /** * Exact angular separation that defines this aspect type in degrees. */ angle: number; /** * Deviation from exact aspect in degrees. Tighter orb means stronger influence. */ orb: number; /** * Whether the aspect is applying (planets moving toward exact) or separating (moving apart). Applying aspects grow stronger. */ isApplying: boolean; /** * Aspect strength percentage (0-100). Based on orb tightness relative to the allowed maximum. */ strength: number; /** * Aspect nature. Harmonious (trine, sextile) flows easily. Challenging (square, opposition) creates tension and growth. Neutral (conjunction) blends energies. Always English, whatever the lang parameter says: it is an identifier consumers switch and style on. Use interpretationLocalized for anything a reader sees. */ interpretation: 'harmonious' | 'challenging' | 'neutral'; /** * First planet name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ planet1Localized?: string; /** * Second planet name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ planet2Localized?: string; /** * Aspect type name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ typeLocalized?: string; /** * Rich interpretation of the transit aspect: narrative summary, timing, impact assessment, practical guidance, and keywords. */ transitInterpretation: { /** * Narrative interpretation of this transit aspect and its life impact. */ summary: string; /** * When this transit is most active and how long its influence lasts, localized. The bucket follows the speed of the transiting body: a few hours for the Moon, a few days for the Sun, Mercury, Venus and Mars, one to two weeks for Jupiter, several weeks for Saturn, and an extended period for Uranus, Neptune and Pluto. */ timing: string; /** * Strength and nature of this transit effect: constructive, challenging, or neutral. */ impact: string; /** * Practical advice for working with this transit energy. */ guidance: string; /** * Key themes activated by this transit aspect. */ keywords: Array; }; } | null; /** * Transit aspect counts grouped by aspect type (conjunction, trine, square, opposition, sextile, etc.). Useful for quickly assessing the transit weather. */ byType: { [key: string]: number; }; }; }; }; export type CalculateTransitAspectsResponse = CalculateTransitAspectsResponses[keyof CalculateTransitAspectsResponses]; export type GetMonthlyDeclinationParallelsData = { body?: { /** * Year for the declination calendar (1900-2100). Defaults to the current year (UTC). */ year?: number; /** * Month number (1-12). Defaults to the current month (UTC). */ month?: number; /** * Timezone offset from UTC in hours. Event dates and times are reported in this zone, which is what makes a published calendar read correctly for its audience. Defaults to 0 (UTC). */ timezone?: number | string; /** * How far from exact still counts, in degrees. The traditional orb for a declination contact is tighter than for a zodiacal aspect because declination changes slowly. Defaults to 1.5. */ orb?: number; /** * Lunar node convention. "mean" is the smoothed average node, which always moves retrograde; "true" is the osculating node, which tracks the real perturbed node, oscillates up to about 1.5 degrees either side of the mean on a 173-day cycle, and can briefly turn direct. Neither is more correct and they almost always fall in the same sign. Applies to the North and South Node. True is the osculating node and the default, because it is what most Western chart software reports; mean is the smoothed node preferred by several evolutionary schools, so pass "mean" to match one. Nothing else in the chart changes, and the two agree on the sign except when the node sits within about 1.8 degrees of a cusp. Defaults to "true". */ nodeType?: 'mean' | 'true'; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/astrology/parallels/monthly'; }; export type GetMonthlyDeclinationParallelsErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetMonthlyDeclinationParallelsError = GetMonthlyDeclinationParallelsErrors[keyof GetMonthlyDeclinationParallelsErrors]; export type GetMonthlyDeclinationParallelsResponses = { /** * Monthly declination calendar calculated successfully */ 200: { /** * Year of the calendar. Echoes the year requested, or the current UTC year when it was omitted. */ year: number; /** * Month of the calendar. Echoes the month requested, or the current UTC month when it was omitted. */ month: number; /** * Timezone the event dates and times are reported in. Echoes the request. */ timezone: number; /** * Orb in degrees that was applied. Echoes the request. */ orb: number; /** * Every declination contact in the month, in chronological order across all body pairs. */ events: Array<{ /** * First body in the contact. Always canonical English whatever the lang parameter says, so it stays safe to compare against in code. Use planet1Localized for anything a reader sees. */ planet1: string; /** * First body in the requested language. Present only when lang is supplied. */ planet1Localized?: string; /** * Second body in the contact. Always canonical English. */ planet2: string; /** * Second body in the requested language. Present only when lang is supplied. */ planet2Localized?: string; /** * parallel means both bodies stand at the same declination, the same distance north or south of the celestial equator, and reads much like a conjunction. contraparallel means equal and opposite declinations, one as far north as the other is south, and reads much like an opposition. Neither depends on how far apart the two bodies are along the zodiac, which is what makes them worth tracking alongside ordinary aspects. */ type: 'parallel' | 'contraparallel'; /** * Date the contact is closest to exact, in the requested timezone (YYYY-MM-DD). */ date: string; /** * Time the contact is closest to exact, in the requested timezone (HH:MM). */ time: string; /** * Combined timestamp of closest approach, in the requested timezone. */ datetime: string; /** * Distance from exact in degrees at the reported instant. Effectively zero for a contact that perfects inside the month, and larger only where the pair turns before reaching exact. */ orb: number; /** * Geocentric declination of the first body at the reported instant, in degrees. Positive is north of the celestial equator, negative south. */ declination1: number; /** * Geocentric declination of the second body at the reported instant, in degrees. */ declination2: number; }>; }; }; export type GetMonthlyDeclinationParallelsResponse = GetMonthlyDeclinationParallelsResponses[keyof GetMonthlyDeclinationParallelsResponses]; export type GetPlanetaryNodePassagesData = { body?: { /** * Year to scan for node passages (1900-2100). */ year: number; /** * Timezone offset from UTC in hours. Crossing dates and times are reported in this zone. Defaults to 0 (UTC). */ timezone?: number | string; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/astrology/ecliptic-crossings'; }; export type GetPlanetaryNodePassagesErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetPlanetaryNodePassagesError = GetPlanetaryNodePassagesErrors[keyof GetPlanetaryNodePassagesErrors]; export type GetPlanetaryNodePassagesResponses = { /** * Node passages calculated successfully */ 200: { /** * Year that was scanned. Echoes the request. */ year: number; /** * Timezone the dates and times are reported in. Echoes the request. */ timezone: number; /** * Every node passage in the year, in chronological order across all bodies. The fast bodies dominate: a slow body can go years or decades between node passages, so an absent planet means it did not cross that year rather than that it was not checked. */ events: Array<{ /** * Body making the crossing. Always canonical English whatever the lang parameter says, so it stays safe to compare against in code. Use planetLocalized for anything a reader sees. */ planet: string; /** * Body name in the requested language. Present only when lang is supplied. */ planetLocalized?: string; /** * ascending is the crossing from south of the ecliptic to north, at the body north node. descending is the reverse, at its south node. */ direction: 'ascending' | 'descending'; /** * Date of the crossing in the requested timezone (YYYY-MM-DD). */ date: string; /** * Time of the crossing in the requested timezone (HH:MM). */ time: string; /** * Combined crossing timestamp in the requested timezone. */ datetime: string; /** * Tropical ecliptic longitude of the body at the crossing, in degrees. This is the only value in the response that depends on the zodiac frame. */ longitude: number; /** * Tropical sign the body occupies at the crossing. Canonical English. */ sign: string; /** * Sign in the requested language. Present only when lang is supplied. */ signLocalized?: string; }>; }; }; export type GetPlanetaryNodePassagesResponse = GetPlanetaryNodePassagesResponses[keyof GetPlanetaryNodePassagesResponses]; export type GenerateSolarReturnData = { body?: { /** * Original birth date in YYYY-MM-DD format. Used to determine natal Sun longitude for the solar return calculation. */ birthDate: string; /** * Original birth time in 24-hour HH:MM:SS format. Determines exact natal Sun position for annual return timing. */ birthTime: string; /** * Year for which to cast the solar return chart. The chart is erected for the exact moment the transiting Sun conjuncts the natal Sun longitude in this year. */ returnYear: number; /** * Latitude of the solar return location in decimal degrees (-90 to 90). Use current residence or travel location at time of birthday. Solar return charts are location-sensitive. */ latitude: number; /** * Longitude of the solar return location in decimal degrees (-180 to 180). Affects house cusps and Ascendant of the return chart. */ longitude: number; /** * Decimal hours from UTC OR IANA name (e.g. "America/New_York"). IANA resolved to the DST-correct offset for the birthDate. Output datetime is adjusted to this timezone. */ timezone: number | string; /** * House system for the solar return chart. Placidus (default) is most common in Western astrology. Whole Sign, Equal, and Koch also supported. */ houseSystem?: 'placidus' | 'whole-sign' | 'equal' | 'koch'; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/astrology/solar-return'; }; export type GenerateSolarReturnErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GenerateSolarReturnError = GenerateSolarReturnErrors[keyof GenerateSolarReturnErrors]; export type GenerateSolarReturnResponses = { /** * Solar return chart calculated successfully */ 200: { /** * Original birth date used for natal Sun longitude calculation. */ birthDate: string; /** * Exact solar return moment, when the transiting Sun conjuncts the natal Sun longitude. Adjusted to requested timezone. This is your astrological birthday for the year. */ solarReturnDate: string; /** * Year of this solar return chart. Covers the period from this birthday to the next. */ solarReturnYear: number; /** * Location used for the solar return chart. The Ascendant and house cusps change based on where you are at your birthday, a key technique in relocated solar returns. */ location: { /** * Observer latitude used for Placidus house cusp and Ascendant calculation in the solar return chart. */ latitude: number; /** * Observer longitude used for local sidereal time and Midheaven calculation in the solar return chart. */ longitude: number; /** * Timezone offset from UTC applied to output datetime formatting. */ timezone: number; }; /** * Full natal-style chart erected for the solar return moment. Contains all 14 celestial bodies (10 classical planets, lunar nodes, Chiron, Black Moon Lilith), 12 house cusps, aspects, Ascendant, and Midheaven in the tropical zodiac. */ chart: { /** * Birth details used to generate this chart. */ birthDetails: { /** * Birth date in YYYY-MM-DD format. Determines planetary positions for the specific calendar day. */ date: string; /** * Birth time in 24-hour HH:MM:SS format. Determines the Ascendant (rising sign) and house cusps. Use 12:00:00 if unknown. */ time: string; /** * Birth location latitude in decimal degrees (-90 to 90). Positive = North, negative = South. */ latitude: number; /** * Birth location longitude in decimal degrees (-180 to 180). Positive = East, negative = West. */ longitude: number; /** * Timezone offset from UTC in decimal hours. Examples: New York = -5, London = 0, India = 5.5, Tokyo = 9. */ timezone: number; }; /** * All 14 celestial bodies in the tropical zodiac with house placements: the 10 classical planets (Sun through Pluto), the lunar nodes (North Node, South Node, in the requested `nodeType` convention), Chiron, and Black Moon Lilith. */ planets: Array<{ /** * Body name. One of the 10 classical planets (Sun, Moon, Mercury, Venus, Mars, Jupiter, Saturn, Uranus, Neptune, Pluto), the lunar nodes (North Node, South Node), Chiron, or Black Moon Lilith (the mean lunar apogee). The lunar nodes follow the request nodeType, which defaults to the true (osculating) node; pass "mean" for the smoothed node. The two differ by up to about 1.8 degrees and no other body is affected. */ name: 'Sun' | 'Moon' | 'Mercury' | 'Venus' | 'Mars' | 'Jupiter' | 'Saturn' | 'Uranus' | 'Neptune' | 'Pluto' | 'North Node' | 'South Node' | 'Chiron' | 'Black Moon Lilith'; /** * Apparent geocentric tropical longitude on the true ecliptic of date, in degrees (0-360): light time and aberration applied, nutation included, the convention desktop chart software and the NASA JPL Horizons observer tables print, so it compares directly with either. Primary coordinate for zodiac sign and aspect calculations. */ longitude: number; /** * Apparent geocentric ecliptic latitude of date, in degrees. Near zero for most planets, varies for the Moon and Pluto, and reaches up to about 5 degrees for Black Moon Lilith (projected from the inclined mean lunar orbit). */ latitude: number; /** * Tropical zodiac sign this planet occupies. Determined by 30-degree divisions of ecliptic longitude. */ sign: string; /** * Degree within the zodiac sign (0-29.999). Indicates how far the planet has progressed through the sign. */ degree: number; /** * House placement (1-12). Determined by the selected house system and birth location. */ house: number; /** * Daily motion in degrees per day. Negative values indicate retrograde motion. */ speed: number; /** * Whether the planet appears to move backward from Earth perspective. Retrograde periods signal review and introspection. */ isRetrograde: boolean; }>; /** * All 12 house cusps calculated using the selected house system. */ houses: Array<{ /** * House number (1-12). Each house governs specific life themes in Western astrology. */ number: number; /** * Ecliptic longitude of this house cusp in degrees (0-360). */ longitude: number; /** * Zodiac sign on this house cusp. Colors the themes of this life area. */ sign: string; /** * Degree within the zodiac sign on this cusp (0-29.999). */ degree: number; }>; /** * House system used for this chart (placidus, whole-sign, equal, or koch). */ houseSystem: 'placidus' | 'whole-sign' | 'equal' | 'koch'; /** * All planetary aspects found in this chart with orbs, strength, and applying/separating status. */ aspects: Array<{ /** * First planet in the aspect pair. */ planet1: 'Sun' | 'Moon' | 'Mercury' | 'Venus' | 'Mars' | 'Jupiter' | 'Saturn' | 'Uranus' | 'Neptune' | 'Pluto' | 'North Node' | 'South Node' | 'Chiron' | 'Black Moon Lilith'; /** * Second planet in the aspect pair. */ planet2: 'Sun' | 'Moon' | 'Mercury' | 'Venus' | 'Mars' | 'Jupiter' | 'Saturn' | 'Uranus' | 'Neptune' | 'Pluto' | 'North Node' | 'South Node' | 'Chiron' | 'Black Moon Lilith'; /** * Aspect type. Major: conjunction (0), opposition (180), trine (120), square (90), sextile (60). Minor: semi-sextile, quincunx, semi-square, sesquiquadrate. */ type: 'CONJUNCTION' | 'OPPOSITION' | 'TRINE' | 'SQUARE' | 'SEXTILE' | 'SEMI_SEXTILE' | 'QUINCUNX' | 'SEMI_SQUARE' | 'SESQUIQUADRATE'; /** * Exact angular separation that defines this aspect type in degrees. */ angle: number; /** * Deviation from exact aspect in degrees. Tighter orb means stronger influence. */ orb: number; /** * Whether the aspect is applying (planets moving toward exact) or separating (moving apart). Applying aspects grow stronger. */ isApplying: boolean; /** * Aspect strength percentage (0-100). Based on orb tightness relative to the allowed maximum. */ strength: number; /** * Aspect nature. Harmonious (trine, sextile) flows easily. Challenging (square, opposition) creates tension and growth. Neutral (conjunction) blends energies. Always English, whatever the lang parameter says: it is an identifier consumers switch and style on. Use interpretationLocalized for anything a reader sees. */ interpretation: 'harmonious' | 'challenging' | 'neutral'; }>; /** * Part of Fortune (Lot of Fortune). A point derived from the Ascendant and the two luminaries that marks an area of ease, vitality, and material wellbeing in the chart. */ partOfFortune: { /** * Zodiac sign holding the Part of Fortune. */ sign: string; /** * Degree within the Part of Fortune sign (0-29.999). */ degree: number; /** * Absolute ecliptic longitude of the Part of Fortune (0-360). */ longitude: number; /** * House containing this point, resolved against the same cusps as `planets[].house` and using the requested house system. Read this field rather than inferring a house from the sign: the two disagree whenever a house spans more than one sign, which is most of the time outside Whole Sign. */ house: number; /** * Chart sect used for the calculation. Day (diurnal) when the Sun is above the horizon, night (nocturnal) when below. Day charts use Ascendant plus Moon minus Sun, night charts use Ascendant plus Sun minus Moon. */ sect: 'day' | 'night'; }; /** * Vertex. The western intersection of the prime vertical with the ecliptic, often read as a point of fated encounters and turning-point relationships. The opposite point is the Anti-Vertex. */ vertex: { /** * Zodiac sign holding the Vertex. */ sign: string; /** * Degree within the Vertex sign (0-29.999). */ degree: number; /** * Absolute ecliptic longitude of the Vertex (0-360). */ longitude: number; /** * House containing this point, resolved against the same cusps as `planets[].house` and using the requested house system. Read this field rather than inferring a house from the sign: the two disagree whenever a house spans more than one sign, which is most of the time outside Whole Sign. */ house: number; }; }; /** * Original natal Sun position that the transiting Sun returns to. This conjunction defines the solar return moment. */ natalSunPosition: { /** * Natal Sun ecliptic longitude in degrees (0-360). The transiting Sun returns to this exact degree each year. */ longitude: number; /** * Tropical zodiac sign of the natal Sun (your Sun sign). */ sign: string; /** * Degree within the zodiac sign (0-29.999). The precise position the Sun returns to. */ degree: number; }; /** * Solar return interpretation with annual forecast themes. Solar returns are the primary technique in Western astrology for year-ahead predictions. */ interpretation: { /** * Narrative overview of the solar return year themes and energy. */ summary: string; /** * Explanation of how to use solar return charts for annual forecasting, identifying yearly themes, and timing predictions. */ purpose: string; /** * Key life areas and themes highlighted by this solar return chart. Focus on these for the birthday year. */ keyThemes: Array; }; }; }; export type GenerateSolarReturnResponse = GenerateSolarReturnResponses[keyof GenerateSolarReturnResponses]; export type GenerateLunarReturnData = { body?: { /** * Original birth date in YYYY-MM-DD format. Used to determine natal Moon longitude for the lunar return calculation. */ birthDate: string; /** * Original birth time in 24-hour HH:MM:SS format. Determines exact natal Moon position for monthly return timing. */ birthTime: string; /** * Approximate date near the desired lunar return (YYYY-MM-DD). The Moon returns to its natal position every ~27.3 days, so provide a date within a few days of the expected return. */ returnDate: string; /** * Latitude of the lunar return location in decimal degrees (-90 to 90). Affects the Ascendant and house cusps of the return chart. */ latitude: number; /** * Longitude of the lunar return location in decimal degrees (-180 to 180). Determines local sidereal time for house calculations. */ longitude: number; /** * Decimal hours from UTC OR IANA name (e.g. "America/New_York"). IANA resolved to the DST-correct offset for the birthDate. Output datetime is adjusted to this timezone. */ timezone: number | string; /** * House system for the lunar return chart. Placidus (default), Whole Sign, Equal, or Koch. */ houseSystem?: 'placidus' | 'whole-sign' | 'equal' | 'koch'; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/astrology/lunar-return'; }; export type GenerateLunarReturnErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GenerateLunarReturnError = GenerateLunarReturnErrors[keyof GenerateLunarReturnErrors]; export type GenerateLunarReturnResponses = { /** * Lunar return chart calculated successfully */ 200: { /** * Original birth date used for natal Moon longitude calculation. */ birthDate: string; /** * Exact lunar return moment, when the transiting Moon conjuncts the natal Moon longitude. Adjusted to requested timezone. Occurs approximately every 27.3 days (one sidereal month). */ lunarReturnDate: string; /** * Location used for the lunar return chart house and Ascendant calculations. */ location: { /** * Observer latitude used for house cusp calculation in the lunar return chart. */ latitude: number; /** * Observer longitude used for local sidereal time and Midheaven in the return chart. */ longitude: number; /** * Timezone offset from UTC applied to output datetime formatting. */ timezone: number; }; /** * Full tropical zodiac chart erected for the lunar return moment. Contains planetary positions, house cusps, aspects, Ascendant, and Midheaven. */ chart: { /** * Birth details used to generate this chart. */ birthDetails: { /** * Birth date in YYYY-MM-DD format. Determines planetary positions for the specific calendar day. */ date: string; /** * Birth time in 24-hour HH:MM:SS format. Determines the Ascendant (rising sign) and house cusps. Use 12:00:00 if unknown. */ time: string; /** * Birth location latitude in decimal degrees (-90 to 90). Positive = North, negative = South. */ latitude: number; /** * Birth location longitude in decimal degrees (-180 to 180). Positive = East, negative = West. */ longitude: number; /** * Timezone offset from UTC in decimal hours. Examples: New York = -5, London = 0, India = 5.5, Tokyo = 9. */ timezone: number; }; /** * All 14 celestial bodies in the tropical zodiac with house placements: the 10 classical planets (Sun through Pluto), the lunar nodes (North Node, South Node, in the requested `nodeType` convention), Chiron, and Black Moon Lilith. */ planets: Array<{ /** * Body name. One of the 10 classical planets (Sun, Moon, Mercury, Venus, Mars, Jupiter, Saturn, Uranus, Neptune, Pluto), the lunar nodes (North Node, South Node), Chiron, or Black Moon Lilith (the mean lunar apogee). The lunar nodes follow the request nodeType, which defaults to the true (osculating) node; pass "mean" for the smoothed node. The two differ by up to about 1.8 degrees and no other body is affected. */ name: 'Sun' | 'Moon' | 'Mercury' | 'Venus' | 'Mars' | 'Jupiter' | 'Saturn' | 'Uranus' | 'Neptune' | 'Pluto' | 'North Node' | 'South Node' | 'Chiron' | 'Black Moon Lilith'; /** * Apparent geocentric tropical longitude on the true ecliptic of date, in degrees (0-360): light time and aberration applied, nutation included, the convention desktop chart software and the NASA JPL Horizons observer tables print, so it compares directly with either. Primary coordinate for zodiac sign and aspect calculations. */ longitude: number; /** * Apparent geocentric ecliptic latitude of date, in degrees. Near zero for most planets, varies for the Moon and Pluto, and reaches up to about 5 degrees for Black Moon Lilith (projected from the inclined mean lunar orbit). */ latitude: number; /** * Tropical zodiac sign this planet occupies. Determined by 30-degree divisions of ecliptic longitude. */ sign: string; /** * Degree within the zodiac sign (0-29.999). Indicates how far the planet has progressed through the sign. */ degree: number; /** * House placement (1-12). Determined by the selected house system and birth location. */ house: number; /** * Daily motion in degrees per day. Negative values indicate retrograde motion. */ speed: number; /** * Whether the planet appears to move backward from Earth perspective. Retrograde periods signal review and introspection. */ isRetrograde: boolean; }>; /** * All 12 house cusps calculated using the selected house system. */ houses: Array<{ /** * House number (1-12). Each house governs specific life themes in Western astrology. */ number: number; /** * Ecliptic longitude of this house cusp in degrees (0-360). */ longitude: number; /** * Zodiac sign on this house cusp. Colors the themes of this life area. */ sign: string; /** * Degree within the zodiac sign on this cusp (0-29.999). */ degree: number; }>; /** * House system used for this chart (placidus, whole-sign, equal, or koch). */ houseSystem: 'placidus' | 'whole-sign' | 'equal' | 'koch'; /** * All planetary aspects found in this chart with orbs, strength, and applying/separating status. */ aspects: Array<{ /** * First planet in the aspect pair. */ planet1: 'Sun' | 'Moon' | 'Mercury' | 'Venus' | 'Mars' | 'Jupiter' | 'Saturn' | 'Uranus' | 'Neptune' | 'Pluto' | 'North Node' | 'South Node' | 'Chiron' | 'Black Moon Lilith'; /** * Second planet in the aspect pair. */ planet2: 'Sun' | 'Moon' | 'Mercury' | 'Venus' | 'Mars' | 'Jupiter' | 'Saturn' | 'Uranus' | 'Neptune' | 'Pluto' | 'North Node' | 'South Node' | 'Chiron' | 'Black Moon Lilith'; /** * Aspect type. Major: conjunction (0), opposition (180), trine (120), square (90), sextile (60). Minor: semi-sextile, quincunx, semi-square, sesquiquadrate. */ type: 'CONJUNCTION' | 'OPPOSITION' | 'TRINE' | 'SQUARE' | 'SEXTILE' | 'SEMI_SEXTILE' | 'QUINCUNX' | 'SEMI_SQUARE' | 'SESQUIQUADRATE'; /** * Exact angular separation that defines this aspect type in degrees. */ angle: number; /** * Deviation from exact aspect in degrees. Tighter orb means stronger influence. */ orb: number; /** * Whether the aspect is applying (planets moving toward exact) or separating (moving apart). Applying aspects grow stronger. */ isApplying: boolean; /** * Aspect strength percentage (0-100). Based on orb tightness relative to the allowed maximum. */ strength: number; /** * Aspect nature. Harmonious (trine, sextile) flows easily. Challenging (square, opposition) creates tension and growth. Neutral (conjunction) blends energies. Always English, whatever the lang parameter says: it is an identifier consumers switch and style on. Use interpretationLocalized for anything a reader sees. */ interpretation: 'harmonious' | 'challenging' | 'neutral'; }>; /** * Part of Fortune (Lot of Fortune). A point derived from the Ascendant and the two luminaries that marks an area of ease, vitality, and material wellbeing in the chart. */ partOfFortune: { /** * Zodiac sign holding the Part of Fortune. */ sign: string; /** * Degree within the Part of Fortune sign (0-29.999). */ degree: number; /** * Absolute ecliptic longitude of the Part of Fortune (0-360). */ longitude: number; /** * House containing this point, resolved against the same cusps as `planets[].house` and using the requested house system. Read this field rather than inferring a house from the sign: the two disagree whenever a house spans more than one sign, which is most of the time outside Whole Sign. */ house: number; /** * Chart sect used for the calculation. Day (diurnal) when the Sun is above the horizon, night (nocturnal) when below. Day charts use Ascendant plus Moon minus Sun, night charts use Ascendant plus Sun minus Moon. */ sect: 'day' | 'night'; }; /** * Vertex. The western intersection of the prime vertical with the ecliptic, often read as a point of fated encounters and turning-point relationships. The opposite point is the Anti-Vertex. */ vertex: { /** * Zodiac sign holding the Vertex. */ sign: string; /** * Degree within the Vertex sign (0-29.999). */ degree: number; /** * Absolute ecliptic longitude of the Vertex (0-360). */ longitude: number; /** * House containing this point, resolved against the same cusps as `planets[].house` and using the requested house system. Read this field rather than inferring a house from the sign: the two disagree whenever a house spans more than one sign, which is most of the time outside Whole Sign. */ house: number; }; }; /** * Original natal Moon position that the transiting Moon returns to. This conjunction defines the lunar return moment. */ natalMoonPosition: { /** * Natal Moon ecliptic longitude in degrees (0-360). The transiting Moon returns to this position each month. */ longitude: number; /** * Tropical zodiac sign of the natal Moon. */ sign: string; /** * Degree within the zodiac sign (0-29.999). */ degree: number; }; /** * Lunar return interpretation with monthly forecast. Lunar returns reveal emotional patterns, domestic focus, and intuitive themes for the upcoming ~27-day cycle. */ interpretation: { /** * Narrative overview of the monthly emotional themes and lunar cycle focus areas. */ summary: string; /** * Explanation of how to use lunar return charts for monthly emotional forecasting and self-care planning. */ purpose: string; /** * Key emotional patterns, domestic themes, and self-care priorities for this lunar month. */ keyThemes: Array; }; }; }; export type GenerateLunarReturnResponse = GenerateLunarReturnResponses[keyof GenerateLunarReturnResponses]; export type GenerateCompositeChartData = { body?: { /** * First person birth details (date, time, location, timezone). */ person1: { /** * Birth date in YYYY-MM-DD format. Determines planetary positions for the specific calendar day. */ date: string; /** * Birth time in 24-hour HH:MM:SS format. Determines the Ascendant (rising sign) and house cusps. Use 12:00:00 if unknown. */ time: string; /** * Birth location latitude in decimal degrees (-90 to 90). Positive = North, negative = South. */ latitude: number; /** * Birth location longitude in decimal degrees (-180 to 180). Positive = East, negative = West. */ longitude: number; /** * Timezone: IANA name (e.g. "America/New_York", "Europe/London") OR decimal hours from UTC (e.g. -5 for EST, 1 for CET). IANA strings are resolved to the offset in force at the given date and time, so you can pass `cities[0].timezone` from /location/search directly. */ timezone: number | string; /** * Lunar node convention. "mean" is the smoothed average node, which always moves retrograde; "true" is the osculating node, which tracks the real perturbed node, oscillates up to about 1.5 degrees either side of the mean on a 173-day cycle, and can briefly turn direct. Neither is more correct and they almost always fall in the same sign. Applies to the North and South Node. True is the osculating node and the default, because it is what most Western chart software reports; mean is the smoothed node preferred by several evolutionary schools, so pass "mean" to match one. Nothing else in the chart changes, and the two agree on the sign except when the node sits within about 1.8 degrees of a cusp. Defaults to "true". */ nodeType?: 'mean' | 'true'; }; /** * Second person birth details (date, time, location, timezone). */ person2: { /** * Birth date in YYYY-MM-DD format. Determines planetary positions for the specific calendar day. */ date: string; /** * Birth time in 24-hour HH:MM:SS format. Determines the Ascendant (rising sign) and house cusps. Use 12:00:00 if unknown. */ time: string; /** * Birth location latitude in decimal degrees (-90 to 90). Positive = North, negative = South. */ latitude: number; /** * Birth location longitude in decimal degrees (-180 to 180). Positive = East, negative = West. */ longitude: number; /** * Timezone: IANA name (e.g. "America/New_York", "Europe/London") OR decimal hours from UTC (e.g. -5 for EST, 1 for CET). IANA strings are resolved to the offset in force at the given date and time, so you can pass `cities[0].timezone` from /location/search directly. */ timezone: number | string; /** * Lunar node convention. "mean" is the smoothed average node, which always moves retrograde; "true" is the osculating node, which tracks the real perturbed node, oscillates up to about 1.5 degrees either side of the mean on a 173-day cycle, and can briefly turn direct. Neither is more correct and they almost always fall in the same sign. Applies to the North and South Node. True is the osculating node and the default, because it is what most Western chart software reports; mean is the smoothed node preferred by several evolutionary schools, so pass "mean" to match one. Nothing else in the chart changes, and the two agree on the sign except when the node sits within about 1.8 degrees of a cusp. Defaults to "true". */ nodeType?: 'mean' | 'true'; }; /** * House system for the composite chart. Placidus (default), Whole Sign, Equal, or Koch. */ houseSystem?: 'placidus' | 'whole-sign' | 'equal' | 'koch'; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/astrology/composite-chart'; }; export type GenerateCompositeChartErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GenerateCompositeChartError = GenerateCompositeChartErrors[keyof GenerateCompositeChartErrors]; export type GenerateCompositeChartResponses = { /** * Composite chart calculated successfully */ 200: { /** * First person birth details. */ person1: { /** * Birth date in YYYY-MM-DD format. Determines planetary positions for the specific calendar day. */ date: string; /** * Birth time in 24-hour HH:MM:SS format. Determines the Ascendant (rising sign) and house cusps. Use 12:00:00 if unknown. */ time: string; /** * Birth location latitude in decimal degrees (-90 to 90). Positive = North, negative = South. */ latitude: number; /** * Birth location longitude in decimal degrees (-180 to 180). Positive = East, negative = West. */ longitude: number; /** * Timezone offset from UTC in decimal hours. Examples: New York = -5, London = 0, India = 5.5, Tokyo = 9. */ timezone: number; }; /** * Second person birth details. */ person2: { /** * Birth date in YYYY-MM-DD format. Determines planetary positions for the specific calendar day. */ date: string; /** * Birth time in 24-hour HH:MM:SS format. Determines the Ascendant (rising sign) and house cusps. Use 12:00:00 if unknown. */ time: string; /** * Birth location latitude in decimal degrees (-90 to 90). Positive = North, negative = South. */ latitude: number; /** * Birth location longitude in decimal degrees (-180 to 180). Positive = East, negative = West. */ longitude: number; /** * Timezone offset from UTC in decimal hours. Examples: New York = -5, London = 0, India = 5.5, Tokyo = 9. */ timezone: number; }; /** * Composite planetary positions calculated as midpoints between both charts. Each planet represents a shared energy in the relationship. */ compositePlanets: Array<{ /** * Body name. One of the 10 classical planets (Sun, Moon, Mercury, Venus, Mars, Jupiter, Saturn, Uranus, Neptune, Pluto), the lunar nodes (North Node, South Node), Chiron, or Black Moon Lilith (the mean lunar apogee). The lunar nodes follow the request nodeType, which defaults to the true (osculating) node; pass "mean" for the smoothed node. The two differ by up to about 1.8 degrees and no other body is affected. */ name: 'Sun' | 'Moon' | 'Mercury' | 'Venus' | 'Mars' | 'Jupiter' | 'Saturn' | 'Uranus' | 'Neptune' | 'Pluto' | 'North Node' | 'South Node' | 'Chiron' | 'Black Moon Lilith'; /** * Apparent geocentric tropical longitude on the true ecliptic of date, in degrees (0-360): light time and aberration applied, nutation included, the convention desktop chart software and the NASA JPL Horizons observer tables print, so it compares directly with either. Primary coordinate for zodiac sign and aspect calculations. */ longitude: number; /** * Apparent geocentric ecliptic latitude of date, in degrees. Near zero for most planets, varies for the Moon and Pluto, and reaches up to about 5 degrees for Black Moon Lilith (projected from the inclined mean lunar orbit). */ latitude: number; /** * Tropical zodiac sign this planet occupies. Determined by 30-degree divisions of ecliptic longitude. */ sign: string; /** * Degree within the zodiac sign (0-29.999). Indicates how far the planet has progressed through the sign. */ degree: number; /** * House placement (1-12). Determined by the selected house system and birth location. */ house: number; /** * Daily motion in degrees per day. Negative values indicate retrograde motion. */ speed: number; /** * Whether the planet appears to move backward from Earth perspective. Retrograde periods signal review and introspection. */ isRetrograde: boolean; /** * Composite interpretation for this planet in the relationship chart. */ compositeInterpretation?: { /** * Narrative interpretation of this composite planet placement. */ summary: string; /** * What this planet represents in the context of the relationship. */ relationshipMeaning: string; /** * Key themes associated with this composite placement. */ keywords: Array; }; }>; /** * Composite house cusps, each the midpoint of the two natal cusps. Each house represents shared life areas in the relationship. */ compositeHouses: Array<{ /** * House number (1-12) in the composite chart. */ number: number; /** * Zodiac sign on the composite house cusp. */ sign: string; /** * Degree within the zodiac sign (0-29.999). */ degree: number; /** * Absolute ecliptic longitude in degrees (0-360). */ longitude: number; }>; /** * Composite Ascendant. Represents how the relationship presents itself to the outside world. */ compositeAscendant: { /** * Zodiac sign on the composite Ascendant. */ sign: string; /** * Degree within the sign (0-29.999). */ degree: number; /** * Absolute ecliptic longitude in degrees (0-360). */ longitude: number; }; /** * Composite Midheaven (MC). Represents shared goals, public image, and the direction the relationship grows toward. */ compositeMidheaven: { /** * Zodiac sign on the composite Midheaven. */ sign: string; /** * Degree within the sign (0-29.999). */ degree: number; /** * Absolute ecliptic longitude in degrees (0-360). */ longitude: number; }; /** * Aspects between composite planets. Reveals the internal dynamics and energy patterns within the relationship. */ aspects: Array<{ /** * First planet in the aspect pair. */ planet1: 'Sun' | 'Moon' | 'Mercury' | 'Venus' | 'Mars' | 'Jupiter' | 'Saturn' | 'Uranus' | 'Neptune' | 'Pluto' | 'North Node' | 'South Node' | 'Chiron' | 'Black Moon Lilith'; /** * Second planet in the aspect pair. */ planet2: 'Sun' | 'Moon' | 'Mercury' | 'Venus' | 'Mars' | 'Jupiter' | 'Saturn' | 'Uranus' | 'Neptune' | 'Pluto' | 'North Node' | 'South Node' | 'Chiron' | 'Black Moon Lilith'; /** * Aspect type. Major: conjunction (0), opposition (180), trine (120), square (90), sextile (60). Minor: semi-sextile, quincunx, semi-square, sesquiquadrate. */ type: 'CONJUNCTION' | 'OPPOSITION' | 'TRINE' | 'SQUARE' | 'SEXTILE' | 'SEMI_SEXTILE' | 'QUINCUNX' | 'SEMI_SQUARE' | 'SESQUIQUADRATE'; /** * Exact angular separation that defines this aspect type in degrees. */ angle: number; /** * Deviation from exact aspect in degrees. Tighter orb means stronger influence. */ orb: number; /** * Whether the aspect is applying (planets moving toward exact) or separating (moving apart). Applying aspects grow stronger. */ isApplying: boolean; /** * Aspect strength percentage (0-100). Based on orb tightness relative to the allowed maximum. */ strength: number; /** * Aspect nature. Harmonious (trine, sextile) flows easily. Challenging (square, opposition) creates tension and growth. Neutral (conjunction) blends energies. Always English, whatever the lang parameter says: it is an identifier consumers switch and style on. Use interpretationLocalized for anything a reader sees. */ interpretation: 'harmonious' | 'challenging' | 'neutral'; }>; /** * Composite chart interpretation with relationship strengths, challenges, and overall assessment. */ interpretation: { /** * Overall relationship interpretation based on composite chart analysis. */ summary: string; /** * Areas where the relationship naturally thrives. */ strengths: Array; /** * Potential friction points and growth opportunities in the relationship. */ challenges: Array; }; }; }; export type GenerateCompositeChartResponse = GenerateCompositeChartResponses[keyof GenerateCompositeChartResponses]; export type CalculateCompatibilityData = { body?: { /** * First person birth details (date, time, location, timezone). Required for calculating natal planetary positions. */ person1: { /** * Birth date in YYYY-MM-DD format. Determines planetary positions for the specific calendar day. */ date: string; /** * Birth time in 24-hour HH:MM:SS format. Determines the Ascendant (rising sign) and house cusps. Use 12:00:00 if unknown. */ time: string; /** * Birth location latitude in decimal degrees (-90 to 90). Positive = North, negative = South. */ latitude: number; /** * Birth location longitude in decimal degrees (-180 to 180). Positive = East, negative = West. */ longitude: number; /** * Timezone: IANA name (e.g. "America/New_York", "Europe/London") OR decimal hours from UTC (e.g. -5 for EST, 1 for CET). IANA strings are resolved to the offset in force at the given date and time, so you can pass `cities[0].timezone` from /location/search directly. */ timezone: number | string; /** * Lunar node convention. "mean" is the smoothed average node, which always moves retrograde; "true" is the osculating node, which tracks the real perturbed node, oscillates up to about 1.5 degrees either side of the mean on a 173-day cycle, and can briefly turn direct. Neither is more correct and they almost always fall in the same sign. Applies to the North and South Node. True is the osculating node and the default, because it is what most Western chart software reports; mean is the smoothed node preferred by several evolutionary schools, so pass "mean" to match one. Nothing else in the chart changes, and the two agree on the sign except when the node sits within about 1.8 degrees of a cusp. Defaults to "true". */ nodeType?: 'mean' | 'true'; }; /** * Second person birth details. Compared against person1 to evaluate inter-chart aspects and compatibility. */ person2: { /** * Birth date in YYYY-MM-DD format. Determines planetary positions for the specific calendar day. */ date: string; /** * Birth time in 24-hour HH:MM:SS format. Determines the Ascendant (rising sign) and house cusps. Use 12:00:00 if unknown. */ time: string; /** * Birth location latitude in decimal degrees (-90 to 90). Positive = North, negative = South. */ latitude: number; /** * Birth location longitude in decimal degrees (-180 to 180). Positive = East, negative = West. */ longitude: number; /** * Timezone: IANA name (e.g. "America/New_York", "Europe/London") OR decimal hours from UTC (e.g. -5 for EST, 1 for CET). IANA strings are resolved to the offset in force at the given date and time, so you can pass `cities[0].timezone` from /location/search directly. */ timezone: number | string; /** * Lunar node convention. "mean" is the smoothed average node, which always moves retrograde; "true" is the osculating node, which tracks the real perturbed node, oscillates up to about 1.5 degrees either side of the mean on a 173-day cycle, and can briefly turn direct. Neither is more correct and they almost always fall in the same sign. Applies to the North and South Node. True is the osculating node and the default, because it is what most Western chart software reports; mean is the smoothed node preferred by several evolutionary schools, so pass "mean" to match one. Nothing else in the chart changes, and the two agree on the sign except when the node sits within about 1.8 degrees of a cusp. Defaults to "true". */ nodeType?: 'mean' | 'true'; }; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/astrology/compatibility-score'; }; export type CalculateCompatibilityErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type CalculateCompatibilityError = CalculateCompatibilityErrors[keyof CalculateCompatibilityErrors]; export type CalculateCompatibilityResponses = { /** * Compatibility score calculated successfully */ 200: { /** * Overall compatibility score (0-100). Weighted average across romantic, emotional, intellectual, physical, and spiritual categories. */ overallScore: number; /** * Compatibility breakdown by life area. Each category evaluates specific planetary pair interactions that govern that domain. */ categories: { /** * Romantic compatibility score based on Sun-Moon, Venus-Mars, and Sun-Venus inter-aspects. */ romantic: number; /** * Emotional compatibility score based on Moon-Moon and Moon-Venus inter-aspects. */ emotional: number; /** * Intellectual compatibility score based on Mercury-Mercury and Sun-Mercury inter-aspects. */ intellectual: number; /** * Physical compatibility score based on Mars-Mars and Mars-Sun inter-aspects. */ physical: number; /** * Spiritual compatibility score based on Jupiter-Sun and Jupiter-Jupiter inter-aspects. */ spiritual: number; }; /** * Summary of key planetary positions for both people. Includes the four planets most relevant to relationship compatibility. */ persons: { /** * Key planet positions for person 1. Sun, Moon, Venus, and Mars sign placements. */ person1: { /** * Sun sign position. Core identity and ego. */ sun: { /** * Zodiac sign this planet occupies in the tropical zodiac. */ sign: string; /** * Degree within the zodiac sign (0-29.999). */ degree: number; }; /** * Moon sign position. Emotional nature and instincts. */ moon: { /** * Zodiac sign this planet occupies in the tropical zodiac. */ sign: string; /** * Degree within the zodiac sign (0-29.999). */ degree: number; }; /** * Venus sign position. Love language and relationship style. */ venus: { /** * Zodiac sign this planet occupies in the tropical zodiac. */ sign: string; /** * Degree within the zodiac sign (0-29.999). */ degree: number; }; /** * Mars sign position. Passion, desire, and conflict style. */ mars: { /** * Zodiac sign this planet occupies in the tropical zodiac. */ sign: string; /** * Degree within the zodiac sign (0-29.999). */ degree: number; }; }; /** * Key planet positions for person 2. Sun, Moon, Venus, and Mars sign placements. */ person2: { /** * Sun sign position. Core identity and ego. */ sun: { /** * Zodiac sign this planet occupies in the tropical zodiac. */ sign: string; /** * Degree within the zodiac sign (0-29.999). */ degree: number; }; /** * Moon sign position. Emotional nature and instincts. */ moon: { /** * Zodiac sign this planet occupies in the tropical zodiac. */ sign: string; /** * Degree within the zodiac sign (0-29.999). */ degree: number; }; /** * Venus sign position. Love language and relationship style. */ venus: { /** * Zodiac sign this planet occupies in the tropical zodiac. */ sign: string; /** * Degree within the zodiac sign (0-29.999). */ degree: number; }; /** * Mars sign position. Passion, desire, and conflict style. */ mars: { /** * Zodiac sign this planet occupies in the tropical zodiac. */ sign: string; /** * Degree within the zodiac sign (0-29.999). */ degree: number; }; }; }; /** * Sign-by-sign compatibility analysis for the four key relationship planets. Each entry describes how the two signs interact through that planetary lens. */ signCompatibility: { /** * Sun sign compatibility. Reveals core personality dynamic as a couple. */ sun: { /** * Person 1 sign for this planet. */ person1Sign: string; /** * Person 2 sign for this planet. */ person2Sign: string; /** * Narrative analysis of how these two signs interact through this planet. */ description: string; }; /** * Moon sign compatibility. Reveals how you process emotions and nurture each other. */ moon: { /** * Person 1 sign for this planet. */ person1Sign: string; /** * Person 2 sign for this planet. */ person2Sign: string; /** * Narrative analysis of how these two signs interact through this planet. */ description: string; }; /** * Venus sign compatibility. Reveals love languages and what you find beautiful together. */ venus: { /** * Person 1 sign for this planet. */ person1Sign: string; /** * Person 2 sign for this planet. */ person2Sign: string; /** * Narrative analysis of how these two signs interact through this planet. */ description: string; }; /** * Mars sign compatibility. Reveals how you handle passion, conflict, and desire. */ mars: { /** * Person 1 sign for this planet. */ person1Sign: string; /** * Person 2 sign for this planet. */ person2Sign: string; /** * Narrative analysis of how these two signs interact through this planet. */ description: string; }; }; /** * Elemental balance comparison. Shows how fire, earth, air, and water energy is distributed across both charts. */ elementBalance: { /** * Element distribution across person 1 natal planets. */ person1: { /** * Count of planets in fire signs (Aries, Leo, Sagittarius). */ fire: number; /** * Count of planets in earth signs (Taurus, Virgo, Capricorn). */ earth: number; /** * Count of planets in air signs (Gemini, Libra, Aquarius). */ air: number; /** * Count of planets in water signs (Cancer, Scorpio, Pisces). */ water: number; }; /** * Element distribution across person 2 natal planets. */ person2: { /** * Count of planets in fire signs (Aries, Leo, Sagittarius). */ fire: number; /** * Count of planets in earth signs (Taurus, Virgo, Capricorn). */ earth: number; /** * Count of planets in air signs (Gemini, Libra, Aquarius). */ air: number; /** * Count of planets in water signs (Cancer, Scorpio, Pisces). */ water: number; }; /** * Dominant element shared by both charts, or null if dominant elements differ. */ sharedElement: string | null; /** * How the elemental balance between charts shapes the relationship dynamic. */ description: string; }; /** * Relationship archetype based on score pattern, category strengths, and elemental balance. One of eight archetypes: Kindred Spirits, Opposites Attract, The Power Couple, The Nurturers, The Adventurers, Growth Partners, The Balancers, The Mystics. */ archetype: { /** * Relationship archetype label. A headline-friendly label for the dynamic. */ label: string; /** * Narrative description of the relationship archetype and what it means. */ description: string; }; /** * Top relationship strengths based on harmonious inter-chart aspects. Each includes the planet pair, aspect type, and relationship-specific interpretation. */ strengths: Array; /** * Potential friction points based on challenging inter-chart aspects. Each includes specific guidance for navigating the tension. */ challenges: Array; /** * Narrative overview of the relationship compatibility, highlighting the dominant themes. */ summary: string; /** * Detailed compatibility interpretation analyzing the synastry aspect patterns between both charts. */ interpretation: string; /** * Synastry aspect breakdown showing the balance of harmonious, challenging, and neutral inter-chart aspects. */ aspectBreakdown: { /** * Total number of inter-chart aspects found between the two natal charts. */ total: number; /** * Count of harmonious aspects (trine, sextile). These indicate natural ease and flow. */ harmonious: number; /** * Count of challenging aspects (square, opposition). These create dynamic tension and growth. */ challenging: number; /** * Count of neutral aspects (conjunction). Outcome depends on the planets involved. */ neutral: number; }; /** * The most significant inter-chart aspects involving personal planets (Sun through Saturn), sorted by strength. Each includes a relationship-specific interpretation. */ keyAspects: Array<{ /** * First planet in the aspect. */ planet1: string; /** * Second planet in the aspect. */ planet2: string; /** * Aspect type (conjunction, trine, square, etc.). */ type: string; /** * Deviation from exact aspect in degrees. Tighter orb = stronger influence. */ orb: number; /** * Aspect nature. Harmonious flows easily. Challenging creates growth-oriented tension. */ interpretation: 'harmonious' | 'challenging' | 'neutral'; /** * Relationship-specific interpretation of this aspect between the two charts. */ description: string; }>; }; }; export type CalculateCompatibilityResponse = CalculateCompatibilityResponses[keyof CalculateCompatibilityResponses]; export type GetDailyHoroscopeData = { body?: never; path: { /** * Zodiac sign, case-insensitive (e.g., aries, Aries, ARIES all work). */ sign: 'aries' | 'taurus' | 'gemini' | 'cancer' | 'leo' | 'virgo' | 'libra' | 'scorpio' | 'sagittarius' | 'capricorn' | 'aquarius' | 'pisces'; }; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; /** * Forecast date in YYYY-MM-DD format. Past and future dates are both supported, for editorial scheduling and backfill. Defaults to the current period in the timezone parameter. */ date?: string; /** * Selects which period counts as current when date is omitted. Defaults to UTC, so the forecast rolls over at 00:00 UTC on each day. Pass the timezone of the end user to roll over on their local clock instead. Ignored when date is set. Accepts an IANA name (e.g. "America/New_York"), decimal hours (e.g. 5.5 for IST), or a fixed UTC offset (e.g. "-05:00"). */ timezone?: string; }; url: '/astrology/horoscope/{sign}/daily'; }; export type GetDailyHoroscopeErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetDailyHoroscopeError = GetDailyHoroscopeErrors[keyof GetDailyHoroscopeErrors]; export type GetDailyHoroscopeResponses = { /** * Daily horoscope retrieved successfully */ 200: { /** * Zodiac sign for this horoscope. */ sign: string; /** * Date of this daily horoscope (YYYY-MM-DD). */ date: string; /** * The single most relevant event of the period, whichever life area it touches, read into the whole-sign houses of this sign. The same event that leads column, at lede length rather than developed into a full movement, and checkable against the events array. Typically 30 to 60 words. Join it with love, career, health and finance for a general reading built from the six sections. Deterministic: the same sign and period always returns the same text. */ overview: string; /** * Love and relationship forecast, read into the whole-sign houses of this sign. The same ranked events that drive column, filtered to romance and partnership, plus the standing placements that reach it. Every event named here is in the events array, so a piece can be fact-checked before it runs; this section reads an event through whichever of its houses carries romance and partnership, which for an aspect between two houses can be the other one from the house the events array leads with, and both are whole-sign houses of the bodies involved counted from this sign. Typically 50 to 90 words. Render it alone for a single-topic page, or alongside the other five sections for a general reading; column is the same material woven into one piece instead of split by topic. Deterministic: the same sign and period always returns the same text. */ love: string; /** * Career and professional outlook, read into the whole-sign houses of this sign. The same ranked events that drive column, filtered to career, work and reputation, plus the standing placements that reach it. Every event named here is in the events array, so a piece can be fact-checked before it runs; this section reads an event through whichever of its houses carries career, work and reputation, which for an aspect between two houses can be the other one from the house the events array leads with, and both are whole-sign houses of the bodies involved counted from this sign. Typically 50 to 90 words. Render it alone for a single-topic page, or alongside the other five sections for a general reading; column is the same material woven into one piece instead of split by topic. Deterministic: the same sign and period always returns the same text. */ career: string; /** * Health, energy, and wellness guidance, read into the whole-sign houses of this sign. The same ranked events that drive column, filtered to health, plus the standing placements that reach it. Every event named here is in the events array, so a piece can be fact-checked before it runs; this section reads an event through whichever of its houses carries health, which for an aspect between two houses can be the other one from the house the events array leads with, and both are whole-sign houses of the bodies involved counted from this sign. Typically 50 to 90 words. Render it alone for a single-topic page, or alongside the other five sections for a general reading; column is the same material woven into one piece instead of split by topic. Deterministic: the same sign and period always returns the same text. */ health: string; /** * Financial outlook and money-related guidance, read into the whole-sign houses of this sign. The same ranked events that drive column, filtered to finance, plus the standing placements that reach it. Every event named here is in the events array, so a piece can be fact-checked before it runs; this section reads an event through whichever of its houses carries finance, which for an aspect between two houses can be the other one from the house the events array leads with, and both are whole-sign houses of the bodies involved counted from this sign. Typically 50 to 90 words. Render it alone for a single-topic page, or alongside the other five sections for a general reading; column is the same material woven into one piece instead of split by topic. Deterministic: the same sign and period always returns the same text. */ finance: string; /** * The single actionable takeaway from the leading event of the period, read into the whole-sign houses of this sign and checkable against the events array. Drawn from the same event as overview, kept to a short, actionable pair of sentences rather than grown to match the other sections. Deterministic: the same sign and period always returns the same text. */ advice: string; /** * The full column for this period, ready to run as one piece, with paragraphs separated by a blank line. Names the events driving it and the dates they fall on, read into the whole-sign houses of this sign. Typically 120 to 180 words. The six section fields read the same ranked events filtered to their own life area, each composed as a column of its own rather than an excerpt of this one, so render either shape and never both. Deterministic: the same sign and period always returns the same column. */ column: string; /** * The dated astronomical events this reading is built on, earliest first. Every field in every row can be checked against an independent authority, so a column can be fact-checked before it is published. Empty on a period in which nothing exact happens, where the reading falls back to the standing positions instead. */ events: Array<{ /** * Kind of event. aspect is an exact angle between two moving bodies, sign-ingress a body entering a new sign, retrograde-station a body turning retrograde or direct, lunar-phase one of the four quarters, eclipse a solar or lunar eclipse, and solar-season the Sun entering a sign. */ type: 'aspect' | 'sign-ingress' | 'retrograde-station' | 'lunar-phase' | 'eclipse' | 'solar-season'; /** * Exact instant the event perfects, UTC, to the second. Verifiable against NASA JPL Horizons for a position event and against the US Naval Observatory for a lunar phase or eclipse. */ at: string; /** * Bodies involved, canonical English regardless of the requested language so the value stays safe to switch on. Two entries for an aspect, faster body first. One entry for an ingress, a station, a lunar phase, or an eclipse. */ bodies: Array; /** * Angle formed, on aspect events only: conjunction, sextile, square, trine, opposition, semi-sextile, quincunx, semi-square, or sesquiquadrate. */ aspect?: string; /** * Sign the event falls in, lowercase, where it has exactly one. Absent for an aspect whose two bodies stand in different signs. */ sign?: string; /** * Whole-sign house the event falls in, counted from the queried sign, 1 to 12. This is what turns one global sky event into a statement about this reader. */ house: number; /** * End of the window this event holds open, UTC, given only where a bounded window is a real fact about it: the orb span of an aspect, the sign span of an ingress or a season, the retrograde span of a station. Absent for a lunar phase or an eclipse, which are instants and not spans. */ through?: string; }>; /** * Lucky number for the day, 1 to 9, from the traditional planetary number correspondence applied to the planet that governs this sign today. Not a random draw and not a function of the date. */ luckyNumber: number; /** * Lucky color for the day, drawn from the three colors of the sign element and selected by the planet governing the reading. */ luckyColor: string; /** * Most compatible zodiac signs for this sign. Trine partners (same element) followed by a sextile partner (complementary element). Use for compatibility widgets, dating app onboarding, and horoscope cards. */ compatibleSigns: Array; /** * Active planetary transits affecting this sign today, with house activations. Each transit shows the planet, its current sign, and which house it activates for the queried sign. The sign and the house phrase translate with the lang parameter; the planet name stays canonical English so a caller can match on it whatever the language. */ activeTransits: Array; /** * Current Moon sign. Changes every 2-3 days, sets the emotional tone for all signs. */ moonSign: string; /** * Display name of the current lunar phase, one of the eight standard phases from New Moon through Waning Crescent. Translates in place with the lang parameter, like the moonSign beside it, so render it directly. */ moonPhase: string; /** * Overall energy for this sign today (1-10). Derived from how many aspects are in force between the planets, how tight they are, whether they are harmonious or challenging, and which houses they fall in for this sign, so a busy day rates higher than a quiet one and a harmonious day higher than a hostile one of the same weight. Useful for content widgets and visual indicators. */ energyRating: number; }; }; export type GetDailyHoroscopeResponse = GetDailyHoroscopeResponses[keyof GetDailyHoroscopeResponses]; export type GetWeeklyHoroscopeData = { body?: never; path: { /** * Zodiac sign, case-insensitive (e.g., aries, Aries, ARIES all work). */ sign: 'aries' | 'taurus' | 'gemini' | 'cancer' | 'leo' | 'virgo' | 'libra' | 'scorpio' | 'sagittarius' | 'capricorn' | 'aquarius' | 'pisces'; }; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; /** * Any date inside the target week, in YYYY-MM-DD format. The forecast covers the Monday to Sunday week containing it. Defaults to the current period in the timezone parameter. */ date?: string; /** * Selects which period counts as current when date is omitted. Defaults to UTC, so the forecast rolls over at 00:00 UTC on each Monday. Pass the timezone of the end user to roll over on their local clock instead. Ignored when date is set. Accepts an IANA name (e.g. "America/New_York"), decimal hours (e.g. 5.5 for IST), or a fixed UTC offset (e.g. "-05:00"). */ timezone?: string; }; url: '/astrology/horoscope/{sign}/weekly'; }; export type GetWeeklyHoroscopeErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetWeeklyHoroscopeError = GetWeeklyHoroscopeErrors[keyof GetWeeklyHoroscopeErrors]; export type GetWeeklyHoroscopeResponses = { /** * Weekly horoscope retrieved successfully */ 200: { /** * Zodiac sign for this horoscope. */ sign: string; /** * Start date of the forecast week (Monday). */ week: string; /** * The single most relevant event of the period, whichever life area it touches, read into the whole-sign houses of this sign. The same event that leads column, at lede length rather than developed into a full movement, and checkable against the events array. Typically 40 to 80 words. Join it with love, career, health and finance for a general reading built from the six sections. Deterministic: the same sign and period always returns the same text. */ overview: string; /** * Weekly love and relationship forecast, read into the whole-sign houses of this sign. The same ranked events that drive column, filtered to romance and partnership, plus the standing placements that reach it. Every event named here is in the events array, so a piece can be fact-checked before it runs; this section reads an event through whichever of its houses carries romance and partnership, which for an aspect between two houses can be the other one from the house the events array leads with, and both are whole-sign houses of the bodies involved counted from this sign. Typically 80 to 120 words. Render it alone for a single-topic page, or alongside the other five sections for a general reading; column is the same material woven into one piece instead of split by topic. Deterministic: the same sign and period always returns the same text. */ love: string; /** * Weekly career and professional outlook, read into the whole-sign houses of this sign. The same ranked events that drive column, filtered to career, work and reputation, plus the standing placements that reach it. Every event named here is in the events array, so a piece can be fact-checked before it runs; this section reads an event through whichever of its houses carries career, work and reputation, which for an aspect between two houses can be the other one from the house the events array leads with, and both are whole-sign houses of the bodies involved counted from this sign. Typically 80 to 120 words. Render it alone for a single-topic page, or alongside the other five sections for a general reading; column is the same material woven into one piece instead of split by topic. Deterministic: the same sign and period always returns the same text. */ career: string; /** * Weekly health, energy, and wellness guidance, read into the whole-sign houses of this sign. The same ranked events that drive column, filtered to health, plus the standing placements that reach it. Every event named here is in the events array, so a piece can be fact-checked before it runs; this section reads an event through whichever of its houses carries health, which for an aspect between two houses can be the other one from the house the events array leads with, and both are whole-sign houses of the bodies involved counted from this sign. Typically 80 to 120 words. Render it alone for a single-topic page, or alongside the other five sections for a general reading; column is the same material woven into one piece instead of split by topic. Deterministic: the same sign and period always returns the same text. */ health: string; /** * Weekly financial outlook, read into the whole-sign houses of this sign. The same ranked events that drive column, filtered to finance, plus the standing placements that reach it. Every event named here is in the events array, so a piece can be fact-checked before it runs; this section reads an event through whichever of its houses carries finance, which for an aspect between two houses can be the other one from the house the events array leads with, and both are whole-sign houses of the bodies involved counted from this sign. Typically 80 to 120 words. Render it alone for a single-topic page, or alongside the other five sections for a general reading; column is the same material woven into one piece instead of split by topic. Deterministic: the same sign and period always returns the same text. */ finance: string; /** * The single actionable takeaway from the leading event of the period, read into the whole-sign houses of this sign and checkable against the events array. Drawn from the same event as overview, kept to a short, actionable pair of sentences rather than grown to match the other sections. Deterministic: the same sign and period always returns the same text. */ advice: string; /** * The full column for this period, ready to run as one piece, with paragraphs separated by a blank line. Names the events driving it and the dates they fall on, read into the whole-sign houses of this sign. Typically 250 to 450 words. The six section fields read the same ranked events filtered to their own life area, each composed as a column of its own rather than an excerpt of this one, so render either shape and never both. Deterministic: the same sign and period always returns the same column. */ column: string; /** * The dated astronomical events this reading is built on, earliest first. Every field in every row can be checked against an independent authority, so a column can be fact-checked before it is published. Empty on a period in which nothing exact happens, where the reading falls back to the standing positions instead. */ events: Array<{ /** * Kind of event. aspect is an exact angle between two moving bodies, sign-ingress a body entering a new sign, retrograde-station a body turning retrograde or direct, lunar-phase one of the four quarters, eclipse a solar or lunar eclipse, and solar-season the Sun entering a sign. */ type: 'aspect' | 'sign-ingress' | 'retrograde-station' | 'lunar-phase' | 'eclipse' | 'solar-season'; /** * Exact instant the event perfects, UTC, to the second. Verifiable against NASA JPL Horizons for a position event and against the US Naval Observatory for a lunar phase or eclipse. */ at: string; /** * Bodies involved, canonical English regardless of the requested language so the value stays safe to switch on. Two entries for an aspect, faster body first. One entry for an ingress, a station, a lunar phase, or an eclipse. */ bodies: Array; /** * Angle formed, on aspect events only: conjunction, sextile, square, trine, opposition, semi-sextile, quincunx, semi-square, or sesquiquadrate. */ aspect?: string; /** * Sign the event falls in, lowercase, where it has exactly one. Absent for an aspect whose two bodies stand in different signs. */ sign?: string; /** * Whole-sign house the event falls in, counted from the queried sign, 1 to 12. This is what turns one global sky event into a statement about this reader. */ house: number; /** * End of the window this event holds open, UTC, given only where a bounded window is a real fact about it: the orb span of an aspect, the sign span of an ingress or a season, the retrograde span of a station. Absent for a lunar phase or an eclipse, which are instants and not spans. */ through?: string; }>; /** * The three most favorable days this week, from the planetary rulers of the seven weekdays, ranked by how strongly each of those planets stands for this sign. */ luckyDays: Array; /** * Three lucky numbers for the week, each 1 to 9 and all distinct, from the traditional planetary number correspondence applied to the three planets that govern this sign this week. */ luckyNumbers: Array; /** * Most compatible zodiac signs for this sign. Trine partners (same element) followed by a sextile partner (complementary element). */ compatibleSigns: Array; }; }; export type GetWeeklyHoroscopeResponse = GetWeeklyHoroscopeResponses[keyof GetWeeklyHoroscopeResponses]; export type GetMonthlyHoroscopeData = { body?: never; path: { /** * Zodiac sign, case-insensitive (e.g., aries, Aries, ARIES all work). */ sign: 'aries' | 'taurus' | 'gemini' | 'cancer' | 'leo' | 'virgo' | 'libra' | 'scorpio' | 'sagittarius' | 'capricorn' | 'aquarius' | 'pisces'; }; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; /** * Any date inside the target month, in YYYY-MM-DD format. The forecast covers the whole calendar month containing it. Defaults to the current period in the timezone parameter. */ date?: string; /** * Selects which period counts as current when date is omitted. Defaults to UTC, so the forecast rolls over at 00:00 UTC on the 1st. Pass the timezone of the end user to roll over on their local clock instead. Ignored when date is set. Accepts an IANA name (e.g. "America/New_York"), decimal hours (e.g. 5.5 for IST), or a fixed UTC offset (e.g. "-05:00"). */ timezone?: string; }; url: '/astrology/horoscope/{sign}/monthly'; }; export type GetMonthlyHoroscopeErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetMonthlyHoroscopeError = GetMonthlyHoroscopeErrors[keyof GetMonthlyHoroscopeErrors]; export type GetMonthlyHoroscopeResponses = { /** * Monthly horoscope retrieved successfully */ 200: { /** * Zodiac sign for this horoscope. */ sign: string; /** * Month of this forecast (YYYY-MM). */ month: string; /** * The single most relevant event of the period, whichever life area it touches, read into the whole-sign houses of this sign. The same event that leads column, at lede length rather than developed into a full movement, and checkable against the events array. Typically 55 to 100 words. Join it with love, career, health and finance for a general reading built from the six sections. Deterministic: the same sign and period always returns the same text. */ overview: string; /** * Monthly love and relationship forecast, read into the whole-sign houses of this sign. The same ranked events that drive column, filtered to romance and partnership, plus the standing placements that reach it. Every event named here is in the events array, so a piece can be fact-checked before it runs; this section reads an event through whichever of its houses carries romance and partnership, which for an aspect between two houses can be the other one from the house the events array leads with, and both are whole-sign houses of the bodies involved counted from this sign. Typically 120 to 200 words. Render it alone for a single-topic page, or alongside the other five sections for a general reading; column is the same material woven into one piece instead of split by topic. Deterministic: the same sign and period always returns the same text. */ love: string; /** * Monthly career and professional outlook, read into the whole-sign houses of this sign. The same ranked events that drive column, filtered to career, work and reputation, plus the standing placements that reach it. Every event named here is in the events array, so a piece can be fact-checked before it runs; this section reads an event through whichever of its houses carries career, work and reputation, which for an aspect between two houses can be the other one from the house the events array leads with, and both are whole-sign houses of the bodies involved counted from this sign. Typically 120 to 200 words. Render it alone for a single-topic page, or alongside the other five sections for a general reading; column is the same material woven into one piece instead of split by topic. Deterministic: the same sign and period always returns the same text. */ career: string; /** * Monthly health and wellness guidance, read into the whole-sign houses of this sign. The same ranked events that drive column, filtered to health, plus the standing placements that reach it. Every event named here is in the events array, so a piece can be fact-checked before it runs; this section reads an event through whichever of its houses carries health, which for an aspect between two houses can be the other one from the house the events array leads with, and both are whole-sign houses of the bodies involved counted from this sign. Typically 120 to 200 words. Render it alone for a single-topic page, or alongside the other five sections for a general reading; column is the same material woven into one piece instead of split by topic. Deterministic: the same sign and period always returns the same text. */ health: string; /** * Monthly financial outlook and guidance, read into the whole-sign houses of this sign. The same ranked events that drive column, filtered to finance, plus the standing placements that reach it. Every event named here is in the events array, so a piece can be fact-checked before it runs; this section reads an event through whichever of its houses carries finance, which for an aspect between two houses can be the other one from the house the events array leads with, and both are whole-sign houses of the bodies involved counted from this sign. Typically 120 to 200 words. Render it alone for a single-topic page, or alongside the other five sections for a general reading; column is the same material woven into one piece instead of split by topic. Deterministic: the same sign and period always returns the same text. */ finance: string; /** * The single actionable takeaway from the leading event of the period, read into the whole-sign houses of this sign and checkable against the events array. Drawn from the same event as overview, kept to a short, actionable pair of sentences rather than grown to match the other sections. Deterministic: the same sign and period always returns the same text. */ advice: string; /** * The full column for this period, ready to run as one piece, with paragraphs separated by a blank line. Names the events driving it and the dates they fall on, read into the whole-sign houses of this sign. Typically 400 to 700 words. The six section fields read the same ranked events filtered to their own life area, each composed as a column of its own rather than an excerpt of this one, so render either shape and never both. Deterministic: the same sign and period always returns the same column. */ column: string; /** * The dated astronomical events this reading is built on, earliest first. Every field in every row can be checked against an independent authority, so a column can be fact-checked before it is published. Empty on a period in which nothing exact happens, where the reading falls back to the standing positions instead. */ events: Array<{ /** * Kind of event. aspect is an exact angle between two moving bodies, sign-ingress a body entering a new sign, retrograde-station a body turning retrograde or direct, lunar-phase one of the four quarters, eclipse a solar or lunar eclipse, and solar-season the Sun entering a sign. */ type: 'aspect' | 'sign-ingress' | 'retrograde-station' | 'lunar-phase' | 'eclipse' | 'solar-season'; /** * Exact instant the event perfects, UTC, to the second. Verifiable against NASA JPL Horizons for a position event and against the US Naval Observatory for a lunar phase or eclipse. */ at: string; /** * Bodies involved, canonical English regardless of the requested language so the value stays safe to switch on. Two entries for an aspect, faster body first. One entry for an ingress, a station, a lunar phase, or an eclipse. */ bodies: Array; /** * Angle formed, on aspect events only: conjunction, sextile, square, trine, opposition, semi-sextile, quincunx, semi-square, or sesquiquadrate. */ aspect?: string; /** * Sign the event falls in, lowercase, where it has exactly one. Absent for an aspect whose two bodies stand in different signs. */ sign?: string; /** * Whole-sign house the event falls in, counted from the queried sign, 1 to 12. This is what turns one global sky event into a statement about this reader. */ house: number; /** * End of the window this event holds open, UTC, given only where a bounded window is a real fact about it: the orb span of an aspect, the sign span of an ingress or a season, the retrograde span of a station. Absent for a lunar phase or an eclipse, which are instants and not spans. */ through?: string; }>; /** * The month read one calendar week at a time, off the same ranked events as column and events[]: the life area each week turns on, and the one thing that area asks for. Two weeks may land in the same area, because two events of a month often do; the sentence beside it is always different. Use it for the week strip of a monthly page. */ weekByWeek: Array<{ /** * Position of the week inside the month, 1 first. The rows are calendar weeks, Monday to Sunday, clipped to the month at each end, so a month carries four, five or six of them. Row N is therefore the same week the weekly forecast covers, which is what lets a monthly page link straight into it. */ week: number; /** * The life area the week turns on, in the requested language: the theme of the whole-sign house holding the strongest event the reading names inside that week, or of the strongest standing placement where the week holds no dated event. Same values as the life areas of the yearly key periods. */ focus: string; /** * What that house asks for, as one sentence in the requested language. No two weeks of one month repeat a sentence. */ advice: string; }>; /** * The dates to circle this month, earliest first: every lunation and eclipse of the month, plus the headline movements the reading is built on, which are the sign changes of the slower planets and every station with the direction it turns. Each is placed in the whole-sign house it reaches for this sign. Every row is an instant the ephemeris gives, checkable against NASA JPL Horizons or the US Naval Observatory, and every row that is not a lunation or an eclipse is also a row of events[], so the list cannot contradict the reading beside it. */ keyDates: Array<{ /** * UTC date of the event (YYYY-MM-DD). The exact instant, to the second, is on the matching row of events[]. */ date: string; /** * The event as one sentence in the requested language, placed in the whole-sign house it reaches for this sign. */ event: string; }>; /** * Four lucky numbers for the month, each 1 to 9 and all distinct, from the traditional planetary number correspondence applied to the four planets that govern this sign this month. */ luckyNumbers: Array; /** * Lucky color for the month, drawn from the three colors of the sign element and selected by the planet governing the reading. */ luckyColor: string; /** * Most compatible zodiac signs for this sign. Trine partners (same element) followed by a sextile partner (complementary element). */ compatibleSigns: Array; }; }; export type GetMonthlyHoroscopeResponse = GetMonthlyHoroscopeResponses[keyof GetMonthlyHoroscopeResponses]; export type GetYearlyHoroscopeData = { body?: never; path: { /** * Zodiac sign, case-insensitive (e.g., aries, Aries, ARIES all work). */ sign: 'aries' | 'taurus' | 'gemini' | 'cancer' | 'leo' | 'virgo' | 'libra' | 'scorpio' | 'sagittarius' | 'capricorn' | 'aquarius' | 'pisces'; }; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; /** * Calendar year to forecast, 1900 to 2100. Defaults to the current year in the timezone parameter. */ year?: number; /** * Selects which year counts as current when year is omitted. Defaults to UTC, so the forecast rolls over at 00:00 UTC on January 1. Pass the timezone of the end user to roll over on their local clock instead. Ignored when year is set. Accepts an IANA name (e.g. "America/New_York"), decimal hours (e.g. 5.5 for IST), or a fixed UTC offset (e.g. "-05:00"). */ timezone?: string; }; url: '/astrology/horoscope/{sign}/yearly'; }; export type GetYearlyHoroscopeErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetYearlyHoroscopeError = GetYearlyHoroscopeErrors[keyof GetYearlyHoroscopeErrors]; export type GetYearlyHoroscopeResponses = { /** * Yearly horoscope retrieved successfully */ 200: { /** * Zodiac sign for this horoscope. */ sign: string; /** * Calendar year this forecast covers. Echoes the year requested, or the current year when it was omitted. */ year: number; /** * The single most relevant event of the period, whichever life area it touches, read into the whole-sign houses of this sign. The same event that leads column, at lede length rather than developed into a full movement, and checkable against the events array. Typically 70 to 120 words. Join it with love, career, health and finance for a general reading built from the six sections. Deterministic: the same sign and period always returns the same text. */ overview: string; /** * Yearly love and relationship outlook, read into the whole-sign houses of this sign. The same ranked events that drive column, filtered to romance and partnership, plus the standing placements that reach it. Every event named here is in the events array, so a piece can be fact-checked before it runs; this section reads an event through whichever of its houses carries romance and partnership, which for an aspect between two houses can be the other one from the house the events array leads with, and both are whole-sign houses of the bodies involved counted from this sign. Typically 150 to 260 words. Render it alone for a single-topic page, or alongside the other five sections for a general reading; column is the same material woven into one piece instead of split by topic. Deterministic: the same sign and period always returns the same text. */ love: string; /** * Yearly career and professional outlook, read into the whole-sign houses of this sign. The same ranked events that drive column, filtered to career, work and reputation, plus the standing placements that reach it. Every event named here is in the events array, so a piece can be fact-checked before it runs; this section reads an event through whichever of its houses carries career, work and reputation, which for an aspect between two houses can be the other one from the house the events array leads with, and both are whole-sign houses of the bodies involved counted from this sign. Typically 150 to 260 words. Render it alone for a single-topic page, or alongside the other five sections for a general reading; column is the same material woven into one piece instead of split by topic. Deterministic: the same sign and period always returns the same text. */ career: string; /** * Yearly health, energy, and wellness outlook, read into the whole-sign houses of this sign. The same ranked events that drive column, filtered to health, plus the standing placements that reach it. Every event named here is in the events array, so a piece can be fact-checked before it runs; this section reads an event through whichever of its houses carries health, which for an aspect between two houses can be the other one from the house the events array leads with, and both are whole-sign houses of the bodies involved counted from this sign. Typically 150 to 260 words. Render it alone for a single-topic page, or alongside the other five sections for a general reading; column is the same material woven into one piece instead of split by topic. Deterministic: the same sign and period always returns the same text. */ health: string; /** * Yearly financial outlook, read into the whole-sign houses of this sign. The same ranked events that drive column, filtered to finance, plus the standing placements that reach it. Every event named here is in the events array, so a piece can be fact-checked before it runs; this section reads an event through whichever of its houses carries finance, which for an aspect between two houses can be the other one from the house the events array leads with, and both are whole-sign houses of the bodies involved counted from this sign. Typically 150 to 260 words. Render it alone for a single-topic page, or alongside the other five sections for a general reading; column is the same material woven into one piece instead of split by topic. Deterministic: the same sign and period always returns the same text. */ finance: string; /** * The single actionable takeaway from the leading event of the period, read into the whole-sign houses of this sign and checkable against the events array. Drawn from the same event as overview, kept to a short, actionable pair of sentences rather than grown to match the other sections. Deterministic: the same sign and period always returns the same text. */ advice: string; /** * The full column for this period, ready to run as one piece, with paragraphs separated by a blank line. Names the events driving it and the dates they fall on, read into the whole-sign houses of this sign. Typically 600 to 900 words. The six section fields read the same ranked events filtered to their own life area, each composed as a column of its own rather than an excerpt of this one, so render either shape and never both. Deterministic: the same sign and period always returns the same column. */ column: string; /** * The dated astronomical events this reading is built on, earliest first. Every field in every row can be checked against an independent authority, so a column can be fact-checked before it is published. Empty on a period in which nothing exact happens, where the reading falls back to the standing positions instead. */ events: Array<{ /** * Kind of event. aspect is an exact angle between two moving bodies, sign-ingress a body entering a new sign, retrograde-station a body turning retrograde or direct, lunar-phase one of the four quarters, eclipse a solar or lunar eclipse, and solar-season the Sun entering a sign. */ type: 'aspect' | 'sign-ingress' | 'retrograde-station' | 'lunar-phase' | 'eclipse' | 'solar-season'; /** * Exact instant the event perfects, UTC, to the second. Verifiable against NASA JPL Horizons for a position event and against the US Naval Observatory for a lunar phase or eclipse. */ at: string; /** * Bodies involved, canonical English regardless of the requested language so the value stays safe to switch on. Two entries for an aspect, faster body first. One entry for an ingress, a station, a lunar phase, or an eclipse. */ bodies: Array; /** * Angle formed, on aspect events only: conjunction, sextile, square, trine, opposition, semi-sextile, quincunx, semi-square, or sesquiquadrate. */ aspect?: string; /** * Sign the event falls in, lowercase, where it has exactly one. Absent for an aspect whose two bodies stand in different signs. */ sign?: string; /** * Whole-sign house the event falls in, counted from the queried sign, 1 to 12. This is what turns one global sky event into a statement about this reader. */ house: number; /** * End of the window this event holds open, UTC, given only where a bounded window is a real fact about it: the orb span of an aspect, the sign span of an ingress or a season, the retrograde span of a station. Absent for a lunar phase or an eclipse, which are instants and not spans. */ through?: string; }>; /** * The backdrop of the year: which whole-sign house each slow-moving body occupies for this sign, Jupiter first and Pluto last. One row per unbroken stretch, so a body that stays put is a single row spanning the year and a body that changes sign is two rows with the exact date between them. Dates are the part of the stretch that falls inside this year; the full span of a change that happens inside the year is in the events array. Use it for the year-at-a-glance panel a year-ahead page opens with. */ themes: Array<{ /** * The slow-moving body holding this theme, canonical English regardless of the requested language: Jupiter, Saturn, Uranus, Neptune, or Pluto. */ body: string; /** * Sign the body occupies through this stretch, lowercase. Checkable against NASA JPL Horizons for any date inside from and to. */ sign: string; /** * Whole-sign house that sign is for this sign, 1 to 12. */ house: number; /** * What that house governs, so the placement reads as a life area rather than a coordinate. */ theme: string; /** * First date of the stretch inside this year, in UTC (YYYY-MM-DD). January 1 when the body was already there when the year opened, otherwise the date it arrived. */ from: string; /** * Last date of the stretch inside this year, in UTC (YYYY-MM-DD). December 31 when the body is still there when the year closes, otherwise the date it leaves. */ to: string; }>; /** * Every solar and lunar eclipse of the year, with the house each one falls in for this sign. Usually four to six, and the dates match the published eclipse canon. */ eclipses: Array<{ /** * Date of the eclipse peak in UTC (YYYY-MM-DD). The exact instant is in the events array. */ date: string; /** * Eclipse kind: total, annular, partial, or penumbral. */ kind: string; /** * Whole-sign house the eclipse falls in for this sign, 1 to 12. */ house: number; /** * What that house governs, so the eclipse reads as a life area rather than a coordinate. */ theme: string; }>; /** * Every retrograde and direct station of the year, in order, with the house each falls in for this sign. Drives review windows and the not-yet warnings a yearly column is bought for. */ retrogrades: Array<{ /** * Date the body turns, in UTC (YYYY-MM-DD). The exact instant is in the events array. */ date: string; /** * Body making the station, canonical English. */ body: string; /** * Which way it turns: retrograde when apparent motion reverses, direct when it resumes. */ direction: string; /** * Whole-sign house the station falls in for this sign, 1 to 12. */ house: number; /** * What that house governs, so the station reads as a life area rather than a coordinate. */ theme: string; }>; /** * The year as a calendar of life areas: for each whole-sign house, the single dated stretch that most strongly activates it, ordered by start date. Twelve rows in a full year, one per house, so every life area gets a date range and none is named twice. Periods overlap freely, because more than one body is always moving. Use it for the dates-to-circle panel of a year-ahead page. */ keyPeriods: Array<{ /** * Date the period opens, in UTC (YYYY-MM-DD). Always inside the year requested: this is the day the body enters the sign. */ from: string; /** * Date the period closes, in UTC (YYYY-MM-DD), which is the day the body leaves that sign. A period that opens late in the year closes in the next one, by at most about three months, so a reader knows what they are still in on January 1. */ to: string; /** * Body driving the period, canonical English regardless of the requested language: Mercury, Venus, or Mars. The slower bodies are in the themes array instead, because a stretch measured in years is a backdrop rather than a date to circle. */ body: string; /** * Whole-sign house the period activates for this sign, 1 to 12. Unique within the array: each house appears at most once. */ house: number; /** * The life area that period is about, from the house it activates. */ focus: string; }>; /** * The easiest month of the year for each of the four topic sections, by how many exact harmonious aspects (sextiles and trines) fall in that month and land in the houses that govern the area for this sign. An area is omitted only in the rare year that carries no harmonious aspect for it at all, so treat each key as optional. Use it for the best-months-for panel, and read the count as the evidence behind the word best. */ bestPeriods: { /** * Best month for romance and partnership. Absent only if the whole year carries no harmonious aspect reaching this area. */ love?: { /** * First day of the month, in UTC (YYYY-MM-DD). */ from: string; /** * Last day of the month, in UTC (YYYY-MM-DD). */ to: string; /** * How many exact harmonious aspects fell in that month and reached this area. This is the measurement the month was chosen on, and every aspect behind it can be checked against NASA JPL Horizons. */ count: number; }; /** * Best month for career, work and reputation. Absent only if the whole year carries no harmonious aspect reaching this area. */ career?: { /** * First day of the month, in UTC (YYYY-MM-DD). */ from: string; /** * Last day of the month, in UTC (YYYY-MM-DD). */ to: string; /** * How many exact harmonious aspects fell in that month and reached this area. This is the measurement the month was chosen on, and every aspect behind it can be checked against NASA JPL Horizons. */ count: number; }; /** * Best month for health. Absent only if the whole year carries no harmonious aspect reaching this area. */ health?: { /** * First day of the month, in UTC (YYYY-MM-DD). */ from: string; /** * Last day of the month, in UTC (YYYY-MM-DD). */ to: string; /** * How many exact harmonious aspects fell in that month and reached this area. This is the measurement the month was chosen on, and every aspect behind it can be checked against NASA JPL Horizons. */ count: number; }; /** * Best month for finance. Absent only if the whole year carries no harmonious aspect reaching this area. */ finance?: { /** * First day of the month, in UTC (YYYY-MM-DD). */ from: string; /** * Last day of the month, in UTC (YYYY-MM-DD). */ to: string; /** * How many exact harmonious aspects fell in that month and reached this area. This is the measurement the month was chosen on, and every aspect behind it can be checked against NASA JPL Horizons. */ count: number; }; }; /** * Four lucky numbers for the year, each 1 to 9 and all distinct, from the traditional planetary number correspondence applied to the four planets that govern this sign this year. */ luckyNumbers: Array; /** * Lucky color for the year, drawn from the three colors of the sign element and selected by the planet governing the reading. */ luckyColor: string; /** * Most compatible zodiac signs for this sign. Trine partners (same element) followed by a sextile partner (complementary element). */ compatibleSigns: Array; }; }; export type GetYearlyHoroscopeResponse = GetYearlyHoroscopeResponses[keyof GetYearlyHoroscopeResponses]; export type GeneratePlanetaryReturnData = { body?: { /** * Original birth date in YYYY-MM-DD format. Used to determine the natal longitude of the selected planet. */ birthDate: string; /** * Original birth time in 24-hour HH:MM:SS format. Determines exact natal planet position for return timing. */ birthTime: string; /** * Planet for the return calculation. Supports Mercury (~88 days), Venus (~225 days), Mars (~687 days), Jupiter (~12 years), and Saturn (~29 years). Saturn return is a major life milestone in Western astrology. */ planet: 'Mercury' | 'Venus' | 'Mars' | 'Jupiter' | 'Saturn'; /** * Approximate date near the expected planetary return (YYYY-MM-DD). Provide a date within the expected return window. The algorithm searches from this starting point. */ approximateDate: string; /** * Latitude of the return location in decimal degrees (-90 to 90). Affects house cusps and Ascendant of the return chart. */ latitude: number; /** * Longitude of the return location in decimal degrees (-180 to 180). */ longitude: number; /** * Decimal hours from UTC OR IANA name (e.g. "America/New_York"). IANA resolved to the DST-correct offset for the birthDate. Output datetime is adjusted to this timezone. */ timezone: number | string; /** * House system for the return chart. Placidus (default), Whole Sign, Equal, or Koch. */ houseSystem?: 'placidus' | 'whole-sign' | 'equal' | 'koch'; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/astrology/planetary-returns'; }; export type GeneratePlanetaryReturnErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GeneratePlanetaryReturnError = GeneratePlanetaryReturnErrors[keyof GeneratePlanetaryReturnErrors]; export type GeneratePlanetaryReturnResponses = { /** * Planetary return chart calculated successfully */ 200: { /** * Original birth date used for natal planet longitude calculation. */ birthDate: string; /** * Planet whose return was calculated. Each planet has a different orbital period and return significance. */ planet: string; /** * Exact planetary return moment, when the transiting planet conjuncts its natal longitude. Adjusted to requested timezone. Marks the beginning of a new cycle for that planet in your life. */ returnDate: string; /** * Approximate orbital period for this planet. Mercury ~88 days, Venus ~225 days, Mars ~687 days (~1.9 years), Jupiter ~12 years, Saturn ~29 years. */ approximateCycle: string; /** * Location used for the planetary return chart house and Ascendant calculations. */ location: { /** * Observer latitude used for house cusp calculation in the return chart. */ latitude: number; /** * Observer longitude used for Midheaven and local sidereal time. */ longitude: number; /** * Timezone offset from UTC applied to output datetime formatting. */ timezone: number; }; /** * Full tropical zodiac chart erected for the planetary return moment. Contains planetary positions, house cusps, aspects, Ascendant, and Midheaven. */ chart: { /** * Birth details used to generate this chart. */ birthDetails: { /** * Birth date in YYYY-MM-DD format. Determines planetary positions for the specific calendar day. */ date: string; /** * Birth time in 24-hour HH:MM:SS format. Determines the Ascendant (rising sign) and house cusps. Use 12:00:00 if unknown. */ time: string; /** * Birth location latitude in decimal degrees (-90 to 90). Positive = North, negative = South. */ latitude: number; /** * Birth location longitude in decimal degrees (-180 to 180). Positive = East, negative = West. */ longitude: number; /** * Timezone offset from UTC in decimal hours. Examples: New York = -5, London = 0, India = 5.5, Tokyo = 9. */ timezone: number; }; /** * All 14 celestial bodies in the tropical zodiac with house placements: the 10 classical planets (Sun through Pluto), the lunar nodes (North Node, South Node, in the requested `nodeType` convention), Chiron, and Black Moon Lilith. */ planets: Array<{ /** * Body name. One of the 10 classical planets (Sun, Moon, Mercury, Venus, Mars, Jupiter, Saturn, Uranus, Neptune, Pluto), the lunar nodes (North Node, South Node), Chiron, or Black Moon Lilith (the mean lunar apogee). The lunar nodes follow the request nodeType, which defaults to the true (osculating) node; pass "mean" for the smoothed node. The two differ by up to about 1.8 degrees and no other body is affected. */ name: 'Sun' | 'Moon' | 'Mercury' | 'Venus' | 'Mars' | 'Jupiter' | 'Saturn' | 'Uranus' | 'Neptune' | 'Pluto' | 'North Node' | 'South Node' | 'Chiron' | 'Black Moon Lilith'; /** * Apparent geocentric tropical longitude on the true ecliptic of date, in degrees (0-360): light time and aberration applied, nutation included, the convention desktop chart software and the NASA JPL Horizons observer tables print, so it compares directly with either. Primary coordinate for zodiac sign and aspect calculations. */ longitude: number; /** * Apparent geocentric ecliptic latitude of date, in degrees. Near zero for most planets, varies for the Moon and Pluto, and reaches up to about 5 degrees for Black Moon Lilith (projected from the inclined mean lunar orbit). */ latitude: number; /** * Tropical zodiac sign this planet occupies. Determined by 30-degree divisions of ecliptic longitude. */ sign: string; /** * Degree within the zodiac sign (0-29.999). Indicates how far the planet has progressed through the sign. */ degree: number; /** * House placement (1-12). Determined by the selected house system and birth location. */ house: number; /** * Daily motion in degrees per day. Negative values indicate retrograde motion. */ speed: number; /** * Whether the planet appears to move backward from Earth perspective. Retrograde periods signal review and introspection. */ isRetrograde: boolean; }>; /** * All 12 house cusps calculated using the selected house system. */ houses: Array<{ /** * House number (1-12). Each house governs specific life themes in Western astrology. */ number: number; /** * Ecliptic longitude of this house cusp in degrees (0-360). */ longitude: number; /** * Zodiac sign on this house cusp. Colors the themes of this life area. */ sign: string; /** * Degree within the zodiac sign on this cusp (0-29.999). */ degree: number; }>; /** * House system used for this chart (placidus, whole-sign, equal, or koch). */ houseSystem: 'placidus' | 'whole-sign' | 'equal' | 'koch'; /** * All planetary aspects found in this chart with orbs, strength, and applying/separating status. */ aspects: Array<{ /** * First planet in the aspect pair. */ planet1: 'Sun' | 'Moon' | 'Mercury' | 'Venus' | 'Mars' | 'Jupiter' | 'Saturn' | 'Uranus' | 'Neptune' | 'Pluto' | 'North Node' | 'South Node' | 'Chiron' | 'Black Moon Lilith'; /** * Second planet in the aspect pair. */ planet2: 'Sun' | 'Moon' | 'Mercury' | 'Venus' | 'Mars' | 'Jupiter' | 'Saturn' | 'Uranus' | 'Neptune' | 'Pluto' | 'North Node' | 'South Node' | 'Chiron' | 'Black Moon Lilith'; /** * Aspect type. Major: conjunction (0), opposition (180), trine (120), square (90), sextile (60). Minor: semi-sextile, quincunx, semi-square, sesquiquadrate. */ type: 'CONJUNCTION' | 'OPPOSITION' | 'TRINE' | 'SQUARE' | 'SEXTILE' | 'SEMI_SEXTILE' | 'QUINCUNX' | 'SEMI_SQUARE' | 'SESQUIQUADRATE'; /** * Exact angular separation that defines this aspect type in degrees. */ angle: number; /** * Deviation from exact aspect in degrees. Tighter orb means stronger influence. */ orb: number; /** * Whether the aspect is applying (planets moving toward exact) or separating (moving apart). Applying aspects grow stronger. */ isApplying: boolean; /** * Aspect strength percentage (0-100). Based on orb tightness relative to the allowed maximum. */ strength: number; /** * Aspect nature. Harmonious (trine, sextile) flows easily. Challenging (square, opposition) creates tension and growth. Neutral (conjunction) blends energies. Always English, whatever the lang parameter says: it is an identifier consumers switch and style on. Use interpretationLocalized for anything a reader sees. */ interpretation: 'harmonious' | 'challenging' | 'neutral'; }>; /** * Part of Fortune (Lot of Fortune). A point derived from the Ascendant and the two luminaries that marks an area of ease, vitality, and material wellbeing in the chart. */ partOfFortune: { /** * Zodiac sign holding the Part of Fortune. */ sign: string; /** * Degree within the Part of Fortune sign (0-29.999). */ degree: number; /** * Absolute ecliptic longitude of the Part of Fortune (0-360). */ longitude: number; /** * House containing this point, resolved against the same cusps as `planets[].house` and using the requested house system. Read this field rather than inferring a house from the sign: the two disagree whenever a house spans more than one sign, which is most of the time outside Whole Sign. */ house: number; /** * Chart sect used for the calculation. Day (diurnal) when the Sun is above the horizon, night (nocturnal) when below. Day charts use Ascendant plus Moon minus Sun, night charts use Ascendant plus Sun minus Moon. */ sect: 'day' | 'night'; }; /** * Vertex. The western intersection of the prime vertical with the ecliptic, often read as a point of fated encounters and turning-point relationships. The opposite point is the Anti-Vertex. */ vertex: { /** * Zodiac sign holding the Vertex. */ sign: string; /** * Degree within the Vertex sign (0-29.999). */ degree: number; /** * Absolute ecliptic longitude of the Vertex (0-360). */ longitude: number; /** * House containing this point, resolved against the same cusps as `planets[].house` and using the requested house system. Read this field rather than inferring a house from the sign: the two disagree whenever a house spans more than one sign, which is most of the time outside Whole Sign. */ house: number; }; }; /** * Original natal planet position that defines the return. The transiting planet conjuncts this longitude to trigger the return. */ natalPlanetPosition: { /** * Natal planet ecliptic longitude in degrees (0-360). The transiting planet returns to this exact degree. */ longitude: number; /** * Tropical zodiac sign of the natal planet position. */ sign: string; /** * Degree within the zodiac sign (0-29.999). */ degree: number; }; /** * Planetary return interpretation. Saturn returns (~29 years) mark major life milestones. Jupiter returns (~12 years) signal growth cycles. Inner planet returns offer shorter-term insights. */ interpretation: { /** * Narrative overview of this planetary return cycle and its significance for personal development. */ summary: string; /** * Key life themes activated during this return cycle. Focus areas vary by planet: Jupiter brings expansion, Saturn brings structure and responsibility. */ keyThemes: Array; }; }; }; export type GeneratePlanetaryReturnResponse = GeneratePlanetaryReturnResponses[keyof GeneratePlanetaryReturnResponses]; export type GenerateAstrocartographyData = { body?: { /** * Birth date in YYYY-MM-DD format. Determines planetary positions for the specific calendar day. */ date: string; /** * Birth time in 24-hour HH:MM:SS format. Determines the Ascendant (rising sign) and house cusps. Use 12:00:00 if unknown. */ time: string; /** * Birth location latitude in decimal degrees (-90 to 90). Positive = North, negative = South. */ latitude: number; /** * Birth location longitude in decimal degrees (-180 to 180). Positive = East, negative = West. */ longitude: number; /** * Timezone: IANA name (e.g. "America/New_York", "Europe/London") OR decimal hours from UTC (e.g. -5 for EST, 1 for CET). IANA strings are resolved to the offset in force at the given date and time, so you can pass `cities[0].timezone` from /location/search directly. */ timezone: number | string; /** * Lunar node convention. "mean" is the smoothed average node, which always moves retrograde; "true" is the osculating node, which tracks the real perturbed node, oscillates up to about 1.5 degrees either side of the mean on a 173-day cycle, and can briefly turn direct. Neither is more correct and they almost always fall in the same sign. Applies to the North and South Node. True is the osculating node and the default, because it is what most Western chart software reports; mean is the smoothed node preferred by several evolutionary schools, so pass "mean" to match one. Nothing else in the chart changes, and the two agree on the sign except when the node sits within about 1.8 degrees of a cusp. Defaults to "true". */ nodeType?: 'mean' | 'true'; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; /** * Optional comma separated list of extra bodies to plot beyond the ten classical planets. Allowed values: north-node, chiron, lilith. north-node is the mean lunar node. Unknown values are ignored. Defaults to none. */ include?: string; }; url: '/astrology/astrocartography'; }; export type GenerateAstrocartographyErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GenerateAstrocartographyError = GenerateAstrocartographyErrors[keyof GenerateAstrocartographyErrors]; export type GenerateAstrocartographyResponses = { /** * Astrocartography planetary lines calculated successfully */ 200: AstrocartographyResponse; }; export type GenerateAstrocartographyResponse = GenerateAstrocartographyResponses[keyof GenerateAstrocartographyResponses]; export type GenerateRelocationChartData = { body?: RelocationChartRequest; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/astrology/relocation-chart'; }; export type GenerateRelocationChartErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GenerateRelocationChartError = GenerateRelocationChartErrors[keyof GenerateRelocationChartErrors]; export type GenerateRelocationChartResponses = { /** * Relocation chart calculated successfully */ 200: RelocationChartResponse; }; export type GenerateRelocationChartResponse = GenerateRelocationChartResponses[keyof GenerateRelocationChartResponses]; export type GenerateLocalSpaceData = { body?: { /** * Birth date in YYYY-MM-DD format. Combined with time and timezone it fixes the birth instant whose planetary positions are projected onto the local horizon. */ date: string; /** * Birth time in 24-hour HH:MM:SS format. Time is essential: the local horizon rotates a full circle each day, so the azimuth (compass direction) of every body depends on the exact birth time. */ time: string; /** * Birthplace latitude in decimal degrees (-90 to 90). This is the origin point of every local space line and the observer latitude used to turn each body into an azimuth and altitude. */ latitude: number; /** * Birthplace longitude in decimal degrees (-180 to 180). Sets the local horizon orientation and the starting point from which the directional lines radiate. */ longitude: number; /** * Decimal hours from UTC (e.g. -5 for EST, 5.5 for IST, 9 for JST) OR IANA name (e.g. "America/New_York"). IANA resolved to the offset in force at the birth date and time. */ timezone: number | string; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; /** * Optional comma-separated extra bodies to add beyond the 10 classical planets. Allowed values: north-node, chiron, lilith. north-node is the mean lunar node. Omit to return the 10 classical planets only. */ include?: string; }; url: '/astrology/local-space'; }; export type GenerateLocalSpaceErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GenerateLocalSpaceError = GenerateLocalSpaceErrors[keyof GenerateLocalSpaceErrors]; export type GenerateLocalSpaceResponses = { /** * Local space map generated successfully */ 200: LocalSpaceResponse; }; export type GenerateLocalSpaceResponse = GenerateLocalSpaceResponses[keyof GenerateLocalSpaceResponses]; export type GenerateFixedStarsData = { body?: { /** * Birth date in YYYY-MM-DD format. Determines planetary positions for the specific calendar day. */ date: string; /** * Birth time in 24-hour HH:MM:SS format. Determines the Ascendant (rising sign) and house cusps. Use 12:00:00 if unknown. */ time: string; /** * Birth location latitude in decimal degrees (-90 to 90). Positive = North, negative = South. */ latitude: number; /** * Birth location longitude in decimal degrees (-180 to 180). Positive = East, negative = West. */ longitude: number; /** * Timezone: IANA name (e.g. "America/New_York", "Europe/London") OR decimal hours from UTC (e.g. -5 for EST, 1 for CET). IANA strings are resolved to the offset in force at the given date and time, so you can pass `cities[0].timezone` from /location/search directly. */ timezone: number | string; /** * Lunar node convention. "mean" is the smoothed average node, which always moves retrograde; "true" is the osculating node, which tracks the real perturbed node, oscillates up to about 1.5 degrees either side of the mean on a 173-day cycle, and can briefly turn direct. Neither is more correct and they almost always fall in the same sign. Applies to the North and South Node. True is the osculating node and the default, because it is what most Western chart software reports; mean is the smoothed node preferred by several evolutionary schools, so pass "mean" to match one. Nothing else in the chart changes, and the two agree on the sign except when the node sits within about 1.8 degrees of a cusp. Defaults to "true". */ nodeType?: 'mean' | 'true'; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; /** * Conjunction orb in degrees, the maximum separation for a star to count as conjunct a chart point. Defaults to 1, maximum 3. Widen it to surface looser contacts or tighten it for only the closest hits. */ orb?: number; }; url: '/astrology/fixed-stars'; }; export type GenerateFixedStarsErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GenerateFixedStarsError = GenerateFixedStarsErrors[keyof GenerateFixedStarsErrors]; export type GenerateFixedStarsResponses = { /** * Fixed star positions and conjunctions calculated successfully */ 200: FixedStarsResponse; }; export type GenerateFixedStarsResponse = GenerateFixedStarsResponses[keyof GenerateFixedStarsResponses]; export type CalculateArabicLotsData = { body?: ArabicLotsRequest; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/astrology/arabic-lots'; }; export type CalculateArabicLotsErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type CalculateArabicLotsError = CalculateArabicLotsErrors[keyof CalculateArabicLotsErrors]; export type CalculateArabicLotsResponses = { /** * Arabic lots calculated successfully */ 200: ArabicLotsResponse; }; export type CalculateArabicLotsResponse = CalculateArabicLotsResponses[keyof CalculateArabicLotsResponses]; export type GenerateAsteroidsData = { body?: AsteroidsRequest; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/astrology/asteroids'; }; export type GenerateAsteroidsErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GenerateAsteroidsError = GenerateAsteroidsErrors[keyof GenerateAsteroidsErrors]; export type GenerateAsteroidsResponses = { /** * Asteroid positions calculated successfully */ 200: AsteroidsResponse; }; export type GenerateAsteroidsResponse = GenerateAsteroidsResponses[keyof GenerateAsteroidsResponses]; export type GenerateLilithData = { body?: LilithRequest; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/astrology/lilith'; }; export type GenerateLilithErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GenerateLilithError = GenerateLilithErrors[keyof GenerateLilithErrors]; export type GenerateLilithResponses = { /** * Black Moon Lilith calculated successfully */ 200: LilithResponse; }; export type GenerateLilithResponse = GenerateLilithResponses[keyof GenerateLilithResponses]; export type GenerateProgressionsData = { body?: ProgressionsRequest; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/astrology/progressions'; }; export type GenerateProgressionsErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GenerateProgressionsError = GenerateProgressionsErrors[keyof GenerateProgressionsErrors]; export type GenerateProgressionsResponses = { /** * Progressed chart calculated successfully */ 200: ProgressionsResponse; }; export type GenerateProgressionsResponse = GenerateProgressionsResponses[keyof GenerateProgressionsResponses]; export type GenerateSolarArcData = { body?: SolarArcRequest; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/astrology/solar-arc'; }; export type GenerateSolarArcErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GenerateSolarArcError = GenerateSolarArcErrors[keyof GenerateSolarArcErrors]; export type GenerateSolarArcResponses = { /** * Solar arc directed chart calculated successfully */ 200: SolarArcResponse; }; export type GenerateSolarArcResponse = GenerateSolarArcResponses[keyof GenerateSolarArcResponses]; export type GenerateProfectionsData = { body?: ProfectionsRequest; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/astrology/profections'; }; export type GenerateProfectionsErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GenerateProfectionsError = GenerateProfectionsErrors[keyof GenerateProfectionsErrors]; export type GenerateProfectionsResponses = { /** * Annual profection calculated successfully */ 200: ProfectionsResponse; }; export type GenerateProfectionsResponse = GenerateProfectionsResponses[keyof GenerateProfectionsResponses]; export type GenerateBirthChartData = { body?: BirthChartRequest; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; /** * Which signification vocabulary the houseThemes map returns. "general" gives the classical bhava significations (self, wealth, siblings, home, and so on). "finance" gives the money reading of the same twelve bhavas, so house 2 returns income and savings, 5 speculation and risk appetite, 8 sudden money and leverage, 11 gains and profits, and 12 expenses and capital outflow. Use "finance" for wealth, income, business and market timing questions in Krishnamurti Paddhati, where the significator house groups 2, 6, 10, 11 for earned income and 5, 8, 11 for speculation are read against a running dasha. Defaults to "general". */ focus?: 'general' | 'finance'; }; url: '/vedic-astrology/birth-chart'; }; export type GenerateBirthChartErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GenerateBirthChartError = GenerateBirthChartErrors[keyof GenerateBirthChartErrors]; export type GenerateBirthChartResponses = { /** * D1 Rashi birth chart with all 12 houses, 9 grahas plus Lagna, combustion analysis (Surya Siddhanta limits, applied as the standard ecliptic longitude orb), planetary war detection, bhava interpretations, and a meta lookup keyed by planet name. */ 200: BirthChartResponse; }; export type GenerateBirthChartResponse = GenerateBirthChartResponses[keyof GenerateBirthChartResponses]; export type GenerateNavamsaData = { body?: NavamsaRequest; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/vedic-astrology/navamsa'; }; export type GenerateNavamsaErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GenerateNavamsaError = GenerateNavamsaErrors[keyof GenerateNavamsaErrors]; export type GenerateNavamsaResponses = { /** * D9 Navamsa chart with all 12 houses, 9 grahas plus Lagna, Vargottama planet detection, and Vargottama significance explanation. Same structure as birth chart response. */ 200: NavamsaResponse; }; export type GenerateNavamsaResponse = GenerateNavamsaResponses[keyof GenerateNavamsaResponses]; export type GenerateDivisionalChartData = { body?: DivisionalChartRequest; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/vedic-astrology/divisional-chart'; }; export type GenerateDivisionalChartErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GenerateDivisionalChartError = GenerateDivisionalChartErrors[keyof GenerateDivisionalChartErrors]; export type GenerateDivisionalChartResponses = { /** * Divisional chart calculated successfully */ 200: DivisionalChartResponse; }; export type GenerateDivisionalChartResponse = GenerateDivisionalChartResponses[keyof GenerateDivisionalChartResponses]; export type CalculateGunMilanData = { body?: CompatibilityRequest; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/vedic-astrology/compatibility'; }; export type CalculateGunMilanErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type CalculateGunMilanError = CalculateGunMilanErrors[keyof CalculateGunMilanErrors]; export type CalculateGunMilanResponses = { /** * Ashtakoot Gun Milan result with total score out of 36, percentage, compatibility verdict, detected doshas (Nadi/Bhakoot) with cancellation analysis, dosha cancellation reasons when applicable, recommendation, and detailed breakdown of all 8 kootas. */ 200: CompatibilityResponse; }; export type CalculateGunMilanResponse = CalculateGunMilanResponses[keyof CalculateGunMilanResponses]; export type CalculateDashakootData = { body?: DashakootRequest; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/vedic-astrology/compatibility/dashakoot'; }; export type CalculateDashakootErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type CalculateDashakootError = CalculateDashakootErrors[keyof CalculateDashakootErrors]; export type CalculateDashakootResponses = { /** * Ten porutham sheet with a pass or fail and an explanation on every porutham, the total out of ten, the Rajju and Vedha vetoes, and an overall verdict. */ 200: DashakootResponse; }; export type CalculateDashakootResponse = CalculateDashakootResponses[keyof CalculateDashakootResponses]; export type CalculatePapasamyamData = { body?: PapasamyamRequest; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/vedic-astrology/compatibility/papasamyam'; }; export type CalculatePapasamyamErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type CalculatePapasamyamError = CalculatePapasamyamErrors[keyof CalculatePapasamyamErrors]; export type CalculatePapasamyamResponses = { /** * Papa point totals for both charts with the graha and bhava behind every point, and a balanced or unbalanced verdict on the comparison. */ 200: PapasamyamResponse; }; export type CalculatePapasamyamResponse = CalculatePapasamyamResponses[keyof CalculatePapasamyamResponses]; export type GetPlanetPositionsData = { body?: PlanetaryPositionsRequest; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/vedic-astrology/planetary-positions'; }; export type GetPlanetPositionsErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetPlanetPositionsError = GetPlanetPositionsErrors[keyof GetPlanetPositionsErrors]; export type GetPlanetPositionsResponses = { /** * Successful planetary positions calculation */ 200: PlanetaryPositionsResponse; }; export type GetPlanetPositionsResponse = GetPlanetPositionsResponses[keyof GetPlanetPositionsResponses]; export type GetMonthlyEphemerisData = { body?: { /** * Year for monthly ephemeris (1900-2100). Defaults to the current year (UTC). */ year?: number; /** * Month number (1-12) for ephemeris. Defaults to the current month (UTC). */ month?: number; /** * Coordinate system for longitude output. "sidereal" (Nirayana) uses Lahiri ayanamsa, the standard for Vedic astrology. "tropical" (Sayana) uses raw ecliptic longitude matching Western astrology. Defaults to "sidereal". */ coordinateSystem?: 'sidereal' | 'tropical'; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/vedic-astrology/planetary-positions/monthly'; }; export type GetMonthlyEphemerisErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetMonthlyEphemerisError = GetMonthlyEphemerisErrors[keyof GetMonthlyEphemerisErrors]; export type GetMonthlyEphemerisResponses = { /** * Monthly ephemeris data */ 200: { /** * Year of the ephemeris. Echoes the year that was requested, or the current UTC year when it was omitted. */ year: number; /** * Month of the ephemeris. Echoes the month that was requested, or the current UTC month when it was omitted. */ month: number; /** * Daily planetary position entries for the entire month. */ days: Array<{ /** * Date in YYYY-MM-DD format. */ date: string; /** * Sidereal positions of all 9 Vedic planets on this date at noon UTC. */ positions: Array<{ /** * Planet name, one of the Navagraha (Sun, Moon, Mars, Mercury, Jupiter, Venus, Saturn, Rahu, Ketu). Always English, whatever the lang parameter says, so it stays safe to compare against in code. Use planetLocalized for anything a reader sees. */ planet: string; /** * Planet name in the requested language, for display. Present only when lang is set to a language other than English, since in English it would repeat planet exactly. Rahu and Ketu are rendered as the lunar nodes they are, so Spanish returns Nodo Norte and Nodo Sur while Hindi returns their Sanskrit names. */ planetLocalized?: string; /** * Sidereal ecliptic longitude in degrees (0-360) using Lahiri ayanamsa. */ longitude: number; /** * Zodiac sign (rashi) the planet occupies on this date. Always English, whatever the lang parameter says, so it stays safe to compare against in code. Use signLocalized for anything a reader sees. */ sign: string; /** * Zodiac sign name in the requested language, for display. Present only when lang is set to a language other than English, since in English it would repeat sign exactly. */ signLocalized?: string; /** * Degrees traversed within the current sign (0-30). Useful for precise transit tracking. */ degreeInSign: number; /** * Whether the planet is in retrograde motion (vakri) on this date. */ isRetrograde: boolean; }>; }>; }; }; export type GetMonthlyEphemerisResponse = GetMonthlyEphemerisResponses[keyof GetMonthlyEphemerisResponses]; export type GetCurrentDashaData = { body?: { /** * Birth date in YYYY-MM-DD format. Date determines planetary positions and nakshatra calculations for Vedic kundli (janam patri). Accurate birth date is essential for dashas, yoga calculations, and divisional charts (vargas). */ date: string; /** * Birth time in 24-hour HH:MM:SS format. Time is CRITICAL for Lagna (Ascendant) calculation and house divisions. It changes every two hours roughly. Even minutes matter for accurate nakshatra pada and divisional chart (D9, D10) calculations. Without exact time, Lagna and house-based predictions will be incorrect. */ time: string; /** * Birth location latitude in decimal degrees. Location determines local sidereal time for Lagna calculation and affects bhava (house) cusps. Example: Delhi 28.6139, Mumbai 19.0760, Kathmandu 27.7172. */ latitude: number; /** * Birth location longitude in decimal degrees. Affects local time calculations and ayanamsha adjustments. Example: Delhi 77.2090, Mumbai 72.8777, Kathmandu 85.3240. */ longitude: number; /** * Timezone: IANA name (e.g. "America/New_York", "Europe/London") OR decimal hours from UTC (e.g. -5 for EST, 1 for CET). IANA strings are resolved to the offset in force at the given date and time, so you can pass `cities[0].timezone` from /location/search directly. Defaults to 5.5. */ timezone?: number | string; /** * Ayanamsa system used to place the birth Moon in its nakshatra, which sets every dasha start and end date. "lahiri" uses Lahiri/Chitrapaksha, the traditional Vedic standard, and is the default. "kp-newcomb" uses the KP-Newcomb dynamic formula, matching Krishnamurti Paddhati software. "kp-old" uses the Krishnamurti original table from KP Reader-1. "raman" uses the B.V. Raman ayanamsa, the second frame traditional Indian software commonly offers beside Lahiri. "custom" takes your own value in degrees via ayanamsaValue, for reconciling exactly against a specific reference program. Switching frames shifts every dasha boundary by weeks, so pick the one your reference software uses. */ ayanamsa?: 'kp-newcomb' | 'kp-old' | 'lahiri' | 'raman' | 'custom'; /** * Custom ayanamsa value in degrees. When provided, overrides the computed ayanamsa from the selected type. Use for testing with specific ayanamsa values or matching a particular reference source. */ ayanamsaValue?: number; /** * Set true to attach the KP significators of each period lord: its star lord, sub lord, occupied house, the houses it signifies at levels L1 to L4, and a strength grade. Off by default, so responses stay exactly as they are for clients that only need dates. Requires the birth latitude and longitude, since significators are read off a Placidus house chart, and uses the same ayanamsa frame selected above. */ significators?: boolean; /** * Lunar node type for Rahu and Ketu, used ONLY when "significators" is true. Dasha dates themselves come from the Moon and never move with this field. "mean" uses the smooth mean node (traditional default). "true" uses the osculating node, which swings up to 1.5 degrees either side of mean over a 173-day cycle and can therefore change which house or star a node falls in. Defaults to "mean". */ nodeType?: 'mean' | 'true'; /** * ISO 8601 datetime (YYYY-MM-DDTHH:MM:SS) to read the running periods at, for a reading prepared for a future day, a backtest, or a chart cast for a past moment. Defaults to the current instant. Interpreted as local time in the request timezone (a trailing Z is accepted but ignored); with timezone 0 it is UTC. */ datetime?: string; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; /** * Which signification vocabulary the houseThemes map returns. "general" gives the classical bhava significations (self, wealth, siblings, home, and so on). "finance" gives the money reading of the same twelve bhavas, so house 2 returns income and savings, 5 speculation and risk appetite, 8 sudden money and leverage, 11 gains and profits, and 12 expenses and capital outflow. Use "finance" for wealth, income, business and market timing questions in Krishnamurti Paddhati, where the significator house groups 2, 6, 10, 11 for earned income and 5, 8, 11 for speculation are read against a running dasha. Defaults to "general". */ focus?: 'general' | 'finance'; }; url: '/vedic-astrology/dasha/current'; }; export type GetCurrentDashaErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetCurrentDashaError = GetCurrentDashaErrors[keyof GetCurrentDashaErrors]; export type GetCurrentDashaResponses = { /** * Currently active Mahadasha, Antardasha, Pratyantardasha, Sookshma and Prana dasha with start/end dates, remaining balance, Moon nakshatra, and Vedic interpretations for each period. */ 200: { /** * Significations of each of the twelve bhavas (houses), keyed by house number 1 to 12, as short keywords. Bhava 1 is the Lagna (self, body, vitality), 2 wealth and speech, 4 home and mother, 7 marriage and partnership, 10 career and status, 11 gains. Use it to label the house numbers returned elsewhere in the response: a Vimshottari dasha period signifying houses 2, 7 and 8, or a KP significator carrying houses 11 and 6, becomes readable text without a separate lookup call. Returned once per response rather than repeated per period, and localized by the lang query parameter alongside every other interpretation field. */ houseThemes?: { [key: string]: Array; }; /** * Which signification vocabulary produced the houseThemes keywords in this response, echoing the focus query parameter. Always present, and "general" when the parameter was omitted. Read it to label a rendered house legend, or to tell two cached responses apart when only one asked for the finance lens. */ focus?: 'general' | 'finance'; /** * Birth Moon nakshatra number (1-27). This nakshatra determines the starting dasha lord in the Vimshottari 120-year cycle. */ moonNakshatra: number; /** * Name of the birth Moon nakshatra (lunar mansion). One of 27 Vedic nakshatras from Ashwini to Revati. */ nakshatraName: string; /** * Vimshottari dasha lord of the birth nakshatra. This planet rules the first Mahadasha in the native life cycle. */ nakshatraLord: 'Ketu' | 'Venus' | 'Sun' | 'Moon' | 'Mars' | 'Rahu' | 'Jupiter' | 'Saturn' | 'Mercury'; /** * Sidereal (nirayana) longitude of the birth Moon in degrees, 0 to 360, measured in the ayanamsa frame reported below. This single value determines the birth nakshatra and therefore every dasha start and end date in this response. Compare it against a reference chart to reconcile any date difference at its source. */ moonLongitude: number; /** * Ayanamsa actually applied, in degrees. The precession offset subtracted from the tropical (sayana) longitude to get the sidereal (nirayana) one. Lahiri sits near 23 deg 43 min for a 1990 birth, KP-Newcomb near 23 deg 38 min. */ ayanamsa: number; /** * Ayanamsa system used, echoing the request field. One of "lahiri", "kp-newcomb", "kp-old" or "custom". Echoed so a client can confirm which frame produced these dates without re-deriving it. When it reads "custom" the ayanamsa field above carries the exact value you supplied. */ ayanamsaType: 'kp-newcomb' | 'kp-old' | 'lahiri' | 'raman' | 'custom'; /** * Mahadasha (major planetary period) in the 120-year Vimshottari dasha cycle. Start and end dates are determined by Moon nakshatra at birth. */ mahadasha: { /** * Ruling graha of this Vimshottari dasha period. One of 9 planets in the Ketu-Venus-Sun-Moon-Mars-Rahu-Jupiter-Saturn-Mercury sequence. */ planet: 'Ketu' | 'Venus' | 'Sun' | 'Moon' | 'Mars' | 'Rahu' | 'Jupiter' | 'Saturn' | 'Mercury'; /** * Start datetime of this dasha period. Adjusted to the requested timezone offset. */ startDate: string; /** * End datetime of this dasha period. Adjusted to the requested timezone offset. */ endDate: string; /** * Duration of this dasha period in years. Mahadasha durations range from 6 years (Sun) to 20 years (Venus). */ durationYears: number; /** * Theoretical start of this period, present ONLY when the birth date truncated it. The Vimshottari cycle is already running when a native is born, so the period in force at birth began earlier: startDate is clipped to the birth moment while this field keeps the real start. Its presence is also why the first period of a chart can contain fewer than 9 sub-periods, the earlier ones having finished before birth. Absent on every period that runs its full length. */ nominalStartDate?: string; /** * Vedic interpretation of the planetary period describing themes, karmic lessons, and life areas affected by this graha. */ interpretation?: string; /** * KP significators of this period lord, read from the Placidus birth chart in the requested ayanamsa. Present only when the request sets "significators": true. */ significators?: { /** * House 1-12 this lord occupies in the Placidus birth chart. Its own Level 2 signification, repeated here because the occupied house is the first thing a KP reading looks at. */ house: number; /** * Lord of the nakshatra this planet sits in, one of the 9 grahas. In KP the star lord outranks the planet itself: a period lord mainly delivers the houses its star lord occupies and owns, which is why those appear at L1 and L3 rather than the planet own house. */ starLord: string; /** * KP sub lord of this planet, the 1 of 249 subdivision its longitude falls in, one of the 9 grahas. The star lord says WHAT results the period gives, the sub lord says WHETHER they materialize, so KP judgement checks both. */ subLord?: string; /** * KP 4-level significator breakdown showing which houses (1-12) this planet signifies at each strength tier. L1 is strongest, L4 is weakest. */ signifies: { /** * Level 1, the strongest signification (grade A). Houses influenced because this planet sits in the nakshatra (star) of a planet occupying those houses. For Rahu and Ketu, also includes the L1 houses of their agent planets (conjoined, aspecting, sign lord). */ L1: Array; /** * Level 2 (grade B). The house this planet physically occupies. For Rahu and Ketu, also includes houses occupied by their agent planets. */ L2: Array; /** * Level 3 (grade C). Houses influenced because this planet sits in the nakshatra of the sign lord (owner) of those houses. For Rahu and Ketu, also includes the L3 houses of their agent planets. */ L3: Array; /** * Level 4, the weakest signification (grade D). Houses this planet rules by zodiac sign ownership, up to 2 for Sun through Saturn and 3 where a sign is intercepted. Rahu and Ketu own no sign, so their L4 comes entirely from their agent planets. */ L4: Array; }; /** * Every house this lord signifies, deduplicated and ordered strongest tier first. Where a house is reached at more than one level it is listed once, at its strongest. This is the flat "houses signified" column of a KP dasha table. */ signifiedHouses: Array; /** * Subset of signifiedHouses reached at grade A or B (levels L1 and L2). These are the houses a KP reading acts on for this period; the rest are supporting connections. */ strongHouses: Array; /** * How firmly this lord is tied to the houses it signifies, on the KP A to D significator grading. Reproducible from the significator levels alone, in two steps. STEP 1, per house keep only the strongest level: a planet routinely reaches the same house at more than one level, for example its star lord occupies house 11 and it also owns house 11, and KP cites a significator by its best connection, so that house counts once at grade A. This is why signifiedHouses is shorter than the four level arrays concatenated, and omitting it is what makes a hand calculation disagree. STEP 2, average the surviving weights: each house contributes 100, 75, 50 or 25 for grade A, B, C or D, and the mean is the score. Worked example, a lord signifying house 11 at level 1, house 6 at level 2 and house 2 at level 4 scores (100 + 75 + 25) / 3 = 66.7, which lands in band B because the band edges are the midpoints 87.5, 62.5 and 37.5. The score says how firmly the lord is connected, never whether the houses are favourable, which depends on the matter being judged. */ strength: { /** * Mean KP percentage weight across signifiedHouses, each house counted at its strongest level (A 100, B 75, C 50, D 25). A mean rather than a total, so signifying many houses weakly does not outrank signifying two houses at grade A. */ score: number; /** * Band the score falls in, on the standard KP significator grading: A planets in the constellation of the occupant, B occupants, C planets in the constellation of the house owner, D the house owner. Band edges are the midpoints between the four weights. */ grade: 'A' | 'B' | 'C' | 'D'; /** * Plain-language form of grade: "very-strong" for A, "strong" for B, "moderate" for C, "weak" for D. Says how firmly this lord is connected to the houses it signifies, NOT whether those houses are favourable, which depends on the matter being judged. */ label: 'very-strong' | 'strong' | 'moderate' | 'weak'; }; }; }; /** * Antardasha (bhukti), sub-period within a Mahadasha. Each Mahadasha contains 9 Antardashas proportional to the Vimshottari years of each planet. */ antardasha: { /** * Ruling graha of this Vimshottari dasha period. One of 9 planets in the Ketu-Venus-Sun-Moon-Mars-Rahu-Jupiter-Saturn-Mercury sequence. */ planet: 'Ketu' | 'Venus' | 'Sun' | 'Moon' | 'Mars' | 'Rahu' | 'Jupiter' | 'Saturn' | 'Mercury'; /** * Start datetime of this dasha period. Adjusted to the requested timezone offset. */ startDate: string; /** * End datetime of this dasha period. Adjusted to the requested timezone offset. */ endDate: string; /** * Duration of this dasha period in years. Mahadasha durations range from 6 years (Sun) to 20 years (Venus). */ durationYears: number; /** * Theoretical start of this period, present ONLY when the birth date truncated it. The Vimshottari cycle is already running when a native is born, so the period in force at birth began earlier: startDate is clipped to the birth moment while this field keeps the real start. Its presence is also why the first period of a chart can contain fewer than 9 sub-periods, the earlier ones having finished before birth. Absent on every period that runs its full length. */ nominalStartDate?: string; /** * Vedic interpretation of the planetary period describing themes, karmic lessons, and life areas affected by this graha. */ interpretation?: string; /** * KP significators of this period lord, read from the Placidus birth chart in the requested ayanamsa. Present only when the request sets "significators": true. */ significators?: { /** * House 1-12 this lord occupies in the Placidus birth chart. Its own Level 2 signification, repeated here because the occupied house is the first thing a KP reading looks at. */ house: number; /** * Lord of the nakshatra this planet sits in, one of the 9 grahas. In KP the star lord outranks the planet itself: a period lord mainly delivers the houses its star lord occupies and owns, which is why those appear at L1 and L3 rather than the planet own house. */ starLord: string; /** * KP sub lord of this planet, the 1 of 249 subdivision its longitude falls in, one of the 9 grahas. The star lord says WHAT results the period gives, the sub lord says WHETHER they materialize, so KP judgement checks both. */ subLord?: string; /** * KP 4-level significator breakdown showing which houses (1-12) this planet signifies at each strength tier. L1 is strongest, L4 is weakest. */ signifies: { /** * Level 1, the strongest signification (grade A). Houses influenced because this planet sits in the nakshatra (star) of a planet occupying those houses. For Rahu and Ketu, also includes the L1 houses of their agent planets (conjoined, aspecting, sign lord). */ L1: Array; /** * Level 2 (grade B). The house this planet physically occupies. For Rahu and Ketu, also includes houses occupied by their agent planets. */ L2: Array; /** * Level 3 (grade C). Houses influenced because this planet sits in the nakshatra of the sign lord (owner) of those houses. For Rahu and Ketu, also includes the L3 houses of their agent planets. */ L3: Array; /** * Level 4, the weakest signification (grade D). Houses this planet rules by zodiac sign ownership, up to 2 for Sun through Saturn and 3 where a sign is intercepted. Rahu and Ketu own no sign, so their L4 comes entirely from their agent planets. */ L4: Array; }; /** * Every house this lord signifies, deduplicated and ordered strongest tier first. Where a house is reached at more than one level it is listed once, at its strongest. This is the flat "houses signified" column of a KP dasha table. */ signifiedHouses: Array; /** * Subset of signifiedHouses reached at grade A or B (levels L1 and L2). These are the houses a KP reading acts on for this period; the rest are supporting connections. */ strongHouses: Array; /** * How firmly this lord is tied to the houses it signifies, on the KP A to D significator grading. Reproducible from the significator levels alone, in two steps. STEP 1, per house keep only the strongest level: a planet routinely reaches the same house at more than one level, for example its star lord occupies house 11 and it also owns house 11, and KP cites a significator by its best connection, so that house counts once at grade A. This is why signifiedHouses is shorter than the four level arrays concatenated, and omitting it is what makes a hand calculation disagree. STEP 2, average the surviving weights: each house contributes 100, 75, 50 or 25 for grade A, B, C or D, and the mean is the score. Worked example, a lord signifying house 11 at level 1, house 6 at level 2 and house 2 at level 4 scores (100 + 75 + 25) / 3 = 66.7, which lands in band B because the band edges are the midpoints 87.5, 62.5 and 37.5. The score says how firmly the lord is connected, never whether the houses are favourable, which depends on the matter being judged. */ strength: { /** * Mean KP percentage weight across signifiedHouses, each house counted at its strongest level (A 100, B 75, C 50, D 25). A mean rather than a total, so signifying many houses weakly does not outrank signifying two houses at grade A. */ score: number; /** * Band the score falls in, on the standard KP significator grading: A planets in the constellation of the occupant, B occupants, C planets in the constellation of the house owner, D the house owner. Band edges are the midpoints between the four weights. */ grade: 'A' | 'B' | 'C' | 'D'; /** * Plain-language form of grade: "very-strong" for A, "strong" for B, "moderate" for C, "weak" for D. Says how firmly this lord is connected to the houses it signifies, NOT whether those houses are favourable, which depends on the matter being judged. */ label: 'very-strong' | 'strong' | 'moderate' | 'weak'; }; }; /** * Parent Mahadasha lord under which this Antardasha sub-period runs. */ mahadashaLord: 'Ketu' | 'Venus' | 'Sun' | 'Moon' | 'Mars' | 'Rahu' | 'Jupiter' | 'Saturn' | 'Mercury'; }; /** * Pratyantardasha (sub-sub-period), the third level of the Vimshottari dasha hierarchy, Provides finer timing within each Antardasha for event prediction. */ pratyantardasha: { /** * Ruling graha of this Vimshottari dasha period. One of 9 planets in the Ketu-Venus-Sun-Moon-Mars-Rahu-Jupiter-Saturn-Mercury sequence. */ planet: 'Ketu' | 'Venus' | 'Sun' | 'Moon' | 'Mars' | 'Rahu' | 'Jupiter' | 'Saturn' | 'Mercury'; /** * Start datetime of this dasha period. Adjusted to the requested timezone offset. */ startDate: string; /** * End datetime of this dasha period. Adjusted to the requested timezone offset. */ endDate: string; /** * Duration of this dasha period in years. Mahadasha durations range from 6 years (Sun) to 20 years (Venus). */ durationYears: number; /** * Theoretical start of this period, present ONLY when the birth date truncated it. The Vimshottari cycle is already running when a native is born, so the period in force at birth began earlier: startDate is clipped to the birth moment while this field keeps the real start. Its presence is also why the first period of a chart can contain fewer than 9 sub-periods, the earlier ones having finished before birth. Absent on every period that runs its full length. */ nominalStartDate?: string; /** * Vedic interpretation of the planetary period describing themes, karmic lessons, and life areas affected by this graha. */ interpretation?: string; /** * KP significators of this period lord, read from the Placidus birth chart in the requested ayanamsa. Present only when the request sets "significators": true. */ significators?: { /** * House 1-12 this lord occupies in the Placidus birth chart. Its own Level 2 signification, repeated here because the occupied house is the first thing a KP reading looks at. */ house: number; /** * Lord of the nakshatra this planet sits in, one of the 9 grahas. In KP the star lord outranks the planet itself: a period lord mainly delivers the houses its star lord occupies and owns, which is why those appear at L1 and L3 rather than the planet own house. */ starLord: string; /** * KP sub lord of this planet, the 1 of 249 subdivision its longitude falls in, one of the 9 grahas. The star lord says WHAT results the period gives, the sub lord says WHETHER they materialize, so KP judgement checks both. */ subLord?: string; /** * KP 4-level significator breakdown showing which houses (1-12) this planet signifies at each strength tier. L1 is strongest, L4 is weakest. */ signifies: { /** * Level 1, the strongest signification (grade A). Houses influenced because this planet sits in the nakshatra (star) of a planet occupying those houses. For Rahu and Ketu, also includes the L1 houses of their agent planets (conjoined, aspecting, sign lord). */ L1: Array; /** * Level 2 (grade B). The house this planet physically occupies. For Rahu and Ketu, also includes houses occupied by their agent planets. */ L2: Array; /** * Level 3 (grade C). Houses influenced because this planet sits in the nakshatra of the sign lord (owner) of those houses. For Rahu and Ketu, also includes the L3 houses of their agent planets. */ L3: Array; /** * Level 4, the weakest signification (grade D). Houses this planet rules by zodiac sign ownership, up to 2 for Sun through Saturn and 3 where a sign is intercepted. Rahu and Ketu own no sign, so their L4 comes entirely from their agent planets. */ L4: Array; }; /** * Every house this lord signifies, deduplicated and ordered strongest tier first. Where a house is reached at more than one level it is listed once, at its strongest. This is the flat "houses signified" column of a KP dasha table. */ signifiedHouses: Array; /** * Subset of signifiedHouses reached at grade A or B (levels L1 and L2). These are the houses a KP reading acts on for this period; the rest are supporting connections. */ strongHouses: Array; /** * How firmly this lord is tied to the houses it signifies, on the KP A to D significator grading. Reproducible from the significator levels alone, in two steps. STEP 1, per house keep only the strongest level: a planet routinely reaches the same house at more than one level, for example its star lord occupies house 11 and it also owns house 11, and KP cites a significator by its best connection, so that house counts once at grade A. This is why signifiedHouses is shorter than the four level arrays concatenated, and omitting it is what makes a hand calculation disagree. STEP 2, average the surviving weights: each house contributes 100, 75, 50 or 25 for grade A, B, C or D, and the mean is the score. Worked example, a lord signifying house 11 at level 1, house 6 at level 2 and house 2 at level 4 scores (100 + 75 + 25) / 3 = 66.7, which lands in band B because the band edges are the midpoints 87.5, 62.5 and 37.5. The score says how firmly the lord is connected, never whether the houses are favourable, which depends on the matter being judged. */ strength: { /** * Mean KP percentage weight across signifiedHouses, each house counted at its strongest level (A 100, B 75, C 50, D 25). A mean rather than a total, so signifying many houses weakly does not outrank signifying two houses at grade A. */ score: number; /** * Band the score falls in, on the standard KP significator grading: A planets in the constellation of the occupant, B occupants, C planets in the constellation of the house owner, D the house owner. Band edges are the midpoints between the four weights. */ grade: 'A' | 'B' | 'C' | 'D'; /** * Plain-language form of grade: "very-strong" for A, "strong" for B, "moderate" for C, "weak" for D. Says how firmly this lord is connected to the houses it signifies, NOT whether those houses are favourable, which depends on the matter being judged. */ label: 'very-strong' | 'strong' | 'moderate' | 'weak'; }; }; /** * Parent Mahadasha lord under which this Antardasha sub-period runs. */ mahadashaLord: 'Ketu' | 'Venus' | 'Sun' | 'Moon' | 'Mars' | 'Rahu' | 'Jupiter' | 'Saturn' | 'Mercury'; /** * Parent Antardasha lord under which this Pratyantardasha runs. */ antardashaLord: 'Ketu' | 'Venus' | 'Sun' | 'Moon' | 'Mars' | 'Rahu' | 'Jupiter' | 'Saturn' | 'Mercury'; }; /** * Sookshma dasha (sookshma antardasha), the fourth level of the Vimshottari dasha hierarchy. Each Pratyantardasha divides into 9 Sookshma periods running roughly 3 to 30 days each, used for day-level event timing and muhurta style selection. */ sookshmaDasha: { /** * Ruling graha of this Vimshottari dasha period. One of 9 planets in the Ketu-Venus-Sun-Moon-Mars-Rahu-Jupiter-Saturn-Mercury sequence. */ planet: 'Ketu' | 'Venus' | 'Sun' | 'Moon' | 'Mars' | 'Rahu' | 'Jupiter' | 'Saturn' | 'Mercury'; /** * Start datetime of this dasha period. Adjusted to the requested timezone offset. */ startDate: string; /** * End datetime of this dasha period. Adjusted to the requested timezone offset. */ endDate: string; /** * Duration of this dasha period in years. Mahadasha durations range from 6 years (Sun) to 20 years (Venus). */ durationYears: number; /** * Theoretical start of this period, present ONLY when the birth date truncated it. The Vimshottari cycle is already running when a native is born, so the period in force at birth began earlier: startDate is clipped to the birth moment while this field keeps the real start. Its presence is also why the first period of a chart can contain fewer than 9 sub-periods, the earlier ones having finished before birth. Absent on every period that runs its full length. */ nominalStartDate?: string; /** * Vedic interpretation of the planetary period describing themes, karmic lessons, and life areas affected by this graha. */ interpretation?: string; /** * KP significators of this period lord, read from the Placidus birth chart in the requested ayanamsa. Present only when the request sets "significators": true. */ significators?: { /** * House 1-12 this lord occupies in the Placidus birth chart. Its own Level 2 signification, repeated here because the occupied house is the first thing a KP reading looks at. */ house: number; /** * Lord of the nakshatra this planet sits in, one of the 9 grahas. In KP the star lord outranks the planet itself: a period lord mainly delivers the houses its star lord occupies and owns, which is why those appear at L1 and L3 rather than the planet own house. */ starLord: string; /** * KP sub lord of this planet, the 1 of 249 subdivision its longitude falls in, one of the 9 grahas. The star lord says WHAT results the period gives, the sub lord says WHETHER they materialize, so KP judgement checks both. */ subLord?: string; /** * KP 4-level significator breakdown showing which houses (1-12) this planet signifies at each strength tier. L1 is strongest, L4 is weakest. */ signifies: { /** * Level 1, the strongest signification (grade A). Houses influenced because this planet sits in the nakshatra (star) of a planet occupying those houses. For Rahu and Ketu, also includes the L1 houses of their agent planets (conjoined, aspecting, sign lord). */ L1: Array; /** * Level 2 (grade B). The house this planet physically occupies. For Rahu and Ketu, also includes houses occupied by their agent planets. */ L2: Array; /** * Level 3 (grade C). Houses influenced because this planet sits in the nakshatra of the sign lord (owner) of those houses. For Rahu and Ketu, also includes the L3 houses of their agent planets. */ L3: Array; /** * Level 4, the weakest signification (grade D). Houses this planet rules by zodiac sign ownership, up to 2 for Sun through Saturn and 3 where a sign is intercepted. Rahu and Ketu own no sign, so their L4 comes entirely from their agent planets. */ L4: Array; }; /** * Every house this lord signifies, deduplicated and ordered strongest tier first. Where a house is reached at more than one level it is listed once, at its strongest. This is the flat "houses signified" column of a KP dasha table. */ signifiedHouses: Array; /** * Subset of signifiedHouses reached at grade A or B (levels L1 and L2). These are the houses a KP reading acts on for this period; the rest are supporting connections. */ strongHouses: Array; /** * How firmly this lord is tied to the houses it signifies, on the KP A to D significator grading. Reproducible from the significator levels alone, in two steps. STEP 1, per house keep only the strongest level: a planet routinely reaches the same house at more than one level, for example its star lord occupies house 11 and it also owns house 11, and KP cites a significator by its best connection, so that house counts once at grade A. This is why signifiedHouses is shorter than the four level arrays concatenated, and omitting it is what makes a hand calculation disagree. STEP 2, average the surviving weights: each house contributes 100, 75, 50 or 25 for grade A, B, C or D, and the mean is the score. Worked example, a lord signifying house 11 at level 1, house 6 at level 2 and house 2 at level 4 scores (100 + 75 + 25) / 3 = 66.7, which lands in band B because the band edges are the midpoints 87.5, 62.5 and 37.5. The score says how firmly the lord is connected, never whether the houses are favourable, which depends on the matter being judged. */ strength: { /** * Mean KP percentage weight across signifiedHouses, each house counted at its strongest level (A 100, B 75, C 50, D 25). A mean rather than a total, so signifying many houses weakly does not outrank signifying two houses at grade A. */ score: number; /** * Band the score falls in, on the standard KP significator grading: A planets in the constellation of the occupant, B occupants, C planets in the constellation of the house owner, D the house owner. Band edges are the midpoints between the four weights. */ grade: 'A' | 'B' | 'C' | 'D'; /** * Plain-language form of grade: "very-strong" for A, "strong" for B, "moderate" for C, "weak" for D. Says how firmly this lord is connected to the houses it signifies, NOT whether those houses are favourable, which depends on the matter being judged. */ label: 'very-strong' | 'strong' | 'moderate' | 'weak'; }; }; /** * Parent Mahadasha lord under which this Antardasha sub-period runs. */ mahadashaLord: 'Ketu' | 'Venus' | 'Sun' | 'Moon' | 'Mars' | 'Rahu' | 'Jupiter' | 'Saturn' | 'Mercury'; /** * Parent Antardasha lord under which this Pratyantardasha runs. */ antardashaLord: 'Ketu' | 'Venus' | 'Sun' | 'Moon' | 'Mars' | 'Rahu' | 'Jupiter' | 'Saturn' | 'Mercury'; /** * Parent Pratyantardasha lord under which this Sookshma dasha runs. */ pratyantardashaLord: 'Ketu' | 'Venus' | 'Sun' | 'Moon' | 'Mars' | 'Rahu' | 'Jupiter' | 'Saturn' | 'Mercury'; }; /** * Prana dasha (praana antardasha), the fifth and finest level of the Vimshottari dasha hierarchy. Each Sookshma dasha divides into 9 Prana periods, running from about 20 minutes inside a Sun Mahadasha to about 4 days inside a Saturn one. This is the level that takes Vimshottari from day-level to hour-level timing, used for muhurta selection and pinpointing the trigger inside an already identified window. */ pranaDasha: { /** * Ruling graha of this Vimshottari dasha period. One of 9 planets in the Ketu-Venus-Sun-Moon-Mars-Rahu-Jupiter-Saturn-Mercury sequence. */ planet: 'Ketu' | 'Venus' | 'Sun' | 'Moon' | 'Mars' | 'Rahu' | 'Jupiter' | 'Saturn' | 'Mercury'; /** * Start datetime of this dasha period. Adjusted to the requested timezone offset. */ startDate: string; /** * End datetime of this dasha period. Adjusted to the requested timezone offset. */ endDate: string; /** * Duration of this dasha period in years. Mahadasha durations range from 6 years (Sun) to 20 years (Venus). */ durationYears: number; /** * Theoretical start of this period, present ONLY when the birth date truncated it. The Vimshottari cycle is already running when a native is born, so the period in force at birth began earlier: startDate is clipped to the birth moment while this field keeps the real start. Its presence is also why the first period of a chart can contain fewer than 9 sub-periods, the earlier ones having finished before birth. Absent on every period that runs its full length. */ nominalStartDate?: string; /** * Vedic interpretation of the planetary period describing themes, karmic lessons, and life areas affected by this graha. */ interpretation?: string; /** * KP significators of this period lord, read from the Placidus birth chart in the requested ayanamsa. Present only when the request sets "significators": true. */ significators?: { /** * House 1-12 this lord occupies in the Placidus birth chart. Its own Level 2 signification, repeated here because the occupied house is the first thing a KP reading looks at. */ house: number; /** * Lord of the nakshatra this planet sits in, one of the 9 grahas. In KP the star lord outranks the planet itself: a period lord mainly delivers the houses its star lord occupies and owns, which is why those appear at L1 and L3 rather than the planet own house. */ starLord: string; /** * KP sub lord of this planet, the 1 of 249 subdivision its longitude falls in, one of the 9 grahas. The star lord says WHAT results the period gives, the sub lord says WHETHER they materialize, so KP judgement checks both. */ subLord?: string; /** * KP 4-level significator breakdown showing which houses (1-12) this planet signifies at each strength tier. L1 is strongest, L4 is weakest. */ signifies: { /** * Level 1, the strongest signification (grade A). Houses influenced because this planet sits in the nakshatra (star) of a planet occupying those houses. For Rahu and Ketu, also includes the L1 houses of their agent planets (conjoined, aspecting, sign lord). */ L1: Array; /** * Level 2 (grade B). The house this planet physically occupies. For Rahu and Ketu, also includes houses occupied by their agent planets. */ L2: Array; /** * Level 3 (grade C). Houses influenced because this planet sits in the nakshatra of the sign lord (owner) of those houses. For Rahu and Ketu, also includes the L3 houses of their agent planets. */ L3: Array; /** * Level 4, the weakest signification (grade D). Houses this planet rules by zodiac sign ownership, up to 2 for Sun through Saturn and 3 where a sign is intercepted. Rahu and Ketu own no sign, so their L4 comes entirely from their agent planets. */ L4: Array; }; /** * Every house this lord signifies, deduplicated and ordered strongest tier first. Where a house is reached at more than one level it is listed once, at its strongest. This is the flat "houses signified" column of a KP dasha table. */ signifiedHouses: Array; /** * Subset of signifiedHouses reached at grade A or B (levels L1 and L2). These are the houses a KP reading acts on for this period; the rest are supporting connections. */ strongHouses: Array; /** * How firmly this lord is tied to the houses it signifies, on the KP A to D significator grading. Reproducible from the significator levels alone, in two steps. STEP 1, per house keep only the strongest level: a planet routinely reaches the same house at more than one level, for example its star lord occupies house 11 and it also owns house 11, and KP cites a significator by its best connection, so that house counts once at grade A. This is why signifiedHouses is shorter than the four level arrays concatenated, and omitting it is what makes a hand calculation disagree. STEP 2, average the surviving weights: each house contributes 100, 75, 50 or 25 for grade A, B, C or D, and the mean is the score. Worked example, a lord signifying house 11 at level 1, house 6 at level 2 and house 2 at level 4 scores (100 + 75 + 25) / 3 = 66.7, which lands in band B because the band edges are the midpoints 87.5, 62.5 and 37.5. The score says how firmly the lord is connected, never whether the houses are favourable, which depends on the matter being judged. */ strength: { /** * Mean KP percentage weight across signifiedHouses, each house counted at its strongest level (A 100, B 75, C 50, D 25). A mean rather than a total, so signifying many houses weakly does not outrank signifying two houses at grade A. */ score: number; /** * Band the score falls in, on the standard KP significator grading: A planets in the constellation of the occupant, B occupants, C planets in the constellation of the house owner, D the house owner. Band edges are the midpoints between the four weights. */ grade: 'A' | 'B' | 'C' | 'D'; /** * Plain-language form of grade: "very-strong" for A, "strong" for B, "moderate" for C, "weak" for D. Says how firmly this lord is connected to the houses it signifies, NOT whether those houses are favourable, which depends on the matter being judged. */ label: 'very-strong' | 'strong' | 'moderate' | 'weak'; }; }; /** * Parent Mahadasha lord under which this Antardasha sub-period runs. */ mahadashaLord: 'Ketu' | 'Venus' | 'Sun' | 'Moon' | 'Mars' | 'Rahu' | 'Jupiter' | 'Saturn' | 'Mercury'; /** * Parent Antardasha lord under which this Pratyantardasha runs. */ antardashaLord: 'Ketu' | 'Venus' | 'Sun' | 'Moon' | 'Mars' | 'Rahu' | 'Jupiter' | 'Saturn' | 'Mercury'; /** * Parent Pratyantardasha lord under which this Sookshma dasha runs. */ pratyantardashaLord: 'Ketu' | 'Venus' | 'Sun' | 'Moon' | 'Mars' | 'Rahu' | 'Jupiter' | 'Saturn' | 'Mercury'; /** * Parent Sookshma dasha lord under which this Prana dasha runs. */ sookshmaLord: 'Ketu' | 'Venus' | 'Sun' | 'Moon' | 'Mars' | 'Rahu' | 'Jupiter' | 'Saturn' | 'Mercury'; }; /** * Houses common to the significators of the running dasha lords. In KP a matter fructifies under lords that jointly signify the houses of that matter, so these two sets are what a prediction is checked against. */ commonHouses?: { /** * Houses signified by ALL FIVE running lords at once (Mahadasha through Prana). The tightest reading available: a house every active level carries is the one the current moment is pointed at. Often empty, which is itself informative, it means the five levels do not converge on a single house. */ allLevels: Array; /** * Houses signified by the Mahadasha, Antardasha and Pratyantardasha lords together, the classical KP three-lord test used to decide whether a matter fructifies in the running period. Wider than allLevels because it ignores the two fastest levels, which is what makes it the practical filter for month-scale predictions. */ dashaBhuktiAntara: Array; }; /** * Time remaining in the currently running Mahadasha (major period). */ remainingInMahadasha: { /** * Full years remaining in this Vimshottari dasha period. */ years: number; /** * Additional months remaining beyond full years. */ months: number; /** * Additional days remaining beyond full months. */ days: number; /** * Total remaining days in this dasha period. Useful for progress calculations. */ totalDays: number; }; /** * Time remaining in the currently running Antardasha (sub-period) within the Mahadasha. */ remainingInAntardasha: { /** * Full years remaining in this Vimshottari dasha period. */ years: number; /** * Additional months remaining beyond full years. */ months: number; /** * Additional days remaining beyond full months. */ days: number; /** * Total remaining days in this dasha period. Useful for progress calculations. */ totalDays: number; }; /** * Time remaining in the currently running Pratyantardasha (sub-sub-period). */ remainingInPratyantardasha: { /** * Full years remaining in this Vimshottari dasha period. */ years: number; /** * Additional months remaining beyond full years. */ months: number; /** * Additional days remaining beyond full months. */ days: number; /** * Total remaining days in this dasha period. Useful for progress calculations. */ totalDays: number; }; /** * Time remaining in the currently running Sookshma dasha (fourth level). Sookshma periods last days rather than months, so this value turns over quickly. */ remainingInSookshma: { /** * Full years remaining in this Vimshottari dasha period. */ years: number; /** * Additional months remaining beyond full years. */ months: number; /** * Additional days remaining beyond full months. */ days: number; /** * Total remaining days in this dasha period. Useful for progress calculations. */ totalDays: number; }; /** * Time remaining in the currently running Prana dasha (fifth level). Prana periods run hours to days, so totalDays is often 0 or 1 and the years and months fields are almost always zero. */ remainingInPrana: { /** * Full years remaining in this Vimshottari dasha period. */ years: number; /** * Additional months remaining beyond full years. */ months: number; /** * Additional days remaining beyond full months. */ days: number; /** * Total remaining days in this dasha period. Useful for progress calculations. */ totalDays: number; }; }; }; export type GetCurrentDashaResponse = GetCurrentDashaResponses[keyof GetCurrentDashaResponses]; export type GetMajorDashasData = { body?: { /** * Birth date in YYYY-MM-DD format. Date determines planetary positions and nakshatra calculations for Vedic kundli (janam patri). Accurate birth date is essential for dashas, yoga calculations, and divisional charts (vargas). */ date: string; /** * Birth time in 24-hour HH:MM:SS format. Time is CRITICAL for Lagna (Ascendant) calculation and house divisions. It changes every two hours roughly. Even minutes matter for accurate nakshatra pada and divisional chart (D9, D10) calculations. Without exact time, Lagna and house-based predictions will be incorrect. */ time: string; /** * Birth location latitude in decimal degrees. Location determines local sidereal time for Lagna calculation and affects bhava (house) cusps. Example: Delhi 28.6139, Mumbai 19.0760, Kathmandu 27.7172. */ latitude: number; /** * Birth location longitude in decimal degrees. Affects local time calculations and ayanamsha adjustments. Example: Delhi 77.2090, Mumbai 72.8777, Kathmandu 85.3240. */ longitude: number; /** * Timezone: IANA name (e.g. "America/New_York", "Europe/London") OR decimal hours from UTC (e.g. -5 for EST, 1 for CET). IANA strings are resolved to the offset in force at the given date and time, so you can pass `cities[0].timezone` from /location/search directly. Defaults to 5.5. */ timezone?: number | string; /** * Ayanamsa system used to place the birth Moon in its nakshatra, which sets every dasha start and end date. "lahiri" uses Lahiri/Chitrapaksha, the traditional Vedic standard, and is the default. "kp-newcomb" uses the KP-Newcomb dynamic formula, matching Krishnamurti Paddhati software. "kp-old" uses the Krishnamurti original table from KP Reader-1. "raman" uses the B.V. Raman ayanamsa, the second frame traditional Indian software commonly offers beside Lahiri. "custom" takes your own value in degrees via ayanamsaValue, for reconciling exactly against a specific reference program. Switching frames shifts every dasha boundary by weeks, so pick the one your reference software uses. */ ayanamsa?: 'kp-newcomb' | 'kp-old' | 'lahiri' | 'raman' | 'custom'; /** * Custom ayanamsa value in degrees. When provided, overrides the computed ayanamsa from the selected type. Use for testing with specific ayanamsa values or matching a particular reference source. */ ayanamsaValue?: number; /** * Set true to attach the KP significators of each period lord: its star lord, sub lord, occupied house, the houses it signifies at levels L1 to L4, and a strength grade. Off by default, so responses stay exactly as they are for clients that only need dates. Requires the birth latitude and longitude, since significators are read off a Placidus house chart, and uses the same ayanamsa frame selected above. */ significators?: boolean; /** * Lunar node type for Rahu and Ketu, used ONLY when "significators" is true. Dasha dates themselves come from the Moon and never move with this field. "mean" uses the smooth mean node (traditional default). "true" uses the osculating node, which swings up to 1.5 degrees either side of mean over a 173-day cycle and can therefore change which house or star a node falls in. Defaults to "mean". */ nodeType?: 'mean' | 'true'; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; /** * Which signification vocabulary the houseThemes map returns. "general" gives the classical bhava significations (self, wealth, siblings, home, and so on). "finance" gives the money reading of the same twelve bhavas, so house 2 returns income and savings, 5 speculation and risk appetite, 8 sudden money and leverage, 11 gains and profits, and 12 expenses and capital outflow. Use "finance" for wealth, income, business and market timing questions in Krishnamurti Paddhati, where the significator house groups 2, 6, 10, 11 for earned income and 5, 8, 11 for speculation are read against a running dasha. Defaults to "general". */ focus?: 'general' | 'finance'; }; url: '/vedic-astrology/dasha/major'; }; export type GetMajorDashasErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetMajorDashasError = GetMajorDashasErrors[keyof GetMajorDashasErrors]; export type GetMajorDashasResponses = { /** * Complete 120-year Vimshottari Dasha timeline with all 9 Mahadasha periods, birth dasha balance, Moon nakshatra, and start/end dates for each planetary period. */ 200: { /** * Significations of each of the twelve bhavas (houses), keyed by house number 1 to 12, as short keywords. Bhava 1 is the Lagna (self, body, vitality), 2 wealth and speech, 4 home and mother, 7 marriage and partnership, 10 career and status, 11 gains. Use it to label the house numbers returned elsewhere in the response: a Vimshottari dasha period signifying houses 2, 7 and 8, or a KP significator carrying houses 11 and 6, becomes readable text without a separate lookup call. Returned once per response rather than repeated per period, and localized by the lang query parameter alongside every other interpretation field. */ houseThemes?: { [key: string]: Array; }; /** * Which signification vocabulary produced the houseThemes keywords in this response, echoing the focus query parameter. Always present, and "general" when the parameter was omitted. Read it to label a rendered house legend, or to tell two cached responses apart when only one asked for the finance lens. */ focus?: 'general' | 'finance'; /** * Birth Moon nakshatra number (1-27) that determines the Vimshottari starting point. */ moonNakshatra: number; /** * Birth Moon nakshatra name, one of 27 Vedic lunar mansions. */ nakshatraName: string; /** * Dasha lord of the birth nakshatra, rules the first Mahadasha. */ nakshatraLord: 'Ketu' | 'Venus' | 'Sun' | 'Moon' | 'Mars' | 'Rahu' | 'Jupiter' | 'Saturn' | 'Mercury'; /** * Sidereal (nirayana) longitude of the birth Moon in degrees, 0 to 360, measured in the ayanamsa frame reported below. This single value determines the birth nakshatra and therefore every dasha start and end date in this response. Compare it against a reference chart to reconcile any date difference at its source. */ moonLongitude: number; /** * Ayanamsa actually applied, in degrees. The precession offset subtracted from the tropical (sayana) longitude to get the sidereal (nirayana) one. Lahiri sits near 23 deg 43 min for a 1990 birth, KP-Newcomb near 23 deg 38 min. */ ayanamsa: number; /** * Ayanamsa system used, echoing the request field. One of "lahiri", "kp-newcomb", "kp-old" or "custom". Echoed so a client can confirm which frame produced these dates without re-deriving it. When it reads "custom" the ayanamsa field above carries the exact value you supplied. */ ayanamsaType: 'kp-newcomb' | 'kp-old' | 'lahiri' | 'raman' | 'custom'; /** * Remaining balance of the first Mahadasha at birth. Based on Moon degree within the birth nakshatra. partial dasha already elapsed before birth. */ birthDashaBalance: { /** * Full years remaining in this Vimshottari dasha period. */ years: number; /** * Additional months remaining beyond full years. */ months: number; /** * Additional days remaining beyond full months. */ days: number; /** * Total remaining days in this dasha period. Useful for progress calculations. */ totalDays: number; }; /** * Complete sequence of all 9 Mahadasha periods spanning 120 years from birth. Follows the Vimshottari order: Ketu(7), Venus(20), Sun(6), Moon(10), Mars(7), Rahu(18), Jupiter(16), Saturn(19), Mercury(17). */ mahadashas: Array<{ /** * Ruling graha of this Vimshottari dasha period. One of 9 planets in the Ketu-Venus-Sun-Moon-Mars-Rahu-Jupiter-Saturn-Mercury sequence. */ planet: 'Ketu' | 'Venus' | 'Sun' | 'Moon' | 'Mars' | 'Rahu' | 'Jupiter' | 'Saturn' | 'Mercury'; /** * Start datetime of this dasha period. Adjusted to the requested timezone offset. */ startDate: string; /** * End datetime of this dasha period. Adjusted to the requested timezone offset. */ endDate: string; /** * Duration of this dasha period in years. Mahadasha durations range from 6 years (Sun) to 20 years (Venus). */ durationYears: number; /** * Theoretical start of this period, present ONLY when the birth date truncated it. The Vimshottari cycle is already running when a native is born, so the period in force at birth began earlier: startDate is clipped to the birth moment while this field keeps the real start. Its presence is also why the first period of a chart can contain fewer than 9 sub-periods, the earlier ones having finished before birth. Absent on every period that runs its full length. */ nominalStartDate?: string; /** * Vedic interpretation of the planetary period describing themes, karmic lessons, and life areas affected by this graha. */ interpretation?: string; /** * KP significators of this period lord, read from the Placidus birth chart in the requested ayanamsa. Present only when the request sets "significators": true. */ significators?: { /** * House 1-12 this lord occupies in the Placidus birth chart. Its own Level 2 signification, repeated here because the occupied house is the first thing a KP reading looks at. */ house: number; /** * Lord of the nakshatra this planet sits in, one of the 9 grahas. In KP the star lord outranks the planet itself: a period lord mainly delivers the houses its star lord occupies and owns, which is why those appear at L1 and L3 rather than the planet own house. */ starLord: string; /** * KP sub lord of this planet, the 1 of 249 subdivision its longitude falls in, one of the 9 grahas. The star lord says WHAT results the period gives, the sub lord says WHETHER they materialize, so KP judgement checks both. */ subLord?: string; /** * KP 4-level significator breakdown showing which houses (1-12) this planet signifies at each strength tier. L1 is strongest, L4 is weakest. */ signifies: { /** * Level 1, the strongest signification (grade A). Houses influenced because this planet sits in the nakshatra (star) of a planet occupying those houses. For Rahu and Ketu, also includes the L1 houses of their agent planets (conjoined, aspecting, sign lord). */ L1: Array; /** * Level 2 (grade B). The house this planet physically occupies. For Rahu and Ketu, also includes houses occupied by their agent planets. */ L2: Array; /** * Level 3 (grade C). Houses influenced because this planet sits in the nakshatra of the sign lord (owner) of those houses. For Rahu and Ketu, also includes the L3 houses of their agent planets. */ L3: Array; /** * Level 4, the weakest signification (grade D). Houses this planet rules by zodiac sign ownership, up to 2 for Sun through Saturn and 3 where a sign is intercepted. Rahu and Ketu own no sign, so their L4 comes entirely from their agent planets. */ L4: Array; }; /** * Every house this lord signifies, deduplicated and ordered strongest tier first. Where a house is reached at more than one level it is listed once, at its strongest. This is the flat "houses signified" column of a KP dasha table. */ signifiedHouses: Array; /** * Subset of signifiedHouses reached at grade A or B (levels L1 and L2). These are the houses a KP reading acts on for this period; the rest are supporting connections. */ strongHouses: Array; /** * How firmly this lord is tied to the houses it signifies, on the KP A to D significator grading. Reproducible from the significator levels alone, in two steps. STEP 1, per house keep only the strongest level: a planet routinely reaches the same house at more than one level, for example its star lord occupies house 11 and it also owns house 11, and KP cites a significator by its best connection, so that house counts once at grade A. This is why signifiedHouses is shorter than the four level arrays concatenated, and omitting it is what makes a hand calculation disagree. STEP 2, average the surviving weights: each house contributes 100, 75, 50 or 25 for grade A, B, C or D, and the mean is the score. Worked example, a lord signifying house 11 at level 1, house 6 at level 2 and house 2 at level 4 scores (100 + 75 + 25) / 3 = 66.7, which lands in band B because the band edges are the midpoints 87.5, 62.5 and 37.5. The score says how firmly the lord is connected, never whether the houses are favourable, which depends on the matter being judged. */ strength: { /** * Mean KP percentage weight across signifiedHouses, each house counted at its strongest level (A 100, B 75, C 50, D 25). A mean rather than a total, so signifying many houses weakly does not outrank signifying two houses at grade A. */ score: number; /** * Band the score falls in, on the standard KP significator grading: A planets in the constellation of the occupant, B occupants, C planets in the constellation of the house owner, D the house owner. Band edges are the midpoints between the four weights. */ grade: 'A' | 'B' | 'C' | 'D'; /** * Plain-language form of grade: "very-strong" for A, "strong" for B, "moderate" for C, "weak" for D. Says how firmly this lord is connected to the houses it signifies, NOT whether those houses are favourable, which depends on the matter being judged. */ label: 'very-strong' | 'strong' | 'moderate' | 'weak'; }; }; }>; /** * Total Vimshottari cycle length in years (always 120). */ totalYears: number; }; }; export type GetMajorDashasResponse = GetMajorDashasResponses[keyof GetMajorDashasResponses]; export type GetSubDashasData = { body?: { /** * Birth date in YYYY-MM-DD format. Date determines planetary positions and nakshatra calculations for Vedic kundli (janam patri). Accurate birth date is essential for dashas, yoga calculations, and divisional charts (vargas). */ date: string; /** * Birth time in 24-hour HH:MM:SS format. Time is CRITICAL for Lagna (Ascendant) calculation and house divisions. It changes every two hours roughly. Even minutes matter for accurate nakshatra pada and divisional chart (D9, D10) calculations. Without exact time, Lagna and house-based predictions will be incorrect. */ time: string; /** * Birth location latitude in decimal degrees. Location determines local sidereal time for Lagna calculation and affects bhava (house) cusps. Example: Delhi 28.6139, Mumbai 19.0760, Kathmandu 27.7172. */ latitude: number; /** * Birth location longitude in decimal degrees. Affects local time calculations and ayanamsha adjustments. Example: Delhi 77.2090, Mumbai 72.8777, Kathmandu 85.3240. */ longitude: number; /** * Timezone: IANA name (e.g. "America/New_York", "Europe/London") OR decimal hours from UTC (e.g. -5 for EST, 1 for CET). IANA strings are resolved to the offset in force at the given date and time, so you can pass `cities[0].timezone` from /location/search directly. Defaults to 5.5. */ timezone?: number | string; /** * Ayanamsa system used to place the birth Moon in its nakshatra, which sets every dasha start and end date. "lahiri" uses Lahiri/Chitrapaksha, the traditional Vedic standard, and is the default. "kp-newcomb" uses the KP-Newcomb dynamic formula, matching Krishnamurti Paddhati software. "kp-old" uses the Krishnamurti original table from KP Reader-1. "raman" uses the B.V. Raman ayanamsa, the second frame traditional Indian software commonly offers beside Lahiri. "custom" takes your own value in degrees via ayanamsaValue, for reconciling exactly against a specific reference program. Switching frames shifts every dasha boundary by weeks, so pick the one your reference software uses. */ ayanamsa?: 'kp-newcomb' | 'kp-old' | 'lahiri' | 'raman' | 'custom'; /** * Custom ayanamsa value in degrees. When provided, overrides the computed ayanamsa from the selected type. Use for testing with specific ayanamsa values or matching a particular reference source. */ ayanamsaValue?: number; /** * Set true to attach the KP significators of each period lord: its star lord, sub lord, occupied house, the houses it signifies at levels L1 to L4, and a strength grade. Off by default, so responses stay exactly as they are for clients that only need dates. Requires the birth latitude and longitude, since significators are read off a Placidus house chart, and uses the same ayanamsa frame selected above. */ significators?: boolean; /** * Lunar node type for Rahu and Ketu, used ONLY when "significators" is true. Dasha dates themselves come from the Moon and never move with this field. "mean" uses the smooth mean node (traditional default). "true" uses the osculating node, which swings up to 1.5 degrees either side of mean over a 173-day cycle and can therefore change which house or star a node falls in. Defaults to "mean". */ nodeType?: 'mean' | 'true'; }; path: { /** * Mahadasha planet name, case-insensitive (e.g., jupiter, Jupiter, JUPITER all work). Valid: Ketu, Venus, Sun, Moon, Mars, Rahu, Jupiter, Saturn, Mercury. */ mahadasha: 'Ketu' | 'Venus' | 'Sun' | 'Moon' | 'Mars' | 'Rahu' | 'Jupiter' | 'Saturn' | 'Mercury'; }; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; /** * Which signification vocabulary the houseThemes map returns. "general" gives the classical bhava significations (self, wealth, siblings, home, and so on). "finance" gives the money reading of the same twelve bhavas, so house 2 returns income and savings, 5 speculation and risk appetite, 8 sudden money and leverage, 11 gains and profits, and 12 expenses and capital outflow. Use "finance" for wealth, income, business and market timing questions in Krishnamurti Paddhati, where the significator house groups 2, 6, 10, 11 for earned income and 5, 8, 11 for speculation are read against a running dasha. Defaults to "general". */ focus?: 'general' | 'finance'; }; url: '/vedic-astrology/dasha/sub/{mahadasha}'; }; export type GetSubDashasErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetSubDashasError = GetSubDashasErrors[keyof GetSubDashasErrors]; export type GetSubDashasResponses = { /** * All 9 Antardasha sub-periods within the specified Mahadasha, with start/end dates and the parent Mahadasha period details. */ 200: { /** * Significations of each of the twelve bhavas (houses), keyed by house number 1 to 12, as short keywords. Bhava 1 is the Lagna (self, body, vitality), 2 wealth and speech, 4 home and mother, 7 marriage and partnership, 10 career and status, 11 gains. Use it to label the house numbers returned elsewhere in the response: a Vimshottari dasha period signifying houses 2, 7 and 8, or a KP significator carrying houses 11 and 6, becomes readable text without a separate lookup call. Returned once per response rather than repeated per period, and localized by the lang query parameter alongside every other interpretation field. */ houseThemes?: { [key: string]: Array; }; /** * Which signification vocabulary produced the houseThemes keywords in this response, echoing the focus query parameter. Always present, and "general" when the parameter was omitted. Read it to label a rendered house legend, or to tell two cached responses apart when only one asked for the finance lens. */ focus?: 'general' | 'finance'; /** * Ruling planet of the requested Mahadasha period. */ mahadashaLord: 'Ketu' | 'Venus' | 'Sun' | 'Moon' | 'Mars' | 'Rahu' | 'Jupiter' | 'Saturn' | 'Mercury'; /** * Sidereal (nirayana) longitude of the birth Moon in degrees, 0 to 360, measured in the ayanamsa frame reported below. This single value determines the birth nakshatra and therefore every dasha start and end date in this response. Compare it against a reference chart to reconcile any date difference at its source. */ moonLongitude: number; /** * Ayanamsa actually applied, in degrees. The precession offset subtracted from the tropical (sayana) longitude to get the sidereal (nirayana) one. Lahiri sits near 23 deg 43 min for a 1990 birth, KP-Newcomb near 23 deg 38 min. */ ayanamsa: number; /** * Ayanamsa system used, echoing the request field. One of "lahiri", "kp-newcomb", "kp-old" or "custom". Echoed so a client can confirm which frame produced these dates without re-deriving it. When it reads "custom" the ayanamsa field above carries the exact value you supplied. */ ayanamsaType: 'kp-newcomb' | 'kp-old' | 'lahiri' | 'raman' | 'custom'; /** * Full details of the parent Mahadasha including start/end dates and duration. */ mahadashaPeriod: { /** * Ruling graha of this Vimshottari dasha period. One of 9 planets in the Ketu-Venus-Sun-Moon-Mars-Rahu-Jupiter-Saturn-Mercury sequence. */ planet: 'Ketu' | 'Venus' | 'Sun' | 'Moon' | 'Mars' | 'Rahu' | 'Jupiter' | 'Saturn' | 'Mercury'; /** * Start datetime of this dasha period. Adjusted to the requested timezone offset. */ startDate: string; /** * End datetime of this dasha period. Adjusted to the requested timezone offset. */ endDate: string; /** * Duration of this dasha period in years. Mahadasha durations range from 6 years (Sun) to 20 years (Venus). */ durationYears: number; /** * Theoretical start of this period, present ONLY when the birth date truncated it. The Vimshottari cycle is already running when a native is born, so the period in force at birth began earlier: startDate is clipped to the birth moment while this field keeps the real start. Its presence is also why the first period of a chart can contain fewer than 9 sub-periods, the earlier ones having finished before birth. Absent on every period that runs its full length. */ nominalStartDate?: string; /** * Vedic interpretation of the planetary period describing themes, karmic lessons, and life areas affected by this graha. */ interpretation?: string; /** * KP significators of this period lord, read from the Placidus birth chart in the requested ayanamsa. Present only when the request sets "significators": true. */ significators?: { /** * House 1-12 this lord occupies in the Placidus birth chart. Its own Level 2 signification, repeated here because the occupied house is the first thing a KP reading looks at. */ house: number; /** * Lord of the nakshatra this planet sits in, one of the 9 grahas. In KP the star lord outranks the planet itself: a period lord mainly delivers the houses its star lord occupies and owns, which is why those appear at L1 and L3 rather than the planet own house. */ starLord: string; /** * KP sub lord of this planet, the 1 of 249 subdivision its longitude falls in, one of the 9 grahas. The star lord says WHAT results the period gives, the sub lord says WHETHER they materialize, so KP judgement checks both. */ subLord?: string; /** * KP 4-level significator breakdown showing which houses (1-12) this planet signifies at each strength tier. L1 is strongest, L4 is weakest. */ signifies: { /** * Level 1, the strongest signification (grade A). Houses influenced because this planet sits in the nakshatra (star) of a planet occupying those houses. For Rahu and Ketu, also includes the L1 houses of their agent planets (conjoined, aspecting, sign lord). */ L1: Array; /** * Level 2 (grade B). The house this planet physically occupies. For Rahu and Ketu, also includes houses occupied by their agent planets. */ L2: Array; /** * Level 3 (grade C). Houses influenced because this planet sits in the nakshatra of the sign lord (owner) of those houses. For Rahu and Ketu, also includes the L3 houses of their agent planets. */ L3: Array; /** * Level 4, the weakest signification (grade D). Houses this planet rules by zodiac sign ownership, up to 2 for Sun through Saturn and 3 where a sign is intercepted. Rahu and Ketu own no sign, so their L4 comes entirely from their agent planets. */ L4: Array; }; /** * Every house this lord signifies, deduplicated and ordered strongest tier first. Where a house is reached at more than one level it is listed once, at its strongest. This is the flat "houses signified" column of a KP dasha table. */ signifiedHouses: Array; /** * Subset of signifiedHouses reached at grade A or B (levels L1 and L2). These are the houses a KP reading acts on for this period; the rest are supporting connections. */ strongHouses: Array; /** * How firmly this lord is tied to the houses it signifies, on the KP A to D significator grading. Reproducible from the significator levels alone, in two steps. STEP 1, per house keep only the strongest level: a planet routinely reaches the same house at more than one level, for example its star lord occupies house 11 and it also owns house 11, and KP cites a significator by its best connection, so that house counts once at grade A. This is why signifiedHouses is shorter than the four level arrays concatenated, and omitting it is what makes a hand calculation disagree. STEP 2, average the surviving weights: each house contributes 100, 75, 50 or 25 for grade A, B, C or D, and the mean is the score. Worked example, a lord signifying house 11 at level 1, house 6 at level 2 and house 2 at level 4 scores (100 + 75 + 25) / 3 = 66.7, which lands in band B because the band edges are the midpoints 87.5, 62.5 and 37.5. The score says how firmly the lord is connected, never whether the houses are favourable, which depends on the matter being judged. */ strength: { /** * Mean KP percentage weight across signifiedHouses, each house counted at its strongest level (A 100, B 75, C 50, D 25). A mean rather than a total, so signifying many houses weakly does not outrank signifying two houses at grade A. */ score: number; /** * Band the score falls in, on the standard KP significator grading: A planets in the constellation of the occupant, B occupants, C planets in the constellation of the house owner, D the house owner. Band edges are the midpoints between the four weights. */ grade: 'A' | 'B' | 'C' | 'D'; /** * Plain-language form of grade: "very-strong" for A, "strong" for B, "moderate" for C, "weak" for D. Says how firmly this lord is connected to the houses it signifies, NOT whether those houses are favourable, which depends on the matter being judged. */ label: 'very-strong' | 'strong' | 'moderate' | 'weak'; }; }; }; /** * Antardasha (bhukti) sub-periods within this Mahadasha, proportional to each planet Vimshottari years, sorted chronologically. Nine for any Mahadasha the native lived through in full. FEWER than nine for the first Mahadasha in the chart, because the Vimshottari cycle was already running at birth: the Antardashas that ended before the birth date are not part of the chart, and the one in force at birth starts on the birth date. */ antardashas: Array<{ /** * Ruling graha of this Vimshottari dasha period. One of 9 planets in the Ketu-Venus-Sun-Moon-Mars-Rahu-Jupiter-Saturn-Mercury sequence. */ planet: 'Ketu' | 'Venus' | 'Sun' | 'Moon' | 'Mars' | 'Rahu' | 'Jupiter' | 'Saturn' | 'Mercury'; /** * Start datetime of this dasha period. Adjusted to the requested timezone offset. */ startDate: string; /** * End datetime of this dasha period. Adjusted to the requested timezone offset. */ endDate: string; /** * Duration of this dasha period in years. Mahadasha durations range from 6 years (Sun) to 20 years (Venus). */ durationYears: number; /** * Theoretical start of this period, present ONLY when the birth date truncated it. The Vimshottari cycle is already running when a native is born, so the period in force at birth began earlier: startDate is clipped to the birth moment while this field keeps the real start. Its presence is also why the first period of a chart can contain fewer than 9 sub-periods, the earlier ones having finished before birth. Absent on every period that runs its full length. */ nominalStartDate?: string; /** * Vedic interpretation of the planetary period describing themes, karmic lessons, and life areas affected by this graha. */ interpretation?: string; /** * KP significators of this period lord, read from the Placidus birth chart in the requested ayanamsa. Present only when the request sets "significators": true. */ significators?: { /** * House 1-12 this lord occupies in the Placidus birth chart. Its own Level 2 signification, repeated here because the occupied house is the first thing a KP reading looks at. */ house: number; /** * Lord of the nakshatra this planet sits in, one of the 9 grahas. In KP the star lord outranks the planet itself: a period lord mainly delivers the houses its star lord occupies and owns, which is why those appear at L1 and L3 rather than the planet own house. */ starLord: string; /** * KP sub lord of this planet, the 1 of 249 subdivision its longitude falls in, one of the 9 grahas. The star lord says WHAT results the period gives, the sub lord says WHETHER they materialize, so KP judgement checks both. */ subLord?: string; /** * KP 4-level significator breakdown showing which houses (1-12) this planet signifies at each strength tier. L1 is strongest, L4 is weakest. */ signifies: { /** * Level 1, the strongest signification (grade A). Houses influenced because this planet sits in the nakshatra (star) of a planet occupying those houses. For Rahu and Ketu, also includes the L1 houses of their agent planets (conjoined, aspecting, sign lord). */ L1: Array; /** * Level 2 (grade B). The house this planet physically occupies. For Rahu and Ketu, also includes houses occupied by their agent planets. */ L2: Array; /** * Level 3 (grade C). Houses influenced because this planet sits in the nakshatra of the sign lord (owner) of those houses. For Rahu and Ketu, also includes the L3 houses of their agent planets. */ L3: Array; /** * Level 4, the weakest signification (grade D). Houses this planet rules by zodiac sign ownership, up to 2 for Sun through Saturn and 3 where a sign is intercepted. Rahu and Ketu own no sign, so their L4 comes entirely from their agent planets. */ L4: Array; }; /** * Every house this lord signifies, deduplicated and ordered strongest tier first. Where a house is reached at more than one level it is listed once, at its strongest. This is the flat "houses signified" column of a KP dasha table. */ signifiedHouses: Array; /** * Subset of signifiedHouses reached at grade A or B (levels L1 and L2). These are the houses a KP reading acts on for this period; the rest are supporting connections. */ strongHouses: Array; /** * How firmly this lord is tied to the houses it signifies, on the KP A to D significator grading. Reproducible from the significator levels alone, in two steps. STEP 1, per house keep only the strongest level: a planet routinely reaches the same house at more than one level, for example its star lord occupies house 11 and it also owns house 11, and KP cites a significator by its best connection, so that house counts once at grade A. This is why signifiedHouses is shorter than the four level arrays concatenated, and omitting it is what makes a hand calculation disagree. STEP 2, average the surviving weights: each house contributes 100, 75, 50 or 25 for grade A, B, C or D, and the mean is the score. Worked example, a lord signifying house 11 at level 1, house 6 at level 2 and house 2 at level 4 scores (100 + 75 + 25) / 3 = 66.7, which lands in band B because the band edges are the midpoints 87.5, 62.5 and 37.5. The score says how firmly the lord is connected, never whether the houses are favourable, which depends on the matter being judged. */ strength: { /** * Mean KP percentage weight across signifiedHouses, each house counted at its strongest level (A 100, B 75, C 50, D 25). A mean rather than a total, so signifying many houses weakly does not outrank signifying two houses at grade A. */ score: number; /** * Band the score falls in, on the standard KP significator grading: A planets in the constellation of the occupant, B occupants, C planets in the constellation of the house owner, D the house owner. Band edges are the midpoints between the four weights. */ grade: 'A' | 'B' | 'C' | 'D'; /** * Plain-language form of grade: "very-strong" for A, "strong" for B, "moderate" for C, "weak" for D. Says how firmly this lord is connected to the houses it signifies, NOT whether those houses are favourable, which depends on the matter being judged. */ label: 'very-strong' | 'strong' | 'moderate' | 'weak'; }; }; /** * Parent Mahadasha lord under which this Antardasha sub-period runs. */ mahadashaLord: 'Ketu' | 'Venus' | 'Sun' | 'Moon' | 'Mars' | 'Rahu' | 'Jupiter' | 'Saturn' | 'Mercury'; }>; }; }; export type GetSubDashasResponse = GetSubDashasResponses[keyof GetSubDashasResponses]; export type GetPratyantardashasData = { body?: { /** * Birth date in YYYY-MM-DD format. Date determines planetary positions and nakshatra calculations for Vedic kundli (janam patri). Accurate birth date is essential for dashas, yoga calculations, and divisional charts (vargas). */ date: string; /** * Birth time in 24-hour HH:MM:SS format. Time is CRITICAL for Lagna (Ascendant) calculation and house divisions. It changes every two hours roughly. Even minutes matter for accurate nakshatra pada and divisional chart (D9, D10) calculations. Without exact time, Lagna and house-based predictions will be incorrect. */ time: string; /** * Birth location latitude in decimal degrees. Location determines local sidereal time for Lagna calculation and affects bhava (house) cusps. Example: Delhi 28.6139, Mumbai 19.0760, Kathmandu 27.7172. */ latitude: number; /** * Birth location longitude in decimal degrees. Affects local time calculations and ayanamsha adjustments. Example: Delhi 77.2090, Mumbai 72.8777, Kathmandu 85.3240. */ longitude: number; /** * Timezone: IANA name (e.g. "America/New_York", "Europe/London") OR decimal hours from UTC (e.g. -5 for EST, 1 for CET). IANA strings are resolved to the offset in force at the given date and time, so you can pass `cities[0].timezone` from /location/search directly. Defaults to 5.5. */ timezone?: number | string; /** * Ayanamsa system used to place the birth Moon in its nakshatra, which sets every dasha start and end date. "lahiri" uses Lahiri/Chitrapaksha, the traditional Vedic standard, and is the default. "kp-newcomb" uses the KP-Newcomb dynamic formula, matching Krishnamurti Paddhati software. "kp-old" uses the Krishnamurti original table from KP Reader-1. "raman" uses the B.V. Raman ayanamsa, the second frame traditional Indian software commonly offers beside Lahiri. "custom" takes your own value in degrees via ayanamsaValue, for reconciling exactly against a specific reference program. Switching frames shifts every dasha boundary by weeks, so pick the one your reference software uses. */ ayanamsa?: 'kp-newcomb' | 'kp-old' | 'lahiri' | 'raman' | 'custom'; /** * Custom ayanamsa value in degrees. When provided, overrides the computed ayanamsa from the selected type. Use for testing with specific ayanamsa values or matching a particular reference source. */ ayanamsaValue?: number; /** * Set true to attach the KP significators of each period lord: its star lord, sub lord, occupied house, the houses it signifies at levels L1 to L4, and a strength grade. Off by default, so responses stay exactly as they are for clients that only need dates. Requires the birth latitude and longitude, since significators are read off a Placidus house chart, and uses the same ayanamsa frame selected above. */ significators?: boolean; /** * Lunar node type for Rahu and Ketu, used ONLY when "significators" is true. Dasha dates themselves come from the Moon and never move with this field. "mean" uses the smooth mean node (traditional default). "true" uses the osculating node, which swings up to 1.5 degrees either side of mean over a 173-day cycle and can therefore change which house or star a node falls in. Defaults to "mean". */ nodeType?: 'mean' | 'true'; }; path: { /** * Mahadasha planet name, case-insensitive (e.g. saturn, Saturn, SATURN all work). Valid: Ketu, Venus, Sun, Moon, Mars, Rahu, Jupiter, Saturn, Mercury. */ mahadasha: 'Ketu' | 'Venus' | 'Sun' | 'Moon' | 'Mars' | 'Rahu' | 'Jupiter' | 'Saturn' | 'Mercury'; /** * Antardasha (bhukti) planet name inside that Mahadasha, case-insensitive. Every Mahadasha contains all 9 lords, so a repeat such as saturn/saturn is valid. */ antardasha: 'Ketu' | 'Venus' | 'Sun' | 'Moon' | 'Mars' | 'Rahu' | 'Jupiter' | 'Saturn' | 'Mercury'; }; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; /** * Which signification vocabulary the houseThemes map returns. "general" gives the classical bhava significations (self, wealth, siblings, home, and so on). "finance" gives the money reading of the same twelve bhavas, so house 2 returns income and savings, 5 speculation and risk appetite, 8 sudden money and leverage, 11 gains and profits, and 12 expenses and capital outflow. Use "finance" for wealth, income, business and market timing questions in Krishnamurti Paddhati, where the significator house groups 2, 6, 10, 11 for earned income and 5, 8, 11 for speculation are read against a running dasha. Defaults to "general". */ focus?: 'general' | 'finance'; }; url: '/vedic-astrology/dasha/sub/{mahadasha}/{antardasha}'; }; export type GetPratyantardashasErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetPratyantardashasError = GetPratyantardashasErrors[keyof GetPratyantardashasErrors]; export type GetPratyantardashasResponses = { /** * All 9 Pratyantardasha periods within the specified Mahadasha and Antardasha, with start/end dates and the parent Antardasha period details. */ 200: { /** * Significations of each of the twelve bhavas (houses), keyed by house number 1 to 12, as short keywords. Bhava 1 is the Lagna (self, body, vitality), 2 wealth and speech, 4 home and mother, 7 marriage and partnership, 10 career and status, 11 gains. Use it to label the house numbers returned elsewhere in the response: a Vimshottari dasha period signifying houses 2, 7 and 8, or a KP significator carrying houses 11 and 6, becomes readable text without a separate lookup call. Returned once per response rather than repeated per period, and localized by the lang query parameter alongside every other interpretation field. */ houseThemes?: { [key: string]: Array; }; /** * Which signification vocabulary produced the houseThemes keywords in this response, echoing the focus query parameter. Always present, and "general" when the parameter was omitted. Read it to label a rendered house legend, or to tell two cached responses apart when only one asked for the finance lens. */ focus?: 'general' | 'finance'; /** * Ruling planet of the requested Mahadasha period. */ mahadashaLord: 'Ketu' | 'Venus' | 'Sun' | 'Moon' | 'Mars' | 'Rahu' | 'Jupiter' | 'Saturn' | 'Mercury'; /** * Ruling planet of the requested Antardasha sub-period. */ antardashaLord: 'Ketu' | 'Venus' | 'Sun' | 'Moon' | 'Mars' | 'Rahu' | 'Jupiter' | 'Saturn' | 'Mercury'; /** * Sidereal (nirayana) longitude of the birth Moon in degrees, 0 to 360, measured in the ayanamsa frame reported below. This single value determines the birth nakshatra and therefore every dasha start and end date in this response. Compare it against a reference chart to reconcile any date difference at its source. */ moonLongitude: number; /** * Ayanamsa actually applied, in degrees. The precession offset subtracted from the tropical (sayana) longitude to get the sidereal (nirayana) one. Lahiri sits near 23 deg 43 min for a 1990 birth, KP-Newcomb near 23 deg 38 min. */ ayanamsa: number; /** * Ayanamsa system used, echoing the request field. One of "lahiri", "kp-newcomb", "kp-old" or "custom". Echoed so a client can confirm which frame produced these dates without re-deriving it. When it reads "custom" the ayanamsa field above carries the exact value you supplied. */ ayanamsaType: 'kp-newcomb' | 'kp-old' | 'lahiri' | 'raman' | 'custom'; /** * Full details of the parent Antardasha including start/end dates and duration. */ antardashaPeriod: { /** * Ruling graha of this Vimshottari dasha period. One of 9 planets in the Ketu-Venus-Sun-Moon-Mars-Rahu-Jupiter-Saturn-Mercury sequence. */ planet: 'Ketu' | 'Venus' | 'Sun' | 'Moon' | 'Mars' | 'Rahu' | 'Jupiter' | 'Saturn' | 'Mercury'; /** * Start datetime of this dasha period. Adjusted to the requested timezone offset. */ startDate: string; /** * End datetime of this dasha period. Adjusted to the requested timezone offset. */ endDate: string; /** * Duration of this dasha period in years. Mahadasha durations range from 6 years (Sun) to 20 years (Venus). */ durationYears: number; /** * Theoretical start of this period, present ONLY when the birth date truncated it. The Vimshottari cycle is already running when a native is born, so the period in force at birth began earlier: startDate is clipped to the birth moment while this field keeps the real start. Its presence is also why the first period of a chart can contain fewer than 9 sub-periods, the earlier ones having finished before birth. Absent on every period that runs its full length. */ nominalStartDate?: string; /** * Vedic interpretation of the planetary period describing themes, karmic lessons, and life areas affected by this graha. */ interpretation?: string; /** * KP significators of this period lord, read from the Placidus birth chart in the requested ayanamsa. Present only when the request sets "significators": true. */ significators?: { /** * House 1-12 this lord occupies in the Placidus birth chart. Its own Level 2 signification, repeated here because the occupied house is the first thing a KP reading looks at. */ house: number; /** * Lord of the nakshatra this planet sits in, one of the 9 grahas. In KP the star lord outranks the planet itself: a period lord mainly delivers the houses its star lord occupies and owns, which is why those appear at L1 and L3 rather than the planet own house. */ starLord: string; /** * KP sub lord of this planet, the 1 of 249 subdivision its longitude falls in, one of the 9 grahas. The star lord says WHAT results the period gives, the sub lord says WHETHER they materialize, so KP judgement checks both. */ subLord?: string; /** * KP 4-level significator breakdown showing which houses (1-12) this planet signifies at each strength tier. L1 is strongest, L4 is weakest. */ signifies: { /** * Level 1, the strongest signification (grade A). Houses influenced because this planet sits in the nakshatra (star) of a planet occupying those houses. For Rahu and Ketu, also includes the L1 houses of their agent planets (conjoined, aspecting, sign lord). */ L1: Array; /** * Level 2 (grade B). The house this planet physically occupies. For Rahu and Ketu, also includes houses occupied by their agent planets. */ L2: Array; /** * Level 3 (grade C). Houses influenced because this planet sits in the nakshatra of the sign lord (owner) of those houses. For Rahu and Ketu, also includes the L3 houses of their agent planets. */ L3: Array; /** * Level 4, the weakest signification (grade D). Houses this planet rules by zodiac sign ownership, up to 2 for Sun through Saturn and 3 where a sign is intercepted. Rahu and Ketu own no sign, so their L4 comes entirely from their agent planets. */ L4: Array; }; /** * Every house this lord signifies, deduplicated and ordered strongest tier first. Where a house is reached at more than one level it is listed once, at its strongest. This is the flat "houses signified" column of a KP dasha table. */ signifiedHouses: Array; /** * Subset of signifiedHouses reached at grade A or B (levels L1 and L2). These are the houses a KP reading acts on for this period; the rest are supporting connections. */ strongHouses: Array; /** * How firmly this lord is tied to the houses it signifies, on the KP A to D significator grading. Reproducible from the significator levels alone, in two steps. STEP 1, per house keep only the strongest level: a planet routinely reaches the same house at more than one level, for example its star lord occupies house 11 and it also owns house 11, and KP cites a significator by its best connection, so that house counts once at grade A. This is why signifiedHouses is shorter than the four level arrays concatenated, and omitting it is what makes a hand calculation disagree. STEP 2, average the surviving weights: each house contributes 100, 75, 50 or 25 for grade A, B, C or D, and the mean is the score. Worked example, a lord signifying house 11 at level 1, house 6 at level 2 and house 2 at level 4 scores (100 + 75 + 25) / 3 = 66.7, which lands in band B because the band edges are the midpoints 87.5, 62.5 and 37.5. The score says how firmly the lord is connected, never whether the houses are favourable, which depends on the matter being judged. */ strength: { /** * Mean KP percentage weight across signifiedHouses, each house counted at its strongest level (A 100, B 75, C 50, D 25). A mean rather than a total, so signifying many houses weakly does not outrank signifying two houses at grade A. */ score: number; /** * Band the score falls in, on the standard KP significator grading: A planets in the constellation of the occupant, B occupants, C planets in the constellation of the house owner, D the house owner. Band edges are the midpoints between the four weights. */ grade: 'A' | 'B' | 'C' | 'D'; /** * Plain-language form of grade: "very-strong" for A, "strong" for B, "moderate" for C, "weak" for D. Says how firmly this lord is connected to the houses it signifies, NOT whether those houses are favourable, which depends on the matter being judged. */ label: 'very-strong' | 'strong' | 'moderate' | 'weak'; }; }; /** * Parent Mahadasha lord under which this Antardasha sub-period runs. */ mahadashaLord: 'Ketu' | 'Venus' | 'Sun' | 'Moon' | 'Mars' | 'Rahu' | 'Jupiter' | 'Saturn' | 'Mercury'; }; /** * Pratyantardasha (antara) periods within this Antardasha, proportional to each planet Vimshottari years, sorted chronologically and starting with the Antardasha lord. Fewer than nine only when the parent Antardasha is the one that was already running at birth, in which case the periods that ended before the birth date are omitted. */ pratyantardashas: Array<{ /** * Ruling graha of this Vimshottari dasha period. One of 9 planets in the Ketu-Venus-Sun-Moon-Mars-Rahu-Jupiter-Saturn-Mercury sequence. */ planet: 'Ketu' | 'Venus' | 'Sun' | 'Moon' | 'Mars' | 'Rahu' | 'Jupiter' | 'Saturn' | 'Mercury'; /** * Start datetime of this dasha period. Adjusted to the requested timezone offset. */ startDate: string; /** * End datetime of this dasha period. Adjusted to the requested timezone offset. */ endDate: string; /** * Duration of this dasha period in years. Mahadasha durations range from 6 years (Sun) to 20 years (Venus). */ durationYears: number; /** * Theoretical start of this period, present ONLY when the birth date truncated it. The Vimshottari cycle is already running when a native is born, so the period in force at birth began earlier: startDate is clipped to the birth moment while this field keeps the real start. Its presence is also why the first period of a chart can contain fewer than 9 sub-periods, the earlier ones having finished before birth. Absent on every period that runs its full length. */ nominalStartDate?: string; /** * Vedic interpretation of the planetary period describing themes, karmic lessons, and life areas affected by this graha. */ interpretation?: string; /** * KP significators of this period lord, read from the Placidus birth chart in the requested ayanamsa. Present only when the request sets "significators": true. */ significators?: { /** * House 1-12 this lord occupies in the Placidus birth chart. Its own Level 2 signification, repeated here because the occupied house is the first thing a KP reading looks at. */ house: number; /** * Lord of the nakshatra this planet sits in, one of the 9 grahas. In KP the star lord outranks the planet itself: a period lord mainly delivers the houses its star lord occupies and owns, which is why those appear at L1 and L3 rather than the planet own house. */ starLord: string; /** * KP sub lord of this planet, the 1 of 249 subdivision its longitude falls in, one of the 9 grahas. The star lord says WHAT results the period gives, the sub lord says WHETHER they materialize, so KP judgement checks both. */ subLord?: string; /** * KP 4-level significator breakdown showing which houses (1-12) this planet signifies at each strength tier. L1 is strongest, L4 is weakest. */ signifies: { /** * Level 1, the strongest signification (grade A). Houses influenced because this planet sits in the nakshatra (star) of a planet occupying those houses. For Rahu and Ketu, also includes the L1 houses of their agent planets (conjoined, aspecting, sign lord). */ L1: Array; /** * Level 2 (grade B). The house this planet physically occupies. For Rahu and Ketu, also includes houses occupied by their agent planets. */ L2: Array; /** * Level 3 (grade C). Houses influenced because this planet sits in the nakshatra of the sign lord (owner) of those houses. For Rahu and Ketu, also includes the L3 houses of their agent planets. */ L3: Array; /** * Level 4, the weakest signification (grade D). Houses this planet rules by zodiac sign ownership, up to 2 for Sun through Saturn and 3 where a sign is intercepted. Rahu and Ketu own no sign, so their L4 comes entirely from their agent planets. */ L4: Array; }; /** * Every house this lord signifies, deduplicated and ordered strongest tier first. Where a house is reached at more than one level it is listed once, at its strongest. This is the flat "houses signified" column of a KP dasha table. */ signifiedHouses: Array; /** * Subset of signifiedHouses reached at grade A or B (levels L1 and L2). These are the houses a KP reading acts on for this period; the rest are supporting connections. */ strongHouses: Array; /** * How firmly this lord is tied to the houses it signifies, on the KP A to D significator grading. Reproducible from the significator levels alone, in two steps. STEP 1, per house keep only the strongest level: a planet routinely reaches the same house at more than one level, for example its star lord occupies house 11 and it also owns house 11, and KP cites a significator by its best connection, so that house counts once at grade A. This is why signifiedHouses is shorter than the four level arrays concatenated, and omitting it is what makes a hand calculation disagree. STEP 2, average the surviving weights: each house contributes 100, 75, 50 or 25 for grade A, B, C or D, and the mean is the score. Worked example, a lord signifying house 11 at level 1, house 6 at level 2 and house 2 at level 4 scores (100 + 75 + 25) / 3 = 66.7, which lands in band B because the band edges are the midpoints 87.5, 62.5 and 37.5. The score says how firmly the lord is connected, never whether the houses are favourable, which depends on the matter being judged. */ strength: { /** * Mean KP percentage weight across signifiedHouses, each house counted at its strongest level (A 100, B 75, C 50, D 25). A mean rather than a total, so signifying many houses weakly does not outrank signifying two houses at grade A. */ score: number; /** * Band the score falls in, on the standard KP significator grading: A planets in the constellation of the occupant, B occupants, C planets in the constellation of the house owner, D the house owner. Band edges are the midpoints between the four weights. */ grade: 'A' | 'B' | 'C' | 'D'; /** * Plain-language form of grade: "very-strong" for A, "strong" for B, "moderate" for C, "weak" for D. Says how firmly this lord is connected to the houses it signifies, NOT whether those houses are favourable, which depends on the matter being judged. */ label: 'very-strong' | 'strong' | 'moderate' | 'weak'; }; }; /** * Parent Mahadasha lord under which this Antardasha sub-period runs. */ mahadashaLord: 'Ketu' | 'Venus' | 'Sun' | 'Moon' | 'Mars' | 'Rahu' | 'Jupiter' | 'Saturn' | 'Mercury'; /** * Parent Antardasha lord under which this Pratyantardasha runs. */ antardashaLord: 'Ketu' | 'Venus' | 'Sun' | 'Moon' | 'Mars' | 'Rahu' | 'Jupiter' | 'Saturn' | 'Mercury'; }>; }; }; export type GetPratyantardashasResponse = GetPratyantardashasResponses[keyof GetPratyantardashasResponses]; export type GetSookshmaDashasData = { body?: { /** * Birth date in YYYY-MM-DD format. Date determines planetary positions and nakshatra calculations for Vedic kundli (janam patri). Accurate birth date is essential for dashas, yoga calculations, and divisional charts (vargas). */ date: string; /** * Birth time in 24-hour HH:MM:SS format. Time is CRITICAL for Lagna (Ascendant) calculation and house divisions. It changes every two hours roughly. Even minutes matter for accurate nakshatra pada and divisional chart (D9, D10) calculations. Without exact time, Lagna and house-based predictions will be incorrect. */ time: string; /** * Birth location latitude in decimal degrees. Location determines local sidereal time for Lagna calculation and affects bhava (house) cusps. Example: Delhi 28.6139, Mumbai 19.0760, Kathmandu 27.7172. */ latitude: number; /** * Birth location longitude in decimal degrees. Affects local time calculations and ayanamsha adjustments. Example: Delhi 77.2090, Mumbai 72.8777, Kathmandu 85.3240. */ longitude: number; /** * Timezone: IANA name (e.g. "America/New_York", "Europe/London") OR decimal hours from UTC (e.g. -5 for EST, 1 for CET). IANA strings are resolved to the offset in force at the given date and time, so you can pass `cities[0].timezone` from /location/search directly. Defaults to 5.5. */ timezone?: number | string; /** * Ayanamsa system used to place the birth Moon in its nakshatra, which sets every dasha start and end date. "lahiri" uses Lahiri/Chitrapaksha, the traditional Vedic standard, and is the default. "kp-newcomb" uses the KP-Newcomb dynamic formula, matching Krishnamurti Paddhati software. "kp-old" uses the Krishnamurti original table from KP Reader-1. "raman" uses the B.V. Raman ayanamsa, the second frame traditional Indian software commonly offers beside Lahiri. "custom" takes your own value in degrees via ayanamsaValue, for reconciling exactly against a specific reference program. Switching frames shifts every dasha boundary by weeks, so pick the one your reference software uses. */ ayanamsa?: 'kp-newcomb' | 'kp-old' | 'lahiri' | 'raman' | 'custom'; /** * Custom ayanamsa value in degrees. When provided, overrides the computed ayanamsa from the selected type. Use for testing with specific ayanamsa values or matching a particular reference source. */ ayanamsaValue?: number; /** * Set true to attach the KP significators of each period lord: its star lord, sub lord, occupied house, the houses it signifies at levels L1 to L4, and a strength grade. Off by default, so responses stay exactly as they are for clients that only need dates. Requires the birth latitude and longitude, since significators are read off a Placidus house chart, and uses the same ayanamsa frame selected above. */ significators?: boolean; /** * Lunar node type for Rahu and Ketu, used ONLY when "significators" is true. Dasha dates themselves come from the Moon and never move with this field. "mean" uses the smooth mean node (traditional default). "true" uses the osculating node, which swings up to 1.5 degrees either side of mean over a 173-day cycle and can therefore change which house or star a node falls in. Defaults to "mean". */ nodeType?: 'mean' | 'true'; }; path: { /** * Mahadasha planet name, case-insensitive. Valid: Ketu, Venus, Sun, Moon, Mars, Rahu, Jupiter, Saturn, Mercury. */ mahadasha: 'Ketu' | 'Venus' | 'Sun' | 'Moon' | 'Mars' | 'Rahu' | 'Jupiter' | 'Saturn' | 'Mercury'; /** * Antardasha (bhukti) planet name inside that Mahadasha, case-insensitive. */ antardasha: 'Ketu' | 'Venus' | 'Sun' | 'Moon' | 'Mars' | 'Rahu' | 'Jupiter' | 'Saturn' | 'Mercury'; /** * Pratyantardasha (antara) planet name inside that Antardasha, case-insensitive. */ pratyantardasha: 'Ketu' | 'Venus' | 'Sun' | 'Moon' | 'Mars' | 'Rahu' | 'Jupiter' | 'Saturn' | 'Mercury'; }; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; /** * Which signification vocabulary the houseThemes map returns. "general" gives the classical bhava significations (self, wealth, siblings, home, and so on). "finance" gives the money reading of the same twelve bhavas, so house 2 returns income and savings, 5 speculation and risk appetite, 8 sudden money and leverage, 11 gains and profits, and 12 expenses and capital outflow. Use "finance" for wealth, income, business and market timing questions in Krishnamurti Paddhati, where the significator house groups 2, 6, 10, 11 for earned income and 5, 8, 11 for speculation are read against a running dasha. Defaults to "general". */ focus?: 'general' | 'finance'; }; url: '/vedic-astrology/dasha/sub/{mahadasha}/{antardasha}/{pratyantardasha}'; }; export type GetSookshmaDashasErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetSookshmaDashasError = GetSookshmaDashasErrors[keyof GetSookshmaDashasErrors]; export type GetSookshmaDashasResponses = { /** * All 9 Sookshma dasha periods within the specified Mahadasha, Antardasha, and Pratyantardasha, with start/end dates and the parent Pratyantardasha period details. */ 200: { /** * Significations of each of the twelve bhavas (houses), keyed by house number 1 to 12, as short keywords. Bhava 1 is the Lagna (self, body, vitality), 2 wealth and speech, 4 home and mother, 7 marriage and partnership, 10 career and status, 11 gains. Use it to label the house numbers returned elsewhere in the response: a Vimshottari dasha period signifying houses 2, 7 and 8, or a KP significator carrying houses 11 and 6, becomes readable text without a separate lookup call. Returned once per response rather than repeated per period, and localized by the lang query parameter alongside every other interpretation field. */ houseThemes?: { [key: string]: Array; }; /** * Which signification vocabulary produced the houseThemes keywords in this response, echoing the focus query parameter. Always present, and "general" when the parameter was omitted. Read it to label a rendered house legend, or to tell two cached responses apart when only one asked for the finance lens. */ focus?: 'general' | 'finance'; /** * Ruling planet of the requested Mahadasha period. */ mahadashaLord: 'Ketu' | 'Venus' | 'Sun' | 'Moon' | 'Mars' | 'Rahu' | 'Jupiter' | 'Saturn' | 'Mercury'; /** * Ruling planet of the requested Antardasha sub-period. */ antardashaLord: 'Ketu' | 'Venus' | 'Sun' | 'Moon' | 'Mars' | 'Rahu' | 'Jupiter' | 'Saturn' | 'Mercury'; /** * Ruling planet of the requested Pratyantardasha sub-sub-period. */ pratyantardashaLord: 'Ketu' | 'Venus' | 'Sun' | 'Moon' | 'Mars' | 'Rahu' | 'Jupiter' | 'Saturn' | 'Mercury'; /** * Sidereal (nirayana) longitude of the birth Moon in degrees, 0 to 360, measured in the ayanamsa frame reported below. This single value determines the birth nakshatra and therefore every dasha start and end date in this response. Compare it against a reference chart to reconcile any date difference at its source. */ moonLongitude: number; /** * Ayanamsa actually applied, in degrees. The precession offset subtracted from the tropical (sayana) longitude to get the sidereal (nirayana) one. Lahiri sits near 23 deg 43 min for a 1990 birth, KP-Newcomb near 23 deg 38 min. */ ayanamsa: number; /** * Ayanamsa system used, echoing the request field. One of "lahiri", "kp-newcomb", "kp-old" or "custom". Echoed so a client can confirm which frame produced these dates without re-deriving it. When it reads "custom" the ayanamsa field above carries the exact value you supplied. */ ayanamsaType: 'kp-newcomb' | 'kp-old' | 'lahiri' | 'raman' | 'custom'; /** * Full details of the parent Pratyantardasha including start/end dates and duration. */ pratyantardashaPeriod: { /** * Ruling graha of this Vimshottari dasha period. One of 9 planets in the Ketu-Venus-Sun-Moon-Mars-Rahu-Jupiter-Saturn-Mercury sequence. */ planet: 'Ketu' | 'Venus' | 'Sun' | 'Moon' | 'Mars' | 'Rahu' | 'Jupiter' | 'Saturn' | 'Mercury'; /** * Start datetime of this dasha period. Adjusted to the requested timezone offset. */ startDate: string; /** * End datetime of this dasha period. Adjusted to the requested timezone offset. */ endDate: string; /** * Duration of this dasha period in years. Mahadasha durations range from 6 years (Sun) to 20 years (Venus). */ durationYears: number; /** * Theoretical start of this period, present ONLY when the birth date truncated it. The Vimshottari cycle is already running when a native is born, so the period in force at birth began earlier: startDate is clipped to the birth moment while this field keeps the real start. Its presence is also why the first period of a chart can contain fewer than 9 sub-periods, the earlier ones having finished before birth. Absent on every period that runs its full length. */ nominalStartDate?: string; /** * Vedic interpretation of the planetary period describing themes, karmic lessons, and life areas affected by this graha. */ interpretation?: string; /** * KP significators of this period lord, read from the Placidus birth chart in the requested ayanamsa. Present only when the request sets "significators": true. */ significators?: { /** * House 1-12 this lord occupies in the Placidus birth chart. Its own Level 2 signification, repeated here because the occupied house is the first thing a KP reading looks at. */ house: number; /** * Lord of the nakshatra this planet sits in, one of the 9 grahas. In KP the star lord outranks the planet itself: a period lord mainly delivers the houses its star lord occupies and owns, which is why those appear at L1 and L3 rather than the planet own house. */ starLord: string; /** * KP sub lord of this planet, the 1 of 249 subdivision its longitude falls in, one of the 9 grahas. The star lord says WHAT results the period gives, the sub lord says WHETHER they materialize, so KP judgement checks both. */ subLord?: string; /** * KP 4-level significator breakdown showing which houses (1-12) this planet signifies at each strength tier. L1 is strongest, L4 is weakest. */ signifies: { /** * Level 1, the strongest signification (grade A). Houses influenced because this planet sits in the nakshatra (star) of a planet occupying those houses. For Rahu and Ketu, also includes the L1 houses of their agent planets (conjoined, aspecting, sign lord). */ L1: Array; /** * Level 2 (grade B). The house this planet physically occupies. For Rahu and Ketu, also includes houses occupied by their agent planets. */ L2: Array; /** * Level 3 (grade C). Houses influenced because this planet sits in the nakshatra of the sign lord (owner) of those houses. For Rahu and Ketu, also includes the L3 houses of their agent planets. */ L3: Array; /** * Level 4, the weakest signification (grade D). Houses this planet rules by zodiac sign ownership, up to 2 for Sun through Saturn and 3 where a sign is intercepted. Rahu and Ketu own no sign, so their L4 comes entirely from their agent planets. */ L4: Array; }; /** * Every house this lord signifies, deduplicated and ordered strongest tier first. Where a house is reached at more than one level it is listed once, at its strongest. This is the flat "houses signified" column of a KP dasha table. */ signifiedHouses: Array; /** * Subset of signifiedHouses reached at grade A or B (levels L1 and L2). These are the houses a KP reading acts on for this period; the rest are supporting connections. */ strongHouses: Array; /** * How firmly this lord is tied to the houses it signifies, on the KP A to D significator grading. Reproducible from the significator levels alone, in two steps. STEP 1, per house keep only the strongest level: a planet routinely reaches the same house at more than one level, for example its star lord occupies house 11 and it also owns house 11, and KP cites a significator by its best connection, so that house counts once at grade A. This is why signifiedHouses is shorter than the four level arrays concatenated, and omitting it is what makes a hand calculation disagree. STEP 2, average the surviving weights: each house contributes 100, 75, 50 or 25 for grade A, B, C or D, and the mean is the score. Worked example, a lord signifying house 11 at level 1, house 6 at level 2 and house 2 at level 4 scores (100 + 75 + 25) / 3 = 66.7, which lands in band B because the band edges are the midpoints 87.5, 62.5 and 37.5. The score says how firmly the lord is connected, never whether the houses are favourable, which depends on the matter being judged. */ strength: { /** * Mean KP percentage weight across signifiedHouses, each house counted at its strongest level (A 100, B 75, C 50, D 25). A mean rather than a total, so signifying many houses weakly does not outrank signifying two houses at grade A. */ score: number; /** * Band the score falls in, on the standard KP significator grading: A planets in the constellation of the occupant, B occupants, C planets in the constellation of the house owner, D the house owner. Band edges are the midpoints between the four weights. */ grade: 'A' | 'B' | 'C' | 'D'; /** * Plain-language form of grade: "very-strong" for A, "strong" for B, "moderate" for C, "weak" for D. Says how firmly this lord is connected to the houses it signifies, NOT whether those houses are favourable, which depends on the matter being judged. */ label: 'very-strong' | 'strong' | 'moderate' | 'weak'; }; }; /** * Parent Mahadasha lord under which this Antardasha sub-period runs. */ mahadashaLord: 'Ketu' | 'Venus' | 'Sun' | 'Moon' | 'Mars' | 'Rahu' | 'Jupiter' | 'Saturn' | 'Mercury'; /** * Parent Antardasha lord under which this Pratyantardasha runs. */ antardashaLord: 'Ketu' | 'Venus' | 'Sun' | 'Moon' | 'Mars' | 'Rahu' | 'Jupiter' | 'Saturn' | 'Mercury'; }; /** * Sookshma dasha periods within this Pratyantardasha, proportional to each planet Vimshottari years, sorted chronologically and starting with the Pratyantardasha lord. Fewer than nine only when the parent Pratyantardasha is the one that was already running at birth, in which case the periods that ended before the birth date are omitted. */ sookshmaDashas: Array<{ /** * Ruling graha of this Vimshottari dasha period. One of 9 planets in the Ketu-Venus-Sun-Moon-Mars-Rahu-Jupiter-Saturn-Mercury sequence. */ planet: 'Ketu' | 'Venus' | 'Sun' | 'Moon' | 'Mars' | 'Rahu' | 'Jupiter' | 'Saturn' | 'Mercury'; /** * Start datetime of this dasha period. Adjusted to the requested timezone offset. */ startDate: string; /** * End datetime of this dasha period. Adjusted to the requested timezone offset. */ endDate: string; /** * Duration of this dasha period in years. Mahadasha durations range from 6 years (Sun) to 20 years (Venus). */ durationYears: number; /** * Theoretical start of this period, present ONLY when the birth date truncated it. The Vimshottari cycle is already running when a native is born, so the period in force at birth began earlier: startDate is clipped to the birth moment while this field keeps the real start. Its presence is also why the first period of a chart can contain fewer than 9 sub-periods, the earlier ones having finished before birth. Absent on every period that runs its full length. */ nominalStartDate?: string; /** * Vedic interpretation of the planetary period describing themes, karmic lessons, and life areas affected by this graha. */ interpretation?: string; /** * KP significators of this period lord, read from the Placidus birth chart in the requested ayanamsa. Present only when the request sets "significators": true. */ significators?: { /** * House 1-12 this lord occupies in the Placidus birth chart. Its own Level 2 signification, repeated here because the occupied house is the first thing a KP reading looks at. */ house: number; /** * Lord of the nakshatra this planet sits in, one of the 9 grahas. In KP the star lord outranks the planet itself: a period lord mainly delivers the houses its star lord occupies and owns, which is why those appear at L1 and L3 rather than the planet own house. */ starLord: string; /** * KP sub lord of this planet, the 1 of 249 subdivision its longitude falls in, one of the 9 grahas. The star lord says WHAT results the period gives, the sub lord says WHETHER they materialize, so KP judgement checks both. */ subLord?: string; /** * KP 4-level significator breakdown showing which houses (1-12) this planet signifies at each strength tier. L1 is strongest, L4 is weakest. */ signifies: { /** * Level 1, the strongest signification (grade A). Houses influenced because this planet sits in the nakshatra (star) of a planet occupying those houses. For Rahu and Ketu, also includes the L1 houses of their agent planets (conjoined, aspecting, sign lord). */ L1: Array; /** * Level 2 (grade B). The house this planet physically occupies. For Rahu and Ketu, also includes houses occupied by their agent planets. */ L2: Array; /** * Level 3 (grade C). Houses influenced because this planet sits in the nakshatra of the sign lord (owner) of those houses. For Rahu and Ketu, also includes the L3 houses of their agent planets. */ L3: Array; /** * Level 4, the weakest signification (grade D). Houses this planet rules by zodiac sign ownership, up to 2 for Sun through Saturn and 3 where a sign is intercepted. Rahu and Ketu own no sign, so their L4 comes entirely from their agent planets. */ L4: Array; }; /** * Every house this lord signifies, deduplicated and ordered strongest tier first. Where a house is reached at more than one level it is listed once, at its strongest. This is the flat "houses signified" column of a KP dasha table. */ signifiedHouses: Array; /** * Subset of signifiedHouses reached at grade A or B (levels L1 and L2). These are the houses a KP reading acts on for this period; the rest are supporting connections. */ strongHouses: Array; /** * How firmly this lord is tied to the houses it signifies, on the KP A to D significator grading. Reproducible from the significator levels alone, in two steps. STEP 1, per house keep only the strongest level: a planet routinely reaches the same house at more than one level, for example its star lord occupies house 11 and it also owns house 11, and KP cites a significator by its best connection, so that house counts once at grade A. This is why signifiedHouses is shorter than the four level arrays concatenated, and omitting it is what makes a hand calculation disagree. STEP 2, average the surviving weights: each house contributes 100, 75, 50 or 25 for grade A, B, C or D, and the mean is the score. Worked example, a lord signifying house 11 at level 1, house 6 at level 2 and house 2 at level 4 scores (100 + 75 + 25) / 3 = 66.7, which lands in band B because the band edges are the midpoints 87.5, 62.5 and 37.5. The score says how firmly the lord is connected, never whether the houses are favourable, which depends on the matter being judged. */ strength: { /** * Mean KP percentage weight across signifiedHouses, each house counted at its strongest level (A 100, B 75, C 50, D 25). A mean rather than a total, so signifying many houses weakly does not outrank signifying two houses at grade A. */ score: number; /** * Band the score falls in, on the standard KP significator grading: A planets in the constellation of the occupant, B occupants, C planets in the constellation of the house owner, D the house owner. Band edges are the midpoints between the four weights. */ grade: 'A' | 'B' | 'C' | 'D'; /** * Plain-language form of grade: "very-strong" for A, "strong" for B, "moderate" for C, "weak" for D. Says how firmly this lord is connected to the houses it signifies, NOT whether those houses are favourable, which depends on the matter being judged. */ label: 'very-strong' | 'strong' | 'moderate' | 'weak'; }; }; /** * Parent Mahadasha lord under which this Antardasha sub-period runs. */ mahadashaLord: 'Ketu' | 'Venus' | 'Sun' | 'Moon' | 'Mars' | 'Rahu' | 'Jupiter' | 'Saturn' | 'Mercury'; /** * Parent Antardasha lord under which this Pratyantardasha runs. */ antardashaLord: 'Ketu' | 'Venus' | 'Sun' | 'Moon' | 'Mars' | 'Rahu' | 'Jupiter' | 'Saturn' | 'Mercury'; /** * Parent Pratyantardasha lord under which this Sookshma dasha runs. */ pratyantardashaLord: 'Ketu' | 'Venus' | 'Sun' | 'Moon' | 'Mars' | 'Rahu' | 'Jupiter' | 'Saturn' | 'Mercury'; }>; }; }; export type GetSookshmaDashasResponse = GetSookshmaDashasResponses[keyof GetSookshmaDashasResponses]; export type GetPranaDashasData = { body?: { /** * Birth date in YYYY-MM-DD format. Date determines planetary positions and nakshatra calculations for Vedic kundli (janam patri). Accurate birth date is essential for dashas, yoga calculations, and divisional charts (vargas). */ date: string; /** * Birth time in 24-hour HH:MM:SS format. Time is CRITICAL for Lagna (Ascendant) calculation and house divisions. It changes every two hours roughly. Even minutes matter for accurate nakshatra pada and divisional chart (D9, D10) calculations. Without exact time, Lagna and house-based predictions will be incorrect. */ time: string; /** * Birth location latitude in decimal degrees. Location determines local sidereal time for Lagna calculation and affects bhava (house) cusps. Example: Delhi 28.6139, Mumbai 19.0760, Kathmandu 27.7172. */ latitude: number; /** * Birth location longitude in decimal degrees. Affects local time calculations and ayanamsha adjustments. Example: Delhi 77.2090, Mumbai 72.8777, Kathmandu 85.3240. */ longitude: number; /** * Timezone: IANA name (e.g. "America/New_York", "Europe/London") OR decimal hours from UTC (e.g. -5 for EST, 1 for CET). IANA strings are resolved to the offset in force at the given date and time, so you can pass `cities[0].timezone` from /location/search directly. Defaults to 5.5. */ timezone?: number | string; /** * Ayanamsa system used to place the birth Moon in its nakshatra, which sets every dasha start and end date. "lahiri" uses Lahiri/Chitrapaksha, the traditional Vedic standard, and is the default. "kp-newcomb" uses the KP-Newcomb dynamic formula, matching Krishnamurti Paddhati software. "kp-old" uses the Krishnamurti original table from KP Reader-1. "raman" uses the B.V. Raman ayanamsa, the second frame traditional Indian software commonly offers beside Lahiri. "custom" takes your own value in degrees via ayanamsaValue, for reconciling exactly against a specific reference program. Switching frames shifts every dasha boundary by weeks, so pick the one your reference software uses. */ ayanamsa?: 'kp-newcomb' | 'kp-old' | 'lahiri' | 'raman' | 'custom'; /** * Custom ayanamsa value in degrees. When provided, overrides the computed ayanamsa from the selected type. Use for testing with specific ayanamsa values or matching a particular reference source. */ ayanamsaValue?: number; /** * Set true to attach the KP significators of each period lord: its star lord, sub lord, occupied house, the houses it signifies at levels L1 to L4, and a strength grade. Off by default, so responses stay exactly as they are for clients that only need dates. Requires the birth latitude and longitude, since significators are read off a Placidus house chart, and uses the same ayanamsa frame selected above. */ significators?: boolean; /** * Lunar node type for Rahu and Ketu, used ONLY when "significators" is true. Dasha dates themselves come from the Moon and never move with this field. "mean" uses the smooth mean node (traditional default). "true" uses the osculating node, which swings up to 1.5 degrees either side of mean over a 173-day cycle and can therefore change which house or star a node falls in. Defaults to "mean". */ nodeType?: 'mean' | 'true'; }; path: { /** * Mahadasha planet name, case-insensitive. Valid: Ketu, Venus, Sun, Moon, Mars, Rahu, Jupiter, Saturn, Mercury. */ mahadasha: 'Ketu' | 'Venus' | 'Sun' | 'Moon' | 'Mars' | 'Rahu' | 'Jupiter' | 'Saturn' | 'Mercury'; /** * Antardasha (bhukti) planet name inside that Mahadasha, case-insensitive. */ antardasha: 'Ketu' | 'Venus' | 'Sun' | 'Moon' | 'Mars' | 'Rahu' | 'Jupiter' | 'Saturn' | 'Mercury'; /** * Pratyantardasha (antara) planet name inside that Antardasha, case-insensitive. */ pratyantardasha: 'Ketu' | 'Venus' | 'Sun' | 'Moon' | 'Mars' | 'Rahu' | 'Jupiter' | 'Saturn' | 'Mercury'; /** * Sookshma dasha planet name inside that Pratyantardasha, case-insensitive. Every full period contains all 9 lords, so a repeat such as saturn/saturn/saturn/saturn is valid. */ sookshma: 'Ketu' | 'Venus' | 'Sun' | 'Moon' | 'Mars' | 'Rahu' | 'Jupiter' | 'Saturn' | 'Mercury'; }; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; /** * Which signification vocabulary the houseThemes map returns. "general" gives the classical bhava significations (self, wealth, siblings, home, and so on). "finance" gives the money reading of the same twelve bhavas, so house 2 returns income and savings, 5 speculation and risk appetite, 8 sudden money and leverage, 11 gains and profits, and 12 expenses and capital outflow. Use "finance" for wealth, income, business and market timing questions in Krishnamurti Paddhati, where the significator house groups 2, 6, 10, 11 for earned income and 5, 8, 11 for speculation are read against a running dasha. Defaults to "general". */ focus?: 'general' | 'finance'; }; url: '/vedic-astrology/dasha/sub/{mahadasha}/{antardasha}/{pratyantardasha}/{sookshma}'; }; export type GetPranaDashasErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetPranaDashasError = GetPranaDashasErrors[keyof GetPranaDashasErrors]; export type GetPranaDashasResponses = { /** * All 9 Prana dasha periods within the specified Mahadasha, Antardasha, Pratyantardasha, and Sookshma dasha, with start/end dates and the parent Sookshma period details. */ 200: { /** * Significations of each of the twelve bhavas (houses), keyed by house number 1 to 12, as short keywords. Bhava 1 is the Lagna (self, body, vitality), 2 wealth and speech, 4 home and mother, 7 marriage and partnership, 10 career and status, 11 gains. Use it to label the house numbers returned elsewhere in the response: a Vimshottari dasha period signifying houses 2, 7 and 8, or a KP significator carrying houses 11 and 6, becomes readable text without a separate lookup call. Returned once per response rather than repeated per period, and localized by the lang query parameter alongside every other interpretation field. */ houseThemes?: { [key: string]: Array; }; /** * Which signification vocabulary produced the houseThemes keywords in this response, echoing the focus query parameter. Always present, and "general" when the parameter was omitted. Read it to label a rendered house legend, or to tell two cached responses apart when only one asked for the finance lens. */ focus?: 'general' | 'finance'; /** * Ruling planet of the requested Mahadasha period. */ mahadashaLord: 'Ketu' | 'Venus' | 'Sun' | 'Moon' | 'Mars' | 'Rahu' | 'Jupiter' | 'Saturn' | 'Mercury'; /** * Ruling planet of the requested Antardasha sub-period. */ antardashaLord: 'Ketu' | 'Venus' | 'Sun' | 'Moon' | 'Mars' | 'Rahu' | 'Jupiter' | 'Saturn' | 'Mercury'; /** * Ruling planet of the requested Pratyantardasha sub-sub-period. */ pratyantardashaLord: 'Ketu' | 'Venus' | 'Sun' | 'Moon' | 'Mars' | 'Rahu' | 'Jupiter' | 'Saturn' | 'Mercury'; /** * Ruling planet of the requested Sookshma dasha. */ sookshmaLord: 'Ketu' | 'Venus' | 'Sun' | 'Moon' | 'Mars' | 'Rahu' | 'Jupiter' | 'Saturn' | 'Mercury'; /** * Sidereal (nirayana) longitude of the birth Moon in degrees, 0 to 360, measured in the ayanamsa frame reported below. This single value determines the birth nakshatra and therefore every dasha start and end date in this response. Compare it against a reference chart to reconcile any date difference at its source. */ moonLongitude: number; /** * Ayanamsa actually applied, in degrees. The precession offset subtracted from the tropical (sayana) longitude to get the sidereal (nirayana) one. Lahiri sits near 23 deg 43 min for a 1990 birth, KP-Newcomb near 23 deg 38 min. */ ayanamsa: number; /** * Ayanamsa system used, echoing the request field. One of "lahiri", "kp-newcomb", "kp-old" or "custom". Echoed so a client can confirm which frame produced these dates without re-deriving it. When it reads "custom" the ayanamsa field above carries the exact value you supplied. */ ayanamsaType: 'kp-newcomb' | 'kp-old' | 'lahiri' | 'raman' | 'custom'; /** * Full details of the parent Sookshma dasha including start/end dates and duration. */ sookshmaPeriod: { /** * Ruling graha of this Vimshottari dasha period. One of 9 planets in the Ketu-Venus-Sun-Moon-Mars-Rahu-Jupiter-Saturn-Mercury sequence. */ planet: 'Ketu' | 'Venus' | 'Sun' | 'Moon' | 'Mars' | 'Rahu' | 'Jupiter' | 'Saturn' | 'Mercury'; /** * Start datetime of this dasha period. Adjusted to the requested timezone offset. */ startDate: string; /** * End datetime of this dasha period. Adjusted to the requested timezone offset. */ endDate: string; /** * Duration of this dasha period in years. Mahadasha durations range from 6 years (Sun) to 20 years (Venus). */ durationYears: number; /** * Theoretical start of this period, present ONLY when the birth date truncated it. The Vimshottari cycle is already running when a native is born, so the period in force at birth began earlier: startDate is clipped to the birth moment while this field keeps the real start. Its presence is also why the first period of a chart can contain fewer than 9 sub-periods, the earlier ones having finished before birth. Absent on every period that runs its full length. */ nominalStartDate?: string; /** * Vedic interpretation of the planetary period describing themes, karmic lessons, and life areas affected by this graha. */ interpretation?: string; /** * KP significators of this period lord, read from the Placidus birth chart in the requested ayanamsa. Present only when the request sets "significators": true. */ significators?: { /** * House 1-12 this lord occupies in the Placidus birth chart. Its own Level 2 signification, repeated here because the occupied house is the first thing a KP reading looks at. */ house: number; /** * Lord of the nakshatra this planet sits in, one of the 9 grahas. In KP the star lord outranks the planet itself: a period lord mainly delivers the houses its star lord occupies and owns, which is why those appear at L1 and L3 rather than the planet own house. */ starLord: string; /** * KP sub lord of this planet, the 1 of 249 subdivision its longitude falls in, one of the 9 grahas. The star lord says WHAT results the period gives, the sub lord says WHETHER they materialize, so KP judgement checks both. */ subLord?: string; /** * KP 4-level significator breakdown showing which houses (1-12) this planet signifies at each strength tier. L1 is strongest, L4 is weakest. */ signifies: { /** * Level 1, the strongest signification (grade A). Houses influenced because this planet sits in the nakshatra (star) of a planet occupying those houses. For Rahu and Ketu, also includes the L1 houses of their agent planets (conjoined, aspecting, sign lord). */ L1: Array; /** * Level 2 (grade B). The house this planet physically occupies. For Rahu and Ketu, also includes houses occupied by their agent planets. */ L2: Array; /** * Level 3 (grade C). Houses influenced because this planet sits in the nakshatra of the sign lord (owner) of those houses. For Rahu and Ketu, also includes the L3 houses of their agent planets. */ L3: Array; /** * Level 4, the weakest signification (grade D). Houses this planet rules by zodiac sign ownership, up to 2 for Sun through Saturn and 3 where a sign is intercepted. Rahu and Ketu own no sign, so their L4 comes entirely from their agent planets. */ L4: Array; }; /** * Every house this lord signifies, deduplicated and ordered strongest tier first. Where a house is reached at more than one level it is listed once, at its strongest. This is the flat "houses signified" column of a KP dasha table. */ signifiedHouses: Array; /** * Subset of signifiedHouses reached at grade A or B (levels L1 and L2). These are the houses a KP reading acts on for this period; the rest are supporting connections. */ strongHouses: Array; /** * How firmly this lord is tied to the houses it signifies, on the KP A to D significator grading. Reproducible from the significator levels alone, in two steps. STEP 1, per house keep only the strongest level: a planet routinely reaches the same house at more than one level, for example its star lord occupies house 11 and it also owns house 11, and KP cites a significator by its best connection, so that house counts once at grade A. This is why signifiedHouses is shorter than the four level arrays concatenated, and omitting it is what makes a hand calculation disagree. STEP 2, average the surviving weights: each house contributes 100, 75, 50 or 25 for grade A, B, C or D, and the mean is the score. Worked example, a lord signifying house 11 at level 1, house 6 at level 2 and house 2 at level 4 scores (100 + 75 + 25) / 3 = 66.7, which lands in band B because the band edges are the midpoints 87.5, 62.5 and 37.5. The score says how firmly the lord is connected, never whether the houses are favourable, which depends on the matter being judged. */ strength: { /** * Mean KP percentage weight across signifiedHouses, each house counted at its strongest level (A 100, B 75, C 50, D 25). A mean rather than a total, so signifying many houses weakly does not outrank signifying two houses at grade A. */ score: number; /** * Band the score falls in, on the standard KP significator grading: A planets in the constellation of the occupant, B occupants, C planets in the constellation of the house owner, D the house owner. Band edges are the midpoints between the four weights. */ grade: 'A' | 'B' | 'C' | 'D'; /** * Plain-language form of grade: "very-strong" for A, "strong" for B, "moderate" for C, "weak" for D. Says how firmly this lord is connected to the houses it signifies, NOT whether those houses are favourable, which depends on the matter being judged. */ label: 'very-strong' | 'strong' | 'moderate' | 'weak'; }; }; /** * Parent Mahadasha lord under which this Antardasha sub-period runs. */ mahadashaLord: 'Ketu' | 'Venus' | 'Sun' | 'Moon' | 'Mars' | 'Rahu' | 'Jupiter' | 'Saturn' | 'Mercury'; /** * Parent Antardasha lord under which this Pratyantardasha runs. */ antardashaLord: 'Ketu' | 'Venus' | 'Sun' | 'Moon' | 'Mars' | 'Rahu' | 'Jupiter' | 'Saturn' | 'Mercury'; /** * Parent Pratyantardasha lord under which this Sookshma dasha runs. */ pratyantardashaLord: 'Ketu' | 'Venus' | 'Sun' | 'Moon' | 'Mars' | 'Rahu' | 'Jupiter' | 'Saturn' | 'Mercury'; }; /** * Prana dasha periods within this Sookshma dasha, proportional to each planet Vimshottari years, sorted chronologically and starting with the Sookshma lord. Fewer than nine only when the parent Sookshma dasha is the one that was already running at birth, in which case the periods that ended before the birth date are omitted. */ pranaDashas: Array<{ /** * Ruling graha of this Vimshottari dasha period. One of 9 planets in the Ketu-Venus-Sun-Moon-Mars-Rahu-Jupiter-Saturn-Mercury sequence. */ planet: 'Ketu' | 'Venus' | 'Sun' | 'Moon' | 'Mars' | 'Rahu' | 'Jupiter' | 'Saturn' | 'Mercury'; /** * Start datetime of this dasha period. Adjusted to the requested timezone offset. */ startDate: string; /** * End datetime of this dasha period. Adjusted to the requested timezone offset. */ endDate: string; /** * Duration of this dasha period in years. Mahadasha durations range from 6 years (Sun) to 20 years (Venus). */ durationYears: number; /** * Theoretical start of this period, present ONLY when the birth date truncated it. The Vimshottari cycle is already running when a native is born, so the period in force at birth began earlier: startDate is clipped to the birth moment while this field keeps the real start. Its presence is also why the first period of a chart can contain fewer than 9 sub-periods, the earlier ones having finished before birth. Absent on every period that runs its full length. */ nominalStartDate?: string; /** * Vedic interpretation of the planetary period describing themes, karmic lessons, and life areas affected by this graha. */ interpretation?: string; /** * KP significators of this period lord, read from the Placidus birth chart in the requested ayanamsa. Present only when the request sets "significators": true. */ significators?: { /** * House 1-12 this lord occupies in the Placidus birth chart. Its own Level 2 signification, repeated here because the occupied house is the first thing a KP reading looks at. */ house: number; /** * Lord of the nakshatra this planet sits in, one of the 9 grahas. In KP the star lord outranks the planet itself: a period lord mainly delivers the houses its star lord occupies and owns, which is why those appear at L1 and L3 rather than the planet own house. */ starLord: string; /** * KP sub lord of this planet, the 1 of 249 subdivision its longitude falls in, one of the 9 grahas. The star lord says WHAT results the period gives, the sub lord says WHETHER they materialize, so KP judgement checks both. */ subLord?: string; /** * KP 4-level significator breakdown showing which houses (1-12) this planet signifies at each strength tier. L1 is strongest, L4 is weakest. */ signifies: { /** * Level 1, the strongest signification (grade A). Houses influenced because this planet sits in the nakshatra (star) of a planet occupying those houses. For Rahu and Ketu, also includes the L1 houses of their agent planets (conjoined, aspecting, sign lord). */ L1: Array; /** * Level 2 (grade B). The house this planet physically occupies. For Rahu and Ketu, also includes houses occupied by their agent planets. */ L2: Array; /** * Level 3 (grade C). Houses influenced because this planet sits in the nakshatra of the sign lord (owner) of those houses. For Rahu and Ketu, also includes the L3 houses of their agent planets. */ L3: Array; /** * Level 4, the weakest signification (grade D). Houses this planet rules by zodiac sign ownership, up to 2 for Sun through Saturn and 3 where a sign is intercepted. Rahu and Ketu own no sign, so their L4 comes entirely from their agent planets. */ L4: Array; }; /** * Every house this lord signifies, deduplicated and ordered strongest tier first. Where a house is reached at more than one level it is listed once, at its strongest. This is the flat "houses signified" column of a KP dasha table. */ signifiedHouses: Array; /** * Subset of signifiedHouses reached at grade A or B (levels L1 and L2). These are the houses a KP reading acts on for this period; the rest are supporting connections. */ strongHouses: Array; /** * How firmly this lord is tied to the houses it signifies, on the KP A to D significator grading. Reproducible from the significator levels alone, in two steps. STEP 1, per house keep only the strongest level: a planet routinely reaches the same house at more than one level, for example its star lord occupies house 11 and it also owns house 11, and KP cites a significator by its best connection, so that house counts once at grade A. This is why signifiedHouses is shorter than the four level arrays concatenated, and omitting it is what makes a hand calculation disagree. STEP 2, average the surviving weights: each house contributes 100, 75, 50 or 25 for grade A, B, C or D, and the mean is the score. Worked example, a lord signifying house 11 at level 1, house 6 at level 2 and house 2 at level 4 scores (100 + 75 + 25) / 3 = 66.7, which lands in band B because the band edges are the midpoints 87.5, 62.5 and 37.5. The score says how firmly the lord is connected, never whether the houses are favourable, which depends on the matter being judged. */ strength: { /** * Mean KP percentage weight across signifiedHouses, each house counted at its strongest level (A 100, B 75, C 50, D 25). A mean rather than a total, so signifying many houses weakly does not outrank signifying two houses at grade A. */ score: number; /** * Band the score falls in, on the standard KP significator grading: A planets in the constellation of the occupant, B occupants, C planets in the constellation of the house owner, D the house owner. Band edges are the midpoints between the four weights. */ grade: 'A' | 'B' | 'C' | 'D'; /** * Plain-language form of grade: "very-strong" for A, "strong" for B, "moderate" for C, "weak" for D. Says how firmly this lord is connected to the houses it signifies, NOT whether those houses are favourable, which depends on the matter being judged. */ label: 'very-strong' | 'strong' | 'moderate' | 'weak'; }; }; /** * Parent Mahadasha lord under which this Antardasha sub-period runs. */ mahadashaLord: 'Ketu' | 'Venus' | 'Sun' | 'Moon' | 'Mars' | 'Rahu' | 'Jupiter' | 'Saturn' | 'Mercury'; /** * Parent Antardasha lord under which this Pratyantardasha runs. */ antardashaLord: 'Ketu' | 'Venus' | 'Sun' | 'Moon' | 'Mars' | 'Rahu' | 'Jupiter' | 'Saturn' | 'Mercury'; /** * Parent Pratyantardasha lord under which this Sookshma dasha runs. */ pratyantardashaLord: 'Ketu' | 'Venus' | 'Sun' | 'Moon' | 'Mars' | 'Rahu' | 'Jupiter' | 'Saturn' | 'Mercury'; /** * Parent Sookshma dasha lord under which this Prana dasha runs. */ sookshmaLord: 'Ketu' | 'Venus' | 'Sun' | 'Moon' | 'Mars' | 'Rahu' | 'Jupiter' | 'Saturn' | 'Mercury'; }>; }; }; export type GetPranaDashasResponse = GetPranaDashasResponses[keyof GetPranaDashasResponses]; export type GetVedicDailyReadingData = { body?: { /** * Birth date in YYYY-MM-DD format. Fixes the Janma Rashi and Janma Nakshatra every part of this reading is counted from, and the natal Ashtakavarga the bindu gate reads. */ birthDate: string; /** * Birth time in HH:MM:SS format (24-hour). The Moon moves about half a degree an hour, so an error here moves the Janma Rashi and Janma Nakshatra and therefore every gochara house count, the tarabala and the chandrabala in this response. */ birthTime: string; /** * Birth location latitude in decimal degrees. Sets the natal house cusps behind the Ashtakavarga scorecard and the KP significators, and the sunrise that opens the panchanga day. */ latitude: number; /** * Birth location longitude in decimal degrees. Affects local sidereal time for the natal cusps and the sunrise the reading is composed at. */ longitude: number; /** * Timezone: IANA name (e.g. "Asia/Kolkata", "America/New_York") OR decimal hours from UTC (e.g. -5 for EST, 5.5 for IST). IANA strings are resolved to the DST-correct offset for the date being read. Interprets the birth time and the civil date below. Defaults to 5.5. */ timezone?: number | string; /** * Civil date to read, in YYYY-MM-DD format. Defaults to today (UTC). The panchanga day it names runs from sunrise at the birth coordinates to the next sunrise, not from midnight, so a reading for this date covers the night that follows it. */ date?: string; /** * Lunar node type for Rahu and Ketu. "mean" uses the smooth mean node, which is the traditional Vedic default and what printed panchangs use. "true" uses the osculating node, which swings up to 1.5 degrees either side of mean and can therefore move a node into a different rashi and change its gochara house. Defaults to "mean". */ nodeType?: 'mean' | 'true'; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; /** * Which signification vocabulary the houseThemes map returns. "general" gives the classical bhava significations (self, wealth, siblings, home, and so on). "finance" gives the money reading of the same twelve bhavas, so house 2 returns income and savings, 5 speculation and risk appetite, 8 sudden money and leverage, 11 gains and profits, and 12 expenses and capital outflow. Use "finance" for wealth, income, business and market timing questions in Krishnamurti Paddhati, where the significator house groups 2, 6, 10, 11 for earned income and 5, 8, 11 for speculation are read against a running dasha. Defaults to "general". */ focus?: 'general' | 'finance'; }; url: '/vedic-astrology/daily'; }; export type GetVedicDailyReadingErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetVedicDailyReadingError = GetVedicDailyReadingErrors[keyof GetVedicDailyReadingErrors]; export type GetVedicDailyReadingResponses = { /** * Daily reading composed successfully */ 200: { /** * Every sidereal frame behind this reading, so a cached or forwarded payload is self describing and no number sits under a label it did not come from. TWO ayanamsas are in play by design: positions are Lahiri, and the Placidus cusps plus the KP significators are KP-Newcomb, which is the frame KP owns and the split a practitioner actually works in. The two differ by about 0.09 degrees, which is under a third of a KP sub-lord span and enough to move a placement near a boundary, so the reading declares which produced what rather than leaving a caller to guess. THREE entries for two ayanamsas, because Lahiri is read at two instants: the birth moment and the sunrise of the day being read, roughly half a degree apart on a chart forty years old, six times the gap between the two ayanamsas themselves. There is no ayanamsa request field on this route and there will not be one, since a single selector cannot honour two frames and accepting it would promise something the composition cannot deliver. */ frames: { /** * Lahiri at the birth instant. Produces the natal Moon this whole reading is counted from, the Vimshottari balance, and the natal graha rows of the Ashtakavarga scorecard the bindu gate reads. */ natal: { /** * Sidereal frame this part of the reading was cast in. Always "lahiri" here: it is not a caller choice, because the composition runs two frames at once and a single request field could only ever name one of them. */ ayanamsa: string; /** * Degrees actually subtracted from every tropical longitude this frame produced. Subtract it back to recover the tropical positions, or compare it against your reference software to confirm you are in the same frame before chasing a placement difference. */ ayanamsaDegrees: number; /** * ISO instant the ayanamsa was read at. Part of the value, not metadata: an ayanamsa moves about 50.3 arcseconds a year, so the same frame read at a birth in 1984 and at a transit in 2026 differs by more than half a degree. */ at: string; /** * Response sections this frame is a determinant of, as paths into this payload. One of subject, grahas, panchanga, tara, chandrabala, dasha, areas.finance. A section appears under EVERY frame that feeds it, which is why grahas is listed three times: the transiting longitudes and the natal Moon they are counted from are both Lahiri read at different instants, while the Ashtakavarga Lagna row behind binduCount and kaksha is KP-Newcomb. Exactly two sections belong to one frame alone, subject to the natal frame and panchanga to the transit frame. */ governs: Array<'subject' | 'grahas' | 'panchanga' | 'tara' | 'chandrabala' | 'dasha' | 'areas.finance'>; }; /** * Lahiri at sunrise on the day being read. Produces every transiting longitude and every panchanga limb. Inside one day precession moves it 0.14 arcseconds, so this one value speaks for every limb resolved between the two sunrises. */ transit: { /** * Sidereal frame this part of the reading was cast in. Always "lahiri" here: it is not a caller choice, because the composition runs two frames at once and a single request field could only ever name one of them. */ ayanamsa: string; /** * Degrees actually subtracted from every tropical longitude this frame produced. Subtract it back to recover the tropical positions, or compare it against your reference software to confirm you are in the same frame before chasing a placement difference. */ ayanamsaDegrees: number; /** * ISO instant the ayanamsa was read at. Part of the value, not metadata: an ayanamsa moves about 50.3 arcseconds a year, so the same frame read at a birth in 1984 and at a transit in 2026 differs by more than half a degree. */ at: string; /** * Response sections this frame is a determinant of, as paths into this payload. One of subject, grahas, panchanga, tara, chandrabala, dasha, areas.finance. A section appears under EVERY frame that feeds it, which is why grahas is listed three times: the transiting longitudes and the natal Moon they are counted from are both Lahiri read at different instants, while the Ashtakavarga Lagna row behind binduCount and kaksha is KP-Newcomb. Exactly two sections belong to one frame alone, subject to the natal frame and panchanga to the transit frame. */ governs: Array<'subject' | 'grahas' | 'panchanga' | 'tara' | 'chandrabala' | 'dasha' | 'areas.finance'>; }; /** * KP-Newcomb, read at UTC midnight of the birth date. Produces the Placidus cusps behind the Ashtakavarga Lagna row and the KP significators behind the finance area, exactly as every KP route on this API computes them. */ kp: { /** * Sidereal frame this part of the reading was cast in. Always "kp-newcomb" here: it is not a caller choice, because the composition runs two frames at once and a single request field could only ever name one of them. */ ayanamsa: string; /** * Degrees actually subtracted from every tropical longitude this frame produced. Subtract it back to recover the tropical positions, or compare it against your reference software to confirm you are in the same frame before chasing a placement difference. */ ayanamsaDegrees: number; /** * ISO instant the ayanamsa was read at. Part of the value, not metadata: an ayanamsa moves about 50.3 arcseconds a year, so the same frame read at a birth in 1984 and at a transit in 2026 differs by more than half a degree. */ at: string; /** * Response sections this frame is a determinant of, as paths into this payload. One of subject, grahas, panchanga, tara, chandrabala, dasha, areas.finance. A section appears under EVERY frame that feeds it, which is why grahas is listed three times: the transiting longitudes and the natal Moon they are counted from are both Lahiri read at different instants, while the Ashtakavarga Lagna row behind binduCount and kaksha is KP-Newcomb. Exactly two sections belong to one frame alone, subject to the natal frame and panchanga to the transit frame. */ governs: Array<'subject' | 'grahas' | 'panchanga' | 'tara' | 'chandrabala' | 'dasha' | 'areas.finance'>; }; }; /** * Civil date this reading covers, echoing the request field or the UTC date it defaulted to. */ date: string; /** * ISO instant the panchanga day begins, which is SUNRISE at the birth coordinates and not midnight. Every limb below is resolved at this instant. Where the Sun does not rise, local noon is used instead and the substitution is named in degraded rather than applied silently. */ dayStart: string; /** * ISO instant the panchanga day ends, which is the next sunrise. */ dayEnd: string; /** * The two natal reference points this whole reading is counted from, plus the longitude they come from. */ subject: { /** * Natal Moon rashi, the reference point every gochara house count in this response is taken from. Always English. */ janmaRashi: string; /** * Natal Moon nakshatra, the reference point the tarabala is counted from. Canonical Sanskrit. */ janmaNakshatra: string; /** * Janma Nakshatra number 1 to 27, counted from Ashwini. */ janmaNakshatraNumber: number; /** * Sidereal longitude of the natal Moon in degrees. The single value both reference points are derived from, so any disagreement with a reference chart can be traced to its source rather than to a verdict. */ moonLongitude: number; }; /** * The four panchanga limbs, each resolved at sunrise and each carrying the instant it gives way, so a client can label the whole day rather than asserting one value for it. */ panchanga: { /** * Weekday of the panchanga day. The Hindu vara runs sunrise to sunrise, so it can differ from the civil weekday of the same date before dawn. Always English. */ vara: string; /** * The same weekday under its Sanskrit name. */ varaSanskrit: string; /** * Lunar fortnight at sunrise: Shukla for the waxing half, Krishna for the waning half. */ paksha: string; /** * Tithi (lunar day) running at sunrise, with the instant it ends. The tithi is the 12-degree step of the Moon away from the Sun, so its length varies through the month. */ tithi: { /** * tithi number in its own cycle, resolved at sunrise. */ number: number; /** * Name of the tithi running at sunrise. Canonical Sanskrit, so it stays safe to compare against in code. */ name: string; /** * ISO instant this tithi ends. Read from the same transition search POST /panchang/detailed publishes, never recomputed here, so the two endpoints cannot disagree about when the event happens. */ validTo: string; /** * The tithi that follows, so the rest of the day can be labelled without a second request. */ next: string; /** * How long this component holds one verdict. Present on every component because this reading joins two genres classical literature keeps in separate books: a gochara verdict lasts as long as the graha stays in a rashi, which is years for Saturn, while a tarabala changes overnight. Without it a Saturn verdict that reads identically for nine hundred days would sit under one date field beside a limb that turns over at dawn. */ timescale: 'hours' | 'days' | 'months' | 'years'; }; /** * Nakshatra the Moon occupies at sunrise, with the instant it ends. This is the sky-wide limb; for what it means to THIS native, read the tara array. */ nakshatra: { /** * nakshatra number in its own cycle, resolved at sunrise. */ number: number; /** * Name of the nakshatra running at sunrise. Canonical Sanskrit, so it stays safe to compare against in code. */ name: string; /** * ISO instant this nakshatra ends. Read from the same transition search POST /panchang/detailed publishes, never recomputed here, so the two endpoints cannot disagree about when the event happens. */ validTo: string; /** * The nakshatra that follows, so the rest of the day can be labelled without a second request. */ next: string; /** * How long this component holds one verdict. Present on every component because this reading joins two genres classical literature keeps in separate books: a gochara verdict lasts as long as the graha stays in a rashi, which is years for Saturn, while a tarabala changes overnight. Without it a Saturn verdict that reads identically for nine hundred days would sit under one date field beside a limb that turns over at dawn. */ timescale: 'hours' | 'days' | 'months' | 'years'; }; /** * Nitya yoga running at sunrise, with the instant it ends. The 27 yogas step through the combined longitude of the Sun and the Moon. */ yoga: { /** * yoga number in its own cycle, resolved at sunrise. */ number: number; /** * Name of the yoga running at sunrise. Canonical Sanskrit, so it stays safe to compare against in code. */ name: string; /** * ISO instant this yoga ends. Read from the same transition search POST /panchang/detailed publishes, never recomputed here, so the two endpoints cannot disagree about when the event happens. */ validTo: string; /** * The yoga that follows, so the rest of the day can be labelled without a second request. */ next: string; /** * How long this component holds one verdict. Present on every component because this reading joins two genres classical literature keeps in separate books: a gochara verdict lasts as long as the graha stays in a rashi, which is years for Saturn, while a tarabala changes overnight. Without it a Saturn verdict that reads identically for nine hundred days would sit under one date field beside a limb that turns over at dawn. */ timescale: 'hours' | 'days' | 'months' | 'years'; }; /** * Karana running at sunrise, with the instant it ends. A karana is half a tithi, which is why it is the fastest of the four limbs. */ karana: { /** * karana number in its own cycle, resolved at sunrise. */ number: number; /** * Name of the karana running at sunrise. Canonical Sanskrit, so it stays safe to compare against in code. */ name: string; /** * ISO instant this karana ends. Read from the same transition search POST /panchang/detailed publishes, never recomputed here, so the two endpoints cannot disagree about when the event happens. */ validTo: string; /** * The karana that follows, so the rest of the day can be labelled without a second request. */ next: string; /** * How long this component holds one verdict. Present on every component because this reading joins two genres classical literature keeps in separate books: a gochara verdict lasts as long as the graha stays in a rashi, which is years for Saturn, while a tarabala changes overnight. Without it a Saturn verdict that reads identically for nine hundred days would sit under one date field beside a limb that turns over at dawn. */ timescale: 'hours' | 'days' | 'months' | 'years'; }; }; /** * All nine transiting grahas, each with its four gate results and the ONE state they produced. The gates run in the order the sources give them: house from the natal Moon, then vedha, then the bindu gate, then the nullifiers of Phaladeepika XXVI.30 to XXVI.32. Obstruction is terminal, so a blocked transit is never rescued by the gates that follow it. */ grahas: Array<{ /** * Graha name, Sun through Ketu. Always English, whatever the lang parameter says, so it stays safe to compare against in code. */ graha: string; /** * Rashi this graha is transiting on the day being read. Always English. */ sign: string; /** * Sidereal longitude of the transiting graha in degrees, 0 to 360, Lahiri frame. */ longitude: number; /** * House this graha transits counted whole-sign and inclusively from the natal Moon rashi (Janma Rashi), so the Moon rashi itself is 1. This is the reference classical Gochara is reckoned in: Phaladeepika XXVI.1 opens the transit chapter by saying that of all the Lagnas only the Moon Lagna matters for transit results. A reading counted from the Lagna instead answers a different question and every verdict below would be wrong. */ houseFromMoon: number; /** * How long this component holds one verdict. Present on every component because this reading joins two genres classical literature keeps in separate books: a gochara verdict lasts as long as the graha stays in a rashi, which is years for Saturn, while a tarabala changes overnight. Without it a Saturn verdict that reads identically for nine hundred days would sit under one date field beside a limb that turns over at dawn. */ timescale: 'hours' | 'days' | 'months' | 'years'; /** * Gate 1. Whether houseFromMoon is on this graha classical favourable list (Phaladeepika XXVI.2). The baseline verdict, before vedha, bindus or the nullifiers have had their say. */ favourable: boolean; /** * Gate 1 evidence: the whole favourable list for this graha, so the baseline verdict can be checked in place without a second request or a table lookup. */ favourableHouses: Array; /** * Gate 2. The house whose occupation by another graha cancels this transit (Phaladeepika XXVI.3-8). Null when the transit is not favourable to begin with, since there is nothing for an obstruction to cancel. */ vedhaHouse: number | null; /** * Gate 2. Grahas actually standing in vedhaHouse, with the mutual exemptions already applied. Empty when nothing obstructs. A non-empty list makes the state "obstructed", which is a THIRD outcome rather than a smaller number: the texts cancel the promised good outright rather than discounting it. */ obstructedBy: Array; /** * Gate 2. Grahas that cannot obstruct this one however they transit, from the two mutual exemptions the texts name: the Sun and Saturn do not obstruct each other, and neither do the Moon and Mercury. */ vedhaExempt: Array; /** * Gate 3. Bindus this graha holds in the whole sign it is transiting, 0 to 8, or null for Rahu and Ketu, which have no Bhinnashtakavarga and therefore SKIP this gate entirely rather than scoring zero. The gate reads the number two ways: a favourable house carrying fewer than 4 bindus under delivers, and an unfavourable house carrying a strict majority of the eight contributors, 5 or more, is turned good by Phaladeepika XXVI.41. Exactly 4 fires neither rule, which is the literal reading of both phrasings rather than a rounding choice. WHOSE READING THE NUMBER IS, stated because generalising it is ours: B.V. Raman prints 4 once and prints it about the MOON, then generalises the PRINCIPLE to every graha in the next sentence without repeating any number, and Phaladeepika XXVI.41 is general across grahas and also states no number. Applying 4 to all nine bodies is RoxyAPI reading the general rule through the one worked example the author gave it, and it is not a universally stated classical threshold. */ binduCount: number | null; /** * Gochara Kaksha: the ashtakavarga-qualified reading of this transit. The sign says where a graha is, this says whether the exact stretch it currently occupies is one its own Bhinnashtakavarga supports, which is the classical way of refining a transit verdict from sign-level to under four degrees. */ kaksha: { /** * Kaksha number 1-8 within the current sign. Each sign divides into eight kakshas of 3 degrees 45 minutes, crossed in order, so this is how far through the sign the graha has travelled. */ number: number; /** * Graha ruling this kaksha. The eight lords run Saturn, Jupiter, Mars, Sun, Venus, Mercury, Moon, Lagna from the start of every sign, ordered by how long each takes to cross a sign. */ lord: string; /** * Degree within the sign where this kaksha begins (0, 3.75, 7.5 and so on). */ startDegree: number; /** * Degree within the sign where this kaksha ends. */ endDegree: number; /** * Whether this kaksha lord gave the transiting graha a bindu in the sign being transited, which is the Gochara Kaksha verdict: true reads as a favourable stretch of the transit, false as an unfavourable one. Null means the question does not apply rather than that the answer is no, because Rahu and Ketu have no Bhinnashtakavarga to read. Never render null as unfavourable. */ bindu: boolean | null; /** * Bindus the transiting graha holds in this whole sign, 0-8, or null for Rahu and Ketu. Context for the verdict, since the same kaksha reads differently in a sign worth 7 than in one worth 1. */ binduCount: number | null; }; /** * Gate 4. Dignity of the graha in the sign it is transiting, or null for Rahu and Ketu which have none. Feeds the Phaladeepika XXVI.31 shield ("exalted" or "own" does no harm in an untoward bhava) and the XXVI.32 weakness ("debilitated" or "enemy" voids a good transit). One of exalted, own, debilitated, enemy, neutral. */ dignity: 'exalted' | 'own' | 'debilitated' | 'enemy' | 'neutral' | null; /** * Gate 4. Whether the graha is combust at the transit moment, or null for the Sun and the two nodes where the question does not arise at all. Combustion voids a good transit under Phaladeepika XXVI.32 and aggravates a bad one. */ combust: boolean | null; /** * Gate 4. Transiting natural benefics casting graha drishti on this graha. Under Phaladeepika XXVI.30 a benefic sight on a BAD result is what voids it. Read as drishti from the other TRANSITING grahas, which is a school choice this endpoint makes and states: the sloka sits between the vedha rules and the rules about the transiting graha own condition. */ aspectedByBenefic: Array; /** * Gate 4. Transiting natural malefics casting graha drishti on this graha. A malefic sight on a GOOD result voids it under Phaladeepika XXVI.30. Rahu and Ketu never appear here: they cast no drishti in this package, which is its own documented school choice, although they can be aspected. */ aspectedByMalefic: Array; /** * Gate 4. Transiting natural enemies of this graha casting graha drishti on it. Phaladeepika XXVI.30 voids the result either way for an enemy sight, whichever direction the baseline verdict pointed. */ aspectedByEnemy: Array; /** * The single outcome the four gates produced for this graha, and the only field the score counts. "favourable" is the house list holding with nothing cancelling it, "underdelivered" is a favourable house below the bindu delivery floor, "obstructed" is vedha, "void" is an aspect, a dignity shield or a weakness emptying the result of effect, "aggravated" is the one compounding rule in the chapter, and "unfavourable" is a house that was never on the list. Canonical English machine values: every one is a classical outcome word rather than an invented label, which is why none carries a translated sibling. */ state: 'favourable' | 'underdelivered' | 'obstructed' | 'void' | 'aggravated' | 'unfavourable'; /** * The rule that decided the state, named so a verdict can be checked against its sloka without leaving the payload. */ stateSource: string; }>; /** * Tarabala for THIS native, as an array of windows rather than one value, because the Moon can change nakshatra inside a panchanga day and the reference panchangs print two windows when it does. Three windows happen and are returned when they do. One entry means the tara held all day. */ tara: Array<{ /** * ISO instant this tarabala window opens. */ validFrom: string; /** * ISO instant this tarabala window closes, which is when the Moon changes nakshatra. */ validTo: string; /** * How long this component holds one verdict. Present on every component because this reading joins two genres classical literature keeps in separate books: a gochara verdict lasts as long as the graha stays in a rashi, which is years for Saturn, while a tarabala changes overnight. Without it a Saturn verdict that reads identically for nine hundred days would sit under one date field beside a limb that turns over at dawn. */ timescale: 'hours' | 'days' | 'months' | 'years'; /** * Nakshatra the Moon occupies during this window. Canonical Sanskrit. */ moonNakshatra: string; /** * Tara number 1 to 9, counted inclusively from the Janma Nakshatra to the Moon nakshatra and folded by 9. */ number: number; /** * Name of the tara this native gets during this window, from the 9-tara cycle Janma through Parama Mitra. A Sanskrit proper noun and a canonical machine value, which is why the favourability is a separate field rather than something a caller has to infer from the word. */ name: 'Janma' | 'Sampat' | 'Vipat' | 'Kshema' | 'Pratyari' | 'Sadhaka' | 'Vadha' | 'Mitra' | 'Parama Mitra'; /** * Where this tara falls in the three-way classical reading. Taras 2, 4, 6, 8 and 9 are favourable, 3, 5 and 7 are not, and the 1st (Janma) is neither. */ quality: 'favourable' | 'unfavourable' | 'neutral'; }>; /** * Chandrabala for THIS native, windowed for the same reason as the tarabala: the Moon can change rashi inside the panchanga day. Ashtama Chandra is a separate flag on each window. */ chandrabala: Array<{ /** * ISO instant this chandrabala window opens. */ validFrom: string; /** * ISO instant this chandrabala window closes, which is when the Moon changes rashi. */ validTo: string; /** * How long this component holds one verdict. Present on every component because this reading joins two genres classical literature keeps in separate books: a gochara verdict lasts as long as the graha stays in a rashi, which is years for Saturn, while a tarabala changes overnight. Without it a Saturn verdict that reads identically for nine hundred days would sit under one date field beside a limb that turns over at dawn. */ timescale: 'hours' | 'days' | 'months' | 'years'; /** * Rashi the Moon occupies during this window. Always English. */ moonSign: string; /** * House the Moon rashi makes from the Janma Rashi, counted whole-sign and inclusively, so the Janma Rashi itself is 1. This is the number chandrabala is read off. */ houseFromMoon: number; /** * Whether the Moon stands in one of the rashis that give this native chandrabala during this window. */ favourable: boolean; /** * The Moon in the 8th from the Janma Rashi. Its OWN flag, printed beside chandrabala rather than folded into it, exactly as the reference panchangs print it. Folding it in would let a caller read one boolean and miss the warning the source deliberately separates. */ ashtamaChandra: boolean; }>; /** * The running Vimshottari chain at sunrise, outermost first, three levels deep. This is the frame the day is read inside, and it is also what the finance area reads the significators off. Empty for a chart whose cycle cannot be resolved. */ dasha: Array<{ /** * Which Vimshottari level this period is. Only mahadasha, antardasha, pratyantardasha are carried: the sookshma and prana lords turn over in hours and minutes, so embedding them would advertise a day-long cache lifetime over a value that is already stale. Use POST /dasha/current for those two. */ level: 'mahadasha' | 'antardasha' | 'pratyantardasha'; /** * Graha ruling this period. Always English. */ lord: string; /** * ISO instant this period begins. */ startDate: string; /** * ISO instant this period ends. */ endDate: string; /** * How long this component holds one verdict. Present on every component because this reading joins two genres classical literature keeps in separate books: a gochara verdict lasts as long as the graha stays in a rashi, which is years for Saturn, while a tarabala changes overnight. Without it a Saturn verdict that reads identically for nine hundred days would sit under one date field beside a limb that turns over at dawn. */ timescale: 'hours' | 'days' | 'months' | 'years'; }>; /** * Life areas carried as a TYPED closed set rather than an open map, so every generated SDK knows which keys exist. Finance ships alone in this version, because an area is a named classical house group with a citation and not a life category invented for a dropdown. Widening it later adds a key and breaks nothing. */ areas: { /** * The finance area: the positive house group 2, 5, 11 netted against the negative group 6, 8, 12, read off the lords of the running dasha, bhukti and antara, because that is the KP rule for when a matter fructifies, plus the natal basis the day is read against. ALWAYS AN OBJECT. Above latitude 66.56 the seven netted members are null, because the Placidus cusps behind the significators have no solution there, while natal is still populated because it is a property of the birth chart and needs no cusps; the reading also still carries its gochara, panchanga and dasha and names the omission in degraded. The two house groups are Krishnamurti Paddhati practice, but the NET is a KP practitioner convention rather than a classical operation: the KP sources that carry these groups use them as a promise test and an avoidance test, never as arithmetic. The groups also vary by author, and TWO houses are live disagreements rather than one. The 6th: some KP authors place it on the POSITIVE side as service income and salary, the exact opposite of the assignment used here. The 5th: it is named as a speculative GAIN house in the same KP sources that elsewhere call it a negation house, reading it as the 12th from the 6th and therefore loss of earning capacity, and both readings appear in one publication. The 1st is treated as a negation house by some authors on the same logic, as the 12th from the 2nd, and is not on either side here. This is a six house net and it is NOT the focus=finance lens, which re-reads all twelve bhavas in money vocabulary and moves no number. The two are orthogonal and both ship. */ finance: { /** * Share of the running lords six-house connections that land on the positive group, 0 to 100, rounded. A COUNT, so positive and negative below reproduce it in one division: round(positive / (positive + negative) * 100), which is the same signed net the top-level score uses with no neutral member, so 50 is as many connections on each side. Zero when the running lords reach none of the six houses, which is an ABSENCE of connection rather than a negative verdict. Null above latitude 66.56, where the Placidus cusps the KP significators are read from have no solution: the question does not apply there rather than the answer being no, so never render it as zero or as a weak verdict. The natal block beside it is unaffected and still ships, and degraded names areas.finance.score. The two house groups are Krishnamurti Paddhati practice, but the NET is a KP practitioner convention rather than a classical operation: the KP sources that carry these groups use them as a promise test and an avoidance test, never as arithmetic. The groups also vary by author, and TWO houses are live disagreements rather than one. The 6th: some KP authors place it on the POSITIVE side as service income and salary, the exact opposite of the assignment used here. The 5th: it is named as a speculative GAIN house in the same KP sources that elsewhere call it a negation house, reading it as the 12th from the 6th and therefore loss of earning capacity, and both readings appear in one publication. The 1st is treated as a negation house by some authors on the same logic, as the 12th from the 2nd, and is not on either side here. This is a six house net and it is NOT the focus=finance lens, which re-reads all twelve bhavas in money vocabulary and moves no number. The two are orthogonal and both ship. */ score: number | null; /** * The band the finance score falls in, on the same ladder as the top-level verdict so the two can never disagree about what a word means: "very-strong" above 75, "strong" above 50, "moderate" above 25, "weak" at 25 and below. Null above latitude 66.56, where the Placidus cusps the KP significators are read from have no solution: the question does not apply there rather than the answer being no, so never render it as zero or as a weak verdict. The natal block beside it is unaffected and still ships, and degraded names areas.finance.score. */ band: 'very-strong' | 'strong' | 'moderate' | 'weak' | null; /** * How many connections land on the positive house group 2, 5, 11, which KP reads as accumulated wealth, speculation and gains. Null above latitude 66.56, where the Placidus cusps the KP significators are read from have no solution: the question does not apply there rather than the answer being no, so never render it as zero or as a weak verdict. The natal block beside it is unaffected and still ships, and degraded names areas.finance.score. */ positive: number | null; /** * How many connections land on the negative house group 6, 8, 12, which KP reads as debt, sudden loss and expenditure. Null above latitude 66.56, where the Placidus cusps the KP significators are read from have no solution: the question does not apply there rather than the answer being no, so never render it as zero or as a weak verdict. The natal block beside it is unaffected and still ships, and degraded names areas.finance.score. */ negative: number | null; /** * Every positive-group connection, strongest KP level first. These are the specific lord-to-house links the score is made of, so the number can be audited rather than trusted. Null above latitude 66.56, where the Placidus cusps the KP significators are read from have no solution: the question does not apply there rather than the answer being no, so never render it as zero or as a weak verdict. The natal block beside it is unaffected and still ships, and degraded names areas.finance.score. */ drivers: Array<{ /** * The running dasha lord making this connection. A lord holding two of the three levels is listed once per house rather than twice, so nothing here is a hidden weight. */ graha: string; /** * The finance house this lord reaches. One of the positive group 2, 5, 11 or the negative group 6, 8, 12. */ house: number; /** * Strongest KP significator level at which this lord reaches this house, 1 to 4. Level 1 is a planet in the constellation of the occupant, 2 the occupant, 3 a planet in the constellation of the house owner, 4 the house owner. Strongest level per house wins, which is step 1 of the published grading rule the dasha routes already use. */ level: number; /** * The KP letter for that level, on the standard A to D significator grading. A is the strongest connection. */ grade: 'A' | 'B' | 'C' | 'D'; /** * Which of the running levels this graha rules. Carries the fact that one lord holds more than one level without letting it count twice. */ dashaLevels: Array<'mahadasha' | 'antardasha' | 'pratyantardasha'>; }> | null; /** * Every negative-group connection, strongest KP level first. Null above latitude 66.56, where the Placidus cusps the KP significators are read from have no solution: the question does not apply there rather than the answer being no, so never render it as zero or as a weak verdict. The natal block beside it is unaffected and still ships, and degraded names areas.finance.score. */ cautions: Array<{ /** * The running dasha lord making this connection. A lord holding two of the three levels is listed once per house rather than twice, so nothing here is a hidden weight. */ graha: string; /** * The finance house this lord reaches. One of the positive group 2, 5, 11 or the negative group 6, 8, 12. */ house: number; /** * Strongest KP significator level at which this lord reaches this house, 1 to 4. Level 1 is a planet in the constellation of the occupant, 2 the occupant, 3 a planet in the constellation of the house owner, 4 the house owner. Strongest level per house wins, which is step 1 of the published grading rule the dasha routes already use. */ level: number; /** * The KP letter for that level, on the standard A to D significator grading. A is the strongest connection. */ grade: 'A' | 'B' | 'C' | 'D'; /** * Which of the running levels this graha rules. Carries the fact that one lord holds more than one level without letting it count twice. */ dashaLevels: Array<'mahadasha' | 'antardasha' | 'pratyantardasha'>; }> | null; /** * The equal-weight mean of the three day-level layer scores printed beside it, recomputable as round((day + finance + natal) / 3). WHICH LAYER IS WHICH: "day" is the top-level score of this reading, "finance" is areas.finance.score above, and "natal" is the four natal wealth yoga rows on the same signed net as the day, present positive yogas for the native, a present negative one against, an absent verdict of either kind neutral, over the four rows: round(50 + 50 * (for minus against) / evaluated), so 50 is the balanced case with as many members for the native as against, 100 is every member for, 0 is every member against, and a member that is neither sits inside evaluated and pulls the result toward 50, so it is 38, 50, 63, 75 or 88 and a chart with none of the four reads 50. Every layer is centred on 50 the same way, so the mean is too. Equal weights are a RoxyAPI convention: no classical authority weights the natal chart, the running dasha and the transiting sky against each other, so the three are averaged as they are and printed beside the result, and the band uses the same ladder as verdict. The composite measures how much of this reading backs the native on this day and never the outcome of any matter: read it as support, not as a prediction. NULL IN TWO CASES, and neither is a low score. Null when the running lords reach none of the six houses, because an absence of connection is not a verdict and must not be averaged as one. Null above latitude 66.56, where the Placidus cusps the KP significators are read from have no solution: the question does not apply there rather than the answer being no, so never render it as zero or as a weak verdict. The natal block beside it is unaffected and still ships, and degraded names areas.finance.score. */ composite: { /** * The mean itself, 0 to 100, rounded, centred on 50 like each of its terms. Every term is printed in the layers below, so the division can be redone rather than trusted. */ score: number; /** * The band the composite falls in, on the same ladder the top-level verdict uses: "very-strong" above 75, "strong" above 50, "moderate" above 25, "weak" at 25 and below. */ band: 'very-strong' | 'strong' | 'moderate' | 'weak'; /** * The three terms of the mean, always in the order day, finance, natal. Published so a caller who wants different weights can apply them to these same three numbers instead of asking for a second reading. */ layers: Array<{ /** * Which term this row carries: "day" the top-level score of this reading, "finance" the KP net score in this area, "natal" the natal wealth net over the four verdict rows. Canonical English machine value, so it stays safe to switch on in code. */ layer: 'day' | 'finance' | 'natal'; /** * The term that went into the mean, 0 to 100. Each one is either printed elsewhere in this response or counted off a block that is, so no number enters the average unseen. */ score: number; /** * Where that one term lands on its own, on the same ladder as the composite band above: "very-strong" above 75, "strong" above 50, "moderate" above 25, "weak" at 25 and below. */ band: 'very-strong' | 'strong' | 'moderate' | 'weak'; }>; } | null; /** * The natal basis of this area: whether the chart is wealthy AT ALL, as the four classical wealth and poverty verdicts dhana, daridra, lakshmi, dhanamalika, each with the evidence that decided it. A PROPERTY OF THE BIRTH CHART AND NOT OF THE DAY, so it is the same block on every date this native is ever read for, which is exactly why it is CONTEXT rather than a term: it deliberately does not enter score, verdict, tally or evaluated, above or here, and the one number it does enter is the composite beside it, where it is printed as its own layer rather than folded in. Folding a constant into a per-day number would shift every day by the identical amount, carrying no information into the only comparison those numbers support, and it would break the published closed form that makes the top-level score reproducible by hand from grahas and the two sunrise windows alone. Read it as the standing question the day is being read against. The verdicts are the same ones POST /yoga/detect and POST /birth-chart return for this chart, computed in the Lahiri natal frame rather than in the KP-Newcomb frame the significators above use. PRESENT AT EVERY LATITUDE, including above the polar circle: these verdicts need only whole-sign houses from the Lagna, so nothing about them depends on the cusps the KP members above lose there. */ natal: Array<{ /** * Glossary id of the verdict, one of dhana, daridra, lakshmi, dhanamalika. Use it with GET /yoga/{id} for the full glossary entry, which carries the description and the classical result in every supported language. Canonical English, so it stays safe to switch on in code. */ id: string; /** * Classical Sanskrit name of the combination. Canonical whatever the lang parameter says, exactly as the yoga endpoints return it. */ name: string; /** * Which way a present verdict points, carried because three of the four are wealth combinations and Daridra is a poverty one, so present alone does not tell a client whether to read it as support or as pressure. Canonical English machine value. */ quality: 'Positive' | 'Negative' | 'Both'; /** * Whether the combination is on this chart. False means every rule in the family was evaluated and none held, which is a real answer rather than a missing one, and the evidence beside it names the full denominator. */ present: boolean; /** * Why the verdict reads the way it does: every rule that matched, named by its own glossary id and its verse, with the exact condition it matched on, then the scope of the family. This is what makes the verdict checkable against a text rather than a label to be trusted, and it is also where the two excluded rules are declared: daridra-8 and daridra-9 rest on a single authority and are barred from deciding a verdict, though both still ship through GET /yoga/{id}. English in every language, like the per-graha stateSource, because it is provenance rather than display copy. */ evidence: string; }>; }; }; /** * Strength of this day for this native, 0 to 100, centred on 50, over eleven members: the nine transiting grahas and the two Moon tests of the day. Each graha counts +1 when its state is favourable, -1 when its state is unfavourable or aggravated, and 0 when it is underdelivered, obstructed, void. The tarabala window holding at sunrise, tara[0], counts +1 when its quality is favourable, -1 when unfavourable and 0 when neutral; the chandrabala window holding at sunrise, chandrabala[0], counts +1 when favourable and -1 otherwise. Then score = round(50 + 50 * (for minus against) / evaluated), so 50 is the balanced case with as many members for the native as against, 100 is every member for, 0 is every member against, and a member that is neither sits inside evaluated and pulls the result toward 50. Recompute it from this response: for is the favourable count in tally plus the Moon tests that are for, against is the unfavourable and aggravated counts plus the Moon tests that are against, evaluated is the field of that name. Worked example: 2 grahas for and 4 against, both Moon tests for, out of 11 evaluated is round(50 + 50 * (4 - 4) / 11) = 50. The Moon is counted three times on a day, through its own gochara row, its rashi test and its nakshatra test, because the gochara chapter and the muhurta chapter both weigh the Moon and ask different questions of it. The four gates that decide each graha state are classical, Phaladeepika XXVI.2 to XXVI.41 and B.V. Raman on Ashtakavarga, and each graha names the rule that decided it in stateSource; tarabala and chandrabala are the two per-native day tests of the muhurta genre. The count over all of them is a RoxyAPI convention, and it is a signed count rather than a weighted sum because the texts make a high bindu count an OVERRIDE and make aspect, dignity and combustion NULLIFIERS, not points to add. How to read it: an ordinary day sits in the 40s, because nine bodies casting drishti void most transits under XXVI.30, and the slow grahas hold one verdict for a year or more while the two Moon tests turn daily, so the day moves inside the month. Above 50 the day is in favour of the native, and the top band needs six more members for than against, which is rare. It measures support, never the outcome of a matter: whether the day suits a particular purpose depends on the purpose being judged. */ score: number; /** * The score as one of four bands: "very-strong" above 75, "strong" above 50, "moderate" above 25, "weak" at 25 and below. A band starts above its edge, so a balanced day at exactly 50 is "moderate" and "strong" means the net is in favour of the native. "moderate" is the ordinary day. "weak" needs the members against to outnumber the members for by more than half of those evaluated, which is six of eleven, and "very-strong" is the mirror of that and is rare. The same four words band the finance score, the composite and each of its layers, on the same edges, so one word means one thing everywhere in this response. Canonical English machine values, the same enum every KP significator route returns. */ verdict: 'very-strong' | 'strong' | 'moderate' | 'weak'; /** * The full per-state count over the nine grahas, always all six states including the zeros, so it sums to nine and not to evaluated. This is the graha part of the input to the score; the other two members are read from tara[0] and chandrabala[0]. Published so the number is reproducible by hand, and so a caller who reads the states differently can compute their own figure from this response. */ tally: Array<{ /** * One of the six outcomes a transiting graha can reach. */ state: 'favourable' | 'underdelivered' | 'obstructed' | 'void' | 'aggravated' | 'unfavourable'; /** * How many of the evaluated grahas reached that state. */ count: number; }>; /** * How many members the score was taken over, and its denominator: the nine grahas put through the gates plus the two Moon tests read at sunrise, tara[0] and chandrabala[0]. Rahu and Ketu are among the nine: they skip the bindu gate because they have no Bhinnashtakavarga, and a skipped gate is not a failed one, so they still reach a state through the other three. */ evaluated: number; /** * Components this request could not supply, named rather than silently defaulted. Empty on an ordinary reading. A polar chart degrades through here instead of failing, so the caller still gets the gochara, the panchanga, the dasha and the natal basis of the finance area, and is told exactly what is missing. */ degraded: Array<{ /** * Which part of the reading this location or date could not supply. "areas.finance.score" names the KP net by the member it is read through: the finance area itself always ships and its natal block is always populated, and it is the seven netted members that are null. */ component: 'dayStart' | 'dayEnd' | 'areas.finance.score'; /** * Why it could not: "sun-does-not-rise" for a day with no sunrise at these coordinates, "polar-latitude" above 66.56 degrees where the Placidus cusps have no solution. */ reason: 'sun-does-not-rise' | 'polar-latitude'; }>; /** * Significations of each of the twelve bhavas (houses), keyed by house number 1 to 12, as short keywords. Bhava 1 is the Lagna (self, body, vitality), 2 wealth and speech, 4 home and mother, 7 marriage and partnership, 10 career and status, 11 gains. Use it to label the house numbers returned elsewhere in the response: a Vimshottari dasha period signifying houses 2, 7 and 8, or a KP significator carrying houses 11 and 6, becomes readable text without a separate lookup call. Returned once per response rather than repeated per period, and localized by the lang query parameter alongside every other interpretation field. */ houseThemes: { [key: string]: Array; }; /** * Which signification vocabulary produced the houseThemes keywords in this response, echoing the focus query parameter. Always present, and "general" when the parameter was omitted. Read it to label a rendered house legend, or to tell two cached responses apart when only one asked for the finance lens. */ focus: 'general' | 'finance'; }; }; export type GetVedicDailyReadingResponse = GetVedicDailyReadingResponses[keyof GetVedicDailyReadingResponses]; export type GetBasicPanchangData = { body?: { /** * Date in YYYY-MM-DD format. Panchang elements (Tithi, Nakshatra, Yoga, Karana) are calculated for this date. */ date: string; /** * Time in HH:MM:SS format (24-hour). Determines the exact Moon and Sun positions for tithi and nakshatra calculation. */ time: string; /** * Observer latitude in decimal degrees. Determines sunrise/sunset times which define the Vara (weekday) and muhurta boundaries. */ latitude: number; /** * Observer longitude in decimal degrees. Affects local time calculations for sunrise/sunset-dependent panchang elements. */ longitude: number; /** * Timezone offset from UTC in decimal hours. Defaults to 5.5 (IST). */ timezone?: number | string; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/vedic-astrology/panchang/basic'; }; export type GetBasicPanchangErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetBasicPanchangError = GetBasicPanchangErrors[keyof GetBasicPanchangErrors]; export type GetBasicPanchangResponses = { /** * Basic panchang with all five limbs (Tithi, Nakshatra, Yoga, Karana, Vara) including lunar phase, paksha, ruling planets, deities, and interpretive characteristics. */ 200: { /** * Lunar day (tithi) information with interpretations. Central panchang element for determining auspicious timings. */ tithi: { /** * Tithi number (1-30). 1-15 are Shukla Paksha (waxing), 16-30 are Krishna Paksha (waning). Purnima is 15, Amavasya is 30. */ number: number; /** * Sanskrit name of the tithi (lunar day). One of 30 tithis in the lunar month cycle. */ name: string; /** * Lunar fortnight: Shukla (waxing, bright half) or Krishna (waning, dark half). */ paksha: 'Shukla' | 'Krishna'; /** * Percentage of the current tithi elapsed (0-100). Useful for determining tithi strength and transition proximity. */ percent: number; /** * Presiding deity of this tithi from Vedic tradition. */ deity?: string; /** * Planetary ruler of this tithi. Influences the day energy and activities. */ rulingPlanet?: string; /** * Elemental quality of this tithi (Fire, Earth, Air, Water, Ether). */ element?: string; }; /** * Nakshatra (lunar mansion) information with interpretations */ nakshatra: { /** * Nakshatra index (1-27) in the zodiac sequence starting from Ashwini. Each nakshatra spans 13 degrees 20 minutes. */ number: number; /** * Sanskrit name of the nakshatra (lunar mansion). One of 27 nakshatras spanning the zodiac belt. */ name: string; /** * Planetary ruler of this nakshatra. Determines Vimshottari dasha lord and influences nakshatra characteristics. */ lord: string; /** * Pada (quarter, 1-4) of the nakshatra. Each nakshatra has 4 padas spanning 3 degrees 20 minutes each. Determines the navamsha sign and fine-tunes nakshatra predictions. */ pada: number; /** * Presiding deity of this nakshatra from Vedic mythology. Influences spiritual qualities and karmic themes. */ deity?: string; /** * Traditional symbol representing this nakshatra. Reflects core energy and life themes. */ symbol?: string; /** * Personality traits and behavioral tendencies when the Moon occupies this nakshatra. Useful for daily panchang readings. */ characteristics?: string; }; /** * Nitya Yoga information. Yoga is the third panchang element, derived from combined Sun-Moon longitude. */ yoga: { /** * Nitya Yoga index (1-27). Calculated from the sum of Sun and Moon sidereal longitudes divided by 13 degrees 20 minutes. */ number: number; /** * Sanskrit name of the Nitya Yoga. One of 27 yogas formed by combined Sun-Moon motion, each with distinct auspiciousness. */ name: string; /** * Characteristics and auspiciousness of this yoga for activity planning. */ characteristics?: string; }; /** * Karana (half-tithi) information. Fourth panchang element, changes twice per tithi. */ karana: { /** * Karana index. There are 11 karanas total (4 fixed + 7 movable) cycling through 60 half-tithis per lunar month. */ number: number; /** * Sanskrit name of the karana. 7 movable karanas (Bava through Naga) repeat 8 times, plus 4 fixed karanas. */ name: string; /** * Karana type: Movable (repeating, generally auspicious) or Fixed (occur once per month). */ type?: string; /** * Activity suitability and characteristics of this karana for muhurta selection. */ characteristics?: string; }; /** * Sidereal longitude of the Sun in degrees (0-360). Used for tithi and yoga calculations. */ sunLongitude: number; /** * Sidereal longitude of the Moon in degrees (0-360). Moon moves ~13 degrees per day through the nakshatras. */ moonLongitude: number; }; }; export type GetBasicPanchangResponse = GetBasicPanchangResponses[keyof GetBasicPanchangResponses]; export type GetDetailedPanchangData = { body?: { /** * Date in YYYY-MM-DD format. A single-digit month or day is accepted and zero-padded (2026-3-5 becomes 2026-03-05). Impossible calendar dates are rejected. */ date: string; /** * Observer latitude in decimal degrees. Determines sunrise and sunset times which define day/night boundaries for muhurta calculations. */ latitude: number; /** * Observer longitude in decimal degrees. Affects local time calculations for sunrise, sunset, and muhurta period boundaries. */ longitude: number; /** * Timezone offset from UTC in decimal hours, for example -5 for New York or 9 for Tokyo. Send the offset that matches the coordinates: sunrise, sunset and every muhurta boundary are found by searching forward from local midnight, so the default anchors the search to an Indian day. Omitting it for a location outside IST returns a correctly ordered set of periods for the wrong window, shifted by the difference between 5.5 and the real offset. Defaults to 5.5 (IST). */ timezone?: number | string; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/vedic-astrology/panchang/detailed'; }; export type GetDetailedPanchangErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetDetailedPanchangError = GetDetailedPanchangErrors[keyof GetDetailedPanchangErrors]; export type GetDetailedPanchangResponses = { /** * Full daily panchang with five limbs, sunrise/sunset/moonrise/moonset times, inauspicious periods (Rahu Kaal, Yamaganda, Gulika Kaal), auspicious muhurtas (Abhijit, Brahma), current hora, panchang transitions, and panchaka/bhadra/varjyam/amrit kalam analysis. */ 200: { /** * Date for which panchang is calculated. */ date: string; /** * Location coordinates used for all time-based calculations. */ location: { /** * Observer latitude used for sunrise/sunset calculation. */ latitude: number; /** * Observer longitude used for sunrise/sunset calculation. */ longitude: number; /** * Timezone offset from UTC in hours. */ timezone: number; }; /** * Vara (weekday) information based on Hindu sunrise calendar. */ vara: { /** * Weekday name in English. Vara begins at local sunrise, not at midnight, so a time before sunrise belongs to the previous vara. */ name: string; /** * Vara name transliterated from Sanskrit: Ravivara, Somavara, Mangalavara, Budhavara, Guruvara, Shukravara, Shanivara. Use this rather than name for a Jyotish-facing reading, since it is the form the classical texts use and it does not change with the lang parameter. */ sanskritName: string; /** * Ruling planet of the day (Vara lord). Influences day-level auspiciousness. */ lord: string; }; /** * Local sunrise in the requested timezone as YYYY-MM-DDTHH:MM:SS, with no zone suffix. Marks the start of the Hindu day. */ sunrise: string; /** * Local sunset in the requested timezone as YYYY-MM-DDTHH:MM:SS, with no zone suffix. Marks the transition to night muhurtas. */ sunset: string; /** * Moonrise time in the requested timezone. Can be null if Moon does not rise on this date. */ moonrise: string | null; /** * Moonset time in the requested timezone. Can be null if Moon does not set on this date. */ moonset: string | null; /** * Moon sign (Chandra Rashi) at sunrise. Central to Vedic astrology. determines daily emotional tone, Chandrabalam, and Tarabalam. */ moonSign: { /** * Moon rashi (sidereal zodiac sign) at sunrise. */ name: string; /** * Sanskrit name of the Moon rashi. */ sanskritName: string; }; /** * Sun sign (Surya Rashi) at sunrise. Determines the solar month (Saura Masa) in the Hindu calendar. Changes approximately once a month (Sankranti). */ sunSign: { /** * Sun rashi (sidereal zodiac sign) at sunrise. */ name: string; /** * Sanskrit name of the Sun rashi. */ sanskritName: string; }; /** * Sun nakshatra at sunrise. The Sun spends approximately 13-14 days in each nakshatra. Used for Surya-based muhurta and festival calculations. */ sunNakshatra: { /** * Sun nakshatra number (1-27). */ number: number; /** * Name of the nakshatra the Sun occupies. */ name: string; /** * Ruling planet (lord) of the Sun nakshatra. */ lord: string; /** * Pada (quarter) of the Sun nakshatra. */ pada: number; }; /** * Lunar day (tithi) information with interpretations. Central panchang element for determining auspicious timings. */ tithi: { /** * Tithi number (1-30). 1-15 are Shukla Paksha (waxing), 16-30 are Krishna Paksha (waning). Purnima is 15, Amavasya is 30. */ number: number; /** * Sanskrit name of the tithi (lunar day). One of 30 tithis in the lunar month cycle. */ name: string; /** * Lunar fortnight: Shukla (waxing, bright half) or Krishna (waning, dark half). */ paksha: 'Shukla' | 'Krishna'; /** * Percentage of the current tithi elapsed (0-100). Useful for determining tithi strength and transition proximity. */ percent: number; /** * Presiding deity of this tithi from Vedic tradition. */ deity?: string; /** * Planetary ruler of this tithi. Influences the day energy and activities. */ rulingPlanet?: string; /** * Elemental quality of this tithi (Fire, Earth, Air, Water, Ether). */ element?: string; }; /** * Nakshatra (lunar mansion) information with interpretations */ nakshatra: { /** * Nakshatra index (1-27) in the zodiac sequence starting from Ashwini. Each nakshatra spans 13 degrees 20 minutes. */ number: number; /** * Sanskrit name of the nakshatra (lunar mansion). One of 27 nakshatras spanning the zodiac belt. */ name: string; /** * Planetary ruler of this nakshatra. Determines Vimshottari dasha lord and influences nakshatra characteristics. */ lord: string; /** * Pada (quarter, 1-4) of the nakshatra. Each nakshatra has 4 padas spanning 3 degrees 20 minutes each. Determines the navamsha sign and fine-tunes nakshatra predictions. */ pada: number; /** * Presiding deity of this nakshatra from Vedic mythology. Influences spiritual qualities and karmic themes. */ deity?: string; /** * Traditional symbol representing this nakshatra. Reflects core energy and life themes. */ symbol?: string; /** * Personality traits and behavioral tendencies when the Moon occupies this nakshatra. Useful for daily panchang readings. */ characteristics?: string; }; /** * Nitya Yoga information. Yoga is the third panchang element, derived from combined Sun-Moon longitude. */ yoga: { /** * Nitya Yoga index (1-27). Calculated from the sum of Sun and Moon sidereal longitudes divided by 13 degrees 20 minutes. */ number: number; /** * Sanskrit name of the Nitya Yoga. One of 27 yogas formed by combined Sun-Moon motion, each with distinct auspiciousness. */ name: string; /** * Characteristics and auspiciousness of this yoga for activity planning. */ characteristics?: string; }; /** * Karana (half-tithi) information. Fourth panchang element, changes twice per tithi. */ karana: { /** * Karana index. There are 11 karanas total (4 fixed + 7 movable) cycling through 60 half-tithis per lunar month. */ number: number; /** * Sanskrit name of the karana. 7 movable karanas (Bava through Naga) repeat 8 times, plus 4 fixed karanas. */ name: string; /** * Karana type: Movable (repeating, generally auspicious) or Fixed (occur once per month). */ type?: string; /** * Activity suitability and characteristics of this karana for muhurta selection. */ characteristics?: string; }; /** * Current planetary hora. Used for electional astrology and muhurta selection. */ hora: { /** * Planet ruling the current hora (planetary hour). Each hora lasts ~1 hour. */ current: string; /** * Hora number within the day sequence (1-24). */ number: number; /** * Start time of the current hora, as local civil time in the requested timezone offset. The first hora of any day begins at local sunrise, so this equals the sunrise field when the hora number is 1. */ start: string; /** * End time of the current hora, as local civil time in the requested timezone offset. Day horas and night horas have different lengths, so a hora is only approximately 60 minutes. */ end: string; }; /** * Rahu Kaal, inauspicious period ruled by Rahu. Avoid starting new ventures. Calculated from sunrise duration divided into 8 parts. */ rahuKaal: { /** * Period start time in ISO 8601 format. Timezone-adjusted based on the input timezone offset. */ start: string; /** * Period end time in ISO 8601 format. Timezone-adjusted based on the input timezone offset. */ end: string; }; /** * Yamaganda, inauspicious period ruled by Yama (lord of death). Avoid important activities. */ yamaganda: { /** * Period start time in ISO 8601 format. Timezone-adjusted based on the input timezone offset. */ start: string; /** * Period end time in ISO 8601 format. Timezone-adjusted based on the input timezone offset. */ end: string; }; /** * Gulika Kaal, inauspicious period ruled by Saturn son Gulika. Considered harmful for initiating work. */ gulika: { /** * Period start time in ISO 8601 format. Timezone-adjusted based on the input timezone offset. */ start: string; /** * Period end time in ISO 8601 format. Timezone-adjusted based on the input timezone offset. */ end: string; }; /** * Abhijit Muhurta (Abhijit Muhurat), the most auspicious ~48-minute window around solar noon, the 8th of 15 day muhurtas. Ideal for starting new ventures, signing contracts, and performing rituals when no other shubh muhurat is available. Null on Wednesdays because Abhijit coincides with Dur Muhurta on that weekday per Muhurta Chintamani. */ abhijitMuhurta: { /** * Period start time in ISO 8601 format. Timezone-adjusted based on the input timezone offset. */ start: string; /** * Period end time in ISO 8601 format. Timezone-adjusted based on the input timezone offset. */ end: string; } | null; /** * Brahma Muhurta, sacred pre-dawn period approximately 96 minutes before sunrise (14th of 15 night muhurtas). Considered the best time for meditation, mantra japa, Vedic study, and spiritual sadhana. Referenced in Ashtanga Hridaya and Dharmashastra texts. */ brahmaMuhurta: { /** * Period start time in ISO 8601 format. Timezone-adjusted based on the input timezone offset. */ start: string; /** * Period end time in ISO 8601 format. Timezone-adjusted based on the input timezone offset. */ end: string; }; /** * Vijaya Muhurta (Vijay Muhurat), the 11th of 15 day muhurtas between sunrise and sunset. Auspicious for journeys, legal proceedings, competitions, warfare, and any activity requiring victory or success. Used in electional astrology (muhurta shastra) for timing important undertakings. */ vijayaMuhurta: { /** * Period start time in ISO 8601 format. Timezone-adjusted based on the input timezone offset. */ start: string; /** * Period end time in ISO 8601 format. Timezone-adjusted based on the input timezone offset. */ end: string; }; /** * Nishita Muhurta (Nishith Kaal), the 8th of 15 night muhurtas from sunset to next sunrise, occurring around midnight. Sacred period for worship of Lord Shiva, especially on Maha Shivaratri. Also significant for Janmashtami midnight celebrations and tantric sadhana. */ nishitaMuhurta: { /** * Period start time in ISO 8601 format. Timezone-adjusted based on the input timezone offset. */ start: string; /** * Period end time in ISO 8601 format. Timezone-adjusted based on the input timezone offset. */ end: string; }; /** * Godhuli Muhurta (cow dust time), 12 minutes before sunset to 12 minutes after sunset. Universally auspicious for any activity, especially marriages and grihapravesha. No blemish from tithi, vara, nakshatra, karana, or yoga applies during Godhuli. Null only in polar regions where sun does not set. */ godhuliMuhurta: { /** * Period start time in ISO 8601 format. Timezone-adjusted based on the input timezone offset. */ start: string; /** * Period end time in ISO 8601 format. Timezone-adjusted based on the input timezone offset. */ end: string; } | null; /** * Pratah Sandhya, morning twilight junction period for Sandhyavandanam prayer. Spans 3 night ghatis before sunrise to sunrise. Duration varies by location and season based on ratrimana (night duration). One of the three daily Sandhya prayer times prescribed in Dharmashastra. */ pratahSandhya: { /** * Period start time in ISO 8601 format. Timezone-adjusted based on the input timezone offset. */ start: string; /** * Period end time in ISO 8601 format. Timezone-adjusted based on the input timezone offset. */ end: string; } | null; /** * Sayahna Sandhya, evening twilight junction period for Sandhyavandanam prayer. Spans sunset to 3 night ghatis after sunset. Duration varies by location and season based on ratrimana (night duration). One of the three daily Sandhya prayer times prescribed in Dharmashastra. */ sayahnaSandhya: { /** * Period start time in ISO 8601 format. Timezone-adjusted based on the input timezone offset. */ start: string; /** * Period end time in ISO 8601 format. Timezone-adjusted based on the input timezone offset. */ end: string; } | null; /** * Dur Muhurta (Dur Muhurtam), inauspicious muhurta periods determined by the weekday. The daytime is divided into 15 muhurtas from sunrise to sunset. Specific muhurta numbers are inauspicious each weekday per Muhurta Chintamani. Each period lasts ~48 minutes. Most days have 2 Dur Muhurtas, Wednesday and Sunday have 1. Avoid initiating important activities during these periods. */ durMuhurta: Array<{ /** * Period start time in ISO 8601 format. Timezone-adjusted based on the input timezone offset. */ start: string; /** * Period end time in ISO 8601 format. Timezone-adjusted based on the input timezone offset. */ end: string; }>; /** * Varjyam (Thyajyam, Vishghati, Nakshatra Thyajyam), inauspicious ~96-minute period based on Moon transit through specific ghati fractions within the current nakshatra. Each of the 27 nakshatras has a fixed Varjyam window measured in ghatikas (1 ghati = 24 minutes). Avoid starting new ventures, travel, or auspicious ceremonies during Varjyam. Usually 1-2 periods per panchang day. */ varjyam: Array<{ /** * Period start time in ISO 8601 format. Timezone-adjusted based on the input timezone offset. */ start: string; /** * Period end time in ISO 8601 format. Timezone-adjusted based on the input timezone offset. */ end: string; }>; /** * Amrit Kalam (Amrit Ghati, Amrita Yoga), the most auspicious ~96-minute period based on Moon transit through specific ghati fractions within the current nakshatra. Each of the 27 nakshatras has a fixed Amrit window. Activities initiated during Amrit Kalam are believed to yield excellent, lasting results. Highly recommended for muhurta selection when other auspicious yogas are absent. Usually 1-2 periods per panchang day. */ amritKalam: Array<{ /** * Period start time in ISO 8601 format. Timezone-adjusted based on the input timezone offset. */ start: string; /** * Period end time in ISO 8601 format. Timezone-adjusted based on the input timezone offset. */ end: string; }>; /** * Chandrabalam (Moon strength). indicates auspiciousness of Moon transit for each birth rashi. Essential for muhurta selection in Vedic electional astrology. */ chandrabalam: { /** * Rashis (zodiac signs) for which Moon transit is favorable today. Chandrabalam is positive when Moon transits 1st, 3rd, 6th, 7th, 10th, or 11th house from birth rashi. */ favorableRashis: Array; /** * Rashi for which Moon is in Ashtama (8th house) position. highly inauspicious. Natives of this rashi should avoid important activities. */ ashtamaChandraRashi: string; }; /** * Tarabalam (Star strength). based on the 9-Tara nakshatra cycle. Determines favorability of Moon nakshatra transit relative to each of the 27 birth nakshatras. */ tarabalam: { /** * Birth nakshatras with favorable Tarabalam based on Moon nakshatra transit. Derived from the 9-Tara system. taras Sampat, Kshema, Sadhaka, Mitra, and Parama Mitra are favorable. */ favorableNakshatras: Array; /** * Birth nakshatras with unfavorable Tarabalam (Vipat, Pratyari, Vadha taras). Natives of these birth nakshatras should exercise caution. */ unfavorableNakshatras: Array; }; /** * Panchaka, the inauspicious ~5-day window while the Moon transits the last five nakshatras (Dhanishta 3rd pada through Revati, 300 to 360 degrees sidereal). The dosha type depends on the weekday it begins; startsAt and endsAt report the period in force at sunrise or beginning later this day. Avoid major activities during Panchaka. */ panchaka: { /** * True when Panchaka is in effect on this date, whether it is already running at sunrise or begins later in the day, in which case startsAt and endsAt give the window. False only when no Panchaka touches this date. */ active: boolean; /** * Panchaka dosha, set by the weekday the period BEGINS (not the nakshatra): Roga (Sunday, disease), Raja (Monday, government), Agni (Tuesday, fire), Chora (Friday, theft), Mrityu (Saturday, death). Null when Panchaka begins on Wednesday or Thursday (no dosha) or when no Panchaka touches this date. */ type: string | null; /** * When the Panchaka period starts (Moon enters 300 degrees, Dhanishta 3rd pada). May predate this date when Panchaka is already running. Null when no Panchaka is in force or begins on this date. In requested timezone. */ startsAt: string | null; /** * When the Panchaka period ends (Moon exits Revati at 360 degrees), about five days after it starts. Null when no Panchaka. In requested timezone. */ endsAt: string | null; }; /** * Bhadra (Vishti Karana), the 7th movable karana, avoided for all auspicious activities. Bhadra recurs roughly every 3 to 5 days and lasts about half a tithi. active is true whenever a Bhadra is attributed to this date; startsAt and endsAt give the window, which may end on the next calendar day. */ bhadra: { /** * True when a Bhadra (Vishti Karana) occurs on this date, in which case startsAt and endsAt give its window. False only when no Bhadra begins on this date. */ active: boolean; /** * When the Bhadra (Vishti) period that begins on this date starts. Null when no Bhadra begins on this date. In requested timezone. */ startsAt: string | null; /** * When the Bhadra (Vishti) period that begins on this date ends. May fall on the next calendar day. Null when no Bhadra begins on this date. In requested timezone. */ endsAt: string | null; }; /** * Panchang element transition times: when each element (tithi, yoga, karana, nakshatra, Moon sign) changes, found to the second. Essential for precise muhurta determination and panchang calendars. */ transitions: { /** * Tithi (lunar day) transition timing: when the current tithi ends and the next one begins. */ tithi: { /** * ISO 8601 UTC time when the current tithi ends. Precise to ~1 minute via binary search. */ endsAt: string; /** * Name of the next tithi that begins after the transition. */ next: string; }; /** * Nitya Yoga transition timing: when the current yoga period ends. Based on combined Sun-Moon motion. */ yoga: { /** * ISO 8601 UTC time when the current yoga ends. */ endsAt: string; /** * Name of the next yoga. */ next: string; }; /** * Karana (half-tithi) transition. karanas change twice per tithi. Important for muhurta timing. */ karana: { /** * ISO 8601 UTC time when the current karana ends. */ endsAt: string; /** * Name of the next karana (half-tithi). */ next: string; }; /** * Nakshatra (lunar mansion) transition timing: when Moon moves to the next nakshatra. Critical for muhurta and Tarabalam calculations. */ nakshatra: { /** * ISO 8601 UTC time when the Moon leaves the current nakshatra. */ endsAt: string; /** * Name of the next nakshatra the Moon will enter. */ next: string; /** * Pada (quarter, 1-4) of the next nakshatra. Each nakshatra has 4 padas spanning 3 degrees 20 minutes each. */ nextPada: number; }; /** * Moon sign (Chandra rashi) transition, when Moon changes zodiac sign. Affects Chandrabalam, Tarabalam, and daily horoscope predictions. */ moonSign: { /** * Current Moon rashi (zodiac sign). */ current: string; /** * ISO 8601 UTC time when Moon enters the next rashi. Moon changes sign approximately every 2.25 days. */ changesAt: string; /** * Next rashi the Moon will enter. */ next: string; }; }; }; }; export type GetDetailedPanchangResponse = GetDetailedPanchangResponses[keyof GetDetailedPanchangResponses]; export type GetChoghadiyaData = { body?: { /** * Date in YYYY-MM-DD format. A single-digit month or day is accepted and zero-padded (2026-3-5 becomes 2026-03-05). Impossible calendar dates are rejected. */ date: string; /** * Observer latitude in decimal degrees. Determines sunrise and sunset times which define day/night boundaries for muhurta calculations. */ latitude: number; /** * Observer longitude in decimal degrees. Affects local time calculations for sunrise, sunset, and muhurta period boundaries. */ longitude: number; /** * Timezone offset from UTC in decimal hours. Used for accurate sunrise/sunset calculation and output time formatting. Essential for correct Choghadiya periods outside IST. Defaults to 5.5 (IST). */ timezone?: number | string; }; path?: never; query?: never; url: '/vedic-astrology/panchang/choghadiya'; }; export type GetChoghadiyaErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetChoghadiyaError = GetChoghadiyaErrors[keyof GetChoghadiyaErrors]; export type GetChoghadiyaResponses = { /** * 8 daytime and 8 nighttime Choghadiya muhurta periods with names, ruling planets, auspiciousness ratings (Good/Bad), and exact start/end times based on sunrise and sunset. */ 200: { /** * Calendar date the choghadiya muhurta table was computed for, YYYY-MM-DD, echoed back from the request. The day periods run from that date sunrise to its sunset, and the night periods run on to the next sunrise. */ date: string; /** * 8 daytime choghadiya periods (sunrise to sunset) */ dayChoghadiya: Array<{ /** * Choghadiya muhurta name. Auspicious: Amrit (Moon), Shubh (Jupiter), Labh (Mercury), Char (Venus). Inauspicious: Udveg (Sun), Rog (Mars), Kaal (Saturn). */ name: 'Udveg' | 'Amrit' | 'Rog' | 'Labh' | 'Shubh' | 'Char' | 'Kaal'; /** * Ruling planet of this Choghadiya period. Planet determines the quality and suitability of activities during this muhurta. */ lord: string; /** * Auspiciousness of this period. Good periods (Amrit, Shubh, Labh, Char) are suitable for important activities. Bad periods (Udveg, Rog, Kaal) should be avoided. */ effect: 'Good' | 'Bad'; /** * Period start time in ISO 8601 format. Timezone-adjusted based on input timezone offset. */ start: string; /** * Period end time in ISO 8601 format. Each Choghadiya period is one-eighth of the day or night duration. */ end: string; }>; /** * 8 nighttime choghadiya periods (sunset to next sunrise) */ nightChoghadiya: Array<{ /** * Choghadiya muhurta name. Auspicious: Amrit (Moon), Shubh (Jupiter), Labh (Mercury), Char (Venus). Inauspicious: Udveg (Sun), Rog (Mars), Kaal (Saturn). */ name: 'Udveg' | 'Amrit' | 'Rog' | 'Labh' | 'Shubh' | 'Char' | 'Kaal'; /** * Ruling planet of this Choghadiya period. Planet determines the quality and suitability of activities during this muhurta. */ lord: string; /** * Auspiciousness of this period. Good periods (Amrit, Shubh, Labh, Char) are suitable for important activities. Bad periods (Udveg, Rog, Kaal) should be avoided. */ effect: 'Good' | 'Bad'; /** * Period start time in ISO 8601 format. Timezone-adjusted based on input timezone offset. */ start: string; /** * Period end time in ISO 8601 format. Each Choghadiya period is one-eighth of the day or night duration. */ end: string; }>; }; }; export type GetChoghadiyaResponse = GetChoghadiyaResponses[keyof GetChoghadiyaResponses]; export type GetHoraData = { body?: { /** * Date in YYYY-MM-DD format. A single-digit month or day is accepted and zero-padded (2026-3-5 becomes 2026-03-05). Impossible calendar dates are rejected. */ date: string; /** * Observer latitude in decimal degrees. Determines sunrise and sunset times which define day/night boundaries for muhurta calculations. */ latitude: number; /** * Observer longitude in decimal degrees. Affects local time calculations for sunrise, sunset, and muhurta period boundaries. */ longitude: number; /** * Timezone offset from UTC in decimal hours. Used for accurate sunrise/sunset calculation and output time formatting. Essential for correct Hora periods outside IST. Defaults to 5.5 (IST). */ timezone?: number | string; }; path?: never; query?: never; url: '/vedic-astrology/panchang/hora'; }; export type GetHoraErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetHoraError = GetHoraErrors[keyof GetHoraErrors]; export type GetHoraResponses = { /** * 12 daytime and 12 nighttime Hora (planetary hour) periods with ruling planet, sequence number, and exact start/end times based on sunrise and sunset. */ 200: { /** * Date for which hora periods were calculated. */ date: string; /** * 12 daytime hora periods from sunrise to sunset. Duration varies by season. */ dayHoras: Array<{ /** * Ruling planet of this hora period. Follows the Chaldean planetary order: Sun, Venus, Mercury, Moon, Saturn, Jupiter, Mars. */ planet: string; /** * Hora period number within the day or night segment (1-12). */ number: number; /** * Start time of the hora period in ISO 8601 format. */ start: string; /** * End time of the hora period in ISO 8601 format. */ end: string; }>; /** * 12 nighttime hora periods from sunset to next sunrise. Duration varies by season. */ nightHoras: Array<{ /** * Ruling planet of this hora period. Follows the Chaldean planetary order: Sun, Venus, Mercury, Moon, Saturn, Jupiter, Mars. */ planet: string; /** * Hora period number within the day or night segment (1-12). */ number: number; /** * Start time of the hora period in ISO 8601 format. */ start: string; /** * End time of the hora period in ISO 8601 format. */ end: string; }>; }; }; export type GetHoraResponse = GetHoraResponses[keyof GetHoraResponses]; export type CheckManglikDoshaData = { body?: ManglikRequest; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/vedic-astrology/dosha/manglik'; }; export type CheckManglikDoshaErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type CheckManglikDoshaError = CheckManglikDoshaErrors[keyof CheckManglikDoshaErrors]; export type CheckManglikDoshaResponses = { /** * Manglik dosha detection result with severity, Mars house placement, cancellation exceptions, traditional remedies, and effects on marriage and personality. */ 200: ManglikResponse; }; export type CheckManglikDoshaResponse = CheckManglikDoshaResponses[keyof CheckManglikDoshaResponses]; export type CheckKalsarpaDoshaData = { body?: KalsarpaRequest; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/vedic-astrology/dosha/kalsarpa'; }; export type CheckKalsarpaDoshaErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type CheckKalsarpaDoshaError = CheckKalsarpaDoshaErrors[keyof CheckKalsarpaDoshaErrors]; export type CheckKalsarpaDoshaResponses = { /** * Kalsarpa dosha detection result with type identification (1 of 12 types), severity, Rahu-Ketu axis details, traditional remedies, and effects on career, health, and relationships. */ 200: KalsarpaResponse; }; export type CheckKalsarpaDoshaResponse = CheckKalsarpaDoshaResponses[keyof CheckKalsarpaDoshaResponses]; export type CheckSadhesatiData = { body?: SadhesatiRequest; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/vedic-astrology/dosha/sadhesati'; }; export type CheckSadhesatiErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type CheckSadhesatiError = CheckSadhesatiErrors[keyof CheckSadhesatiErrors]; export type CheckSadhesatiResponses = { /** * Sade Sati detection result with current phase (Rising/Peak/Setting), Saturn transit position relative to natal Moon, severity, traditional Shani remedies, and phase-specific effects. */ 200: SadhesatiResponse; }; export type CheckSadhesatiResponse = CheckSadhesatiResponses[keyof CheckSadhesatiResponses]; export type ListYogasData = { body?: never; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; /** * Filter the catalog to one Nabhasa family: asraya (3), dala (2), akriti (20) or sankhya (7). Omit for the full catalog. `classical` is accepted but matches nothing here, because it is a detection-verdict value for single-combination yogas rather than a catalog grouping. */ family?: 'classical' | 'asraya' | 'dala' | 'akriti' | 'sankhya'; }; url: '/vedic-astrology/yoga'; }; export type ListYogasErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type ListYogasError = ListYogasErrors[keyof ListYogasErrors]; export type ListYogasResponses = { /** * List of all yogas (basic info) */ 200: { /** * Array of planetary yogas with basic identifiers, narrowed by `family` when that filter is supplied. Use GET /yoga/{id} for formation rules, effects, and quality classification. */ yogas: Array<{ /** * Unique yoga identifier in lowercase kebab-case. Use this to fetch full details via GET /yoga/{id}. */ id: string; /** * Traditional Sanskrit name of the planetary yoga combination. */ name: string; /** * Nabhasa family, present only on the 32 Nabhasa distribution yogas and absent on every other catalog row. Never translated, so it groups identically under any lang. */ family?: 'classical' | 'asraya' | 'dala' | 'akriti' | 'sankhya'; }>; /** * Number of yogas in this response, which is the filtered count when `family` is supplied and the full catalog size otherwise. Includes Raj Yogas, Dhan Yogas, Pancha Mahapurusha Yogas, Nabhasa Yogas, and more. */ total: number; }; }; export type ListYogasResponse = ListYogasResponses[keyof ListYogasResponses]; export type GetYogaData = { body?: never; path: { /** * Yoga identifier (lowercase, hyphenated) */ id: 'gajakesari' | 'sunapha' | 'anapha' | 'dhurdhura' | 'kemadruma' | 'chandramangala' | 'adhi' | 'chatussagara' | 'vasumathi' | 'rajalakshana' | 'vanchanachorabheethi' | 'sakata' | 'amala' | 'parvata' | 'kahala' | 'vesi' | 'vasi' | 'obhayachari' | 'hamsa' | 'malavya' | 'sasa' | 'ruchaka' | 'bhadra' | 'budhaaditya' | 'mahabhagya' | 'pushkala' | 'lakshmi' | 'gauri' | 'bharathi' | 'chapa' | 'sreenatha' | 'lagnamalika' | 'dhanamalika' | 'vikramamalika' | 'sukhamalika' | 'putramalika' | 'satrumalika' | 'kalatramalika' | 'randhramalika' | 'bhagyamalika' | 'karmamalika' | 'labhamalika' | 'vrayamalika' | 'sankha' | 'bheri' | 'mridanga' | 'parijatha' | 'gaja' | 'kalanidhi' | 'amsavatara' | 'hariharabrahma' | 'kusuma' | 'matsya' | 'kurma' | 'devendra' | 'makuta' | 'chandika' | 'jaya' | 'vidyut' | 'gandharva' | 'siva' | 'vishnu' | 'brahma' | 'indra' | 'ravi' | 'garuda' | 'go' | 'gola' | 'thrilochana' | 'kulavardhana' | 'yupa' | 'ishu' | 'sakti' | 'danda' | 'nav' | 'kuta' | 'chhatra' | 'chapa-2' | 'ardhachandra' | 'chandra' | 'gada' | 'sakata-2' | 'vihaga' | 'vajra' | 'yava' | 'sringhataka' | 'hala' | 'kamala' | 'vapee' | 'samudra' | 'vallaki' | 'damni' | 'pasa' | 'kedara' | 'sula' | 'yuga' | 'gola-2' | 'rajju' | 'musala' | 'nala' | 'srik' | 'mala' | 'sarpa' | 'duryoga' | 'daridra' | 'harsha' | 'sarala' | 'vimala' | 'sareerasoukhya' | 'dehapushti' | 'dehakashta' | 'rogagrastha' | 'krisanga' | 'krisanga-2' | 'dehasthoulya' | 'dehasthoulya-2' | 'dehasthoulya-3' | 'sadasanchara' | 'dhana' | 'dhana-2' | 'dhana-3' | 'dhana-4' | 'dhana-5' | 'dhana-6' | 'dhana-7' | 'dhana-8' | 'dhana-9' | 'dhana-10' | 'dhana-11' | 'bahudravyarjana' | 'swaveeryaddhana' | 'swaveeryaddhana-2' | 'swaveeryaddhana-3' | 'madhyavayasidhana' | 'anthyavayasidhana' | 'balyadhana' | 'bhratrumooladdhanaprapti' | 'bhratrumooladdhanaprapti-2' | 'matrumooladdhana' | 'putramooladdhana' | 'satrumooladdhana' | 'kalatramooladdhana' | 'amarananthadhana' | 'ayatnadhanalabha' | 'daridra-2' | 'daridra-3' | 'daridra-4' | 'daridra-5' | 'daridra-6' | 'daridra-7' | 'daridra-8' | 'daridra-9' | 'daridra-10' | 'daridra-11' | 'yukthisamanwithavagmi' | 'yukthisamanwithavagmi-2' | 'parihasaka' | 'asatyavadi' | 'jada' | 'bhaskara' | 'marud' | 'saraswathi' | 'budha' | 'mooka' | 'netranasa' | 'andha' | 'sumukha' | 'sumukha-2' | 'durmukha' | 'durmukha-2' | 'bhojanasoukhya' | 'annadana' | 'parannabhojana' | 'sraddhannabhuktha' | 'sarpaganda' | 'vakchalana' | 'vishaprayoga' | 'bhratruvriddhi' | 'sodaranasa' | 'ekabhagini' | 'dwadasasahodara' | 'sapthasankhyasahodara' | 'parakrama' | 'yuddhapraveena' | 'yuddhatpoorvadridhachitta' | 'yuddhatpaschaddrudha' | 'satkathadisravana' | 'uttamagriha' | 'vichitrasaudhaprakara' | 'ayatnagrihaprapta' | 'ayatnagrihaprapta-2' | 'grihanasa' | 'grihanasa-2' | 'bandhupujya' | 'bandhupujya-2' | 'bandhubhisthyaktha' | 'matrudeerghayur' | 'matrudeerghayur-2' | 'matrunasa' | 'matrunasa-2' | 'matrugami' | 'sahodareesangama' | 'kapata' | 'kapata-2' | 'kapata-3' | 'nishkapata' | 'nishkapata-2' | 'matrusatrutwa' | 'matrusneha' | 'vahana' | 'vahana-2' | 'anapathya' | 'sarpasapa' | 'sarpasapa-2' | 'sarpasapa-3' | 'sarpasapa-4' | 'pitrusapasutakshaya' | 'matrusapasutakshaya' | 'bhratrusapasutakshaya' | 'pretasapa' | 'bahuputra' | 'bahuputra-2' | 'dattaputra' | 'dattaputra-2' | 'aputra' | 'ekaputra' | 'suputra' | 'kalanirdesatputra' | 'kalanirdesatputra-2' | 'kalanirdesatputranasa' | 'kalanirdesatputranasa-2' | 'buddhimaturya' | 'theevrabuddhi' | 'buddhijada' | 'thrikalagnana' | 'putrasukha' | 'jara' | 'jarajaputra' | 'bahustree' | 'satkalatra' | 'bhagachumbana' | 'bhagya' | 'jananatpurvampitrumarana' | 'dhatrutwa' | 'apakeerti' | 'raja' | 'raja-2' | 'raja-3' | 'raja-4' | 'raja-5' | 'raja-6' | 'raja-7' | 'raja-8' | 'raja-9' | 'raja-10' | 'raja-11' | 'raja-12' | 'raja-13' | 'raja-14' | 'raja-15' | 'raja-16' | 'raja-17' | 'raja-18' | 'raja-19' | 'galakarna' | 'vrana' | 'sisnavyadhi' | 'kalatrashanda' | 'kushtaroga' | 'kushtaroga-2' | 'kshayaroga' | 'bandhana' | 'karascheda' | 'sirachcheda' | 'durmarana' | 'yuddhemarana' | 'sanghatakamarana' | 'sanghatakamarana-2' | 'peenasaroga' | 'pittaroga' | 'vikalangapatni' | 'putrakalatraheena' | 'bharyasahavyabhichara' | 'vamsacheda' | 'guhyaroga' | 'angaheena' | 'swetakushta' | 'pisachagrastha' | 'andha-2' | 'andha-3' | 'vatharoga' | 'matibhramana' | 'matibhramana-2' | 'matibhramana-3' | 'matibhramana-4' | 'khalwata' | 'nishturabhashi' | 'rajabhrashta' | 'raja-20' | 'raja-21' | 'gohanta'; }; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/vedic-astrology/yoga/{id}'; }; export type GetYogaErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetYogaError = GetYogaErrors[keyof GetYogaErrors]; export type GetYogaResponses = { /** * Detailed yoga information */ 200: YogaDetail; }; export type GetYogaResponse = GetYogaResponses[keyof GetYogaResponses]; export type DetectYogasData = { body?: YogaDetectRequest; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/vedic-astrology/yoga/detect'; }; export type DetectYogasErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type DetectYogasError = DetectYogasErrors[keyof DetectYogasErrors]; export type DetectYogasResponses = { /** * List of 48 classical yogas with present/absent verdicts and classical-text evidence. */ 200: YogaDetectResponse; }; export type DetectYogasResponse = DetectYogasResponses[keyof DetectYogasResponses]; export type GetKpAyanamsaData = { body?: never; path?: never; query?: { /** * Date for ayanamsa calculation in YYYY-MM-DD format. Defaults to today if not provided. Ayanamsa changes by ~0.01 degrees per month due to the precession of Earth. */ date?: string; /** * Time of day in 24-hour HH:MM:SS format, interpreted in the timezone below. Omit for midnight UTC. The ayanamsa moves about 0.14 arcseconds across a day, so supplying the time matters only when reconciling a chart against reference software to the arcsecond. */ time?: string; /** * IANA name (e.g. "Asia/Kolkata", "America/New_York"), decimal hours (e.g. 5.5 for IST, -5 for EST), or a fixed UTC offset (e.g. "+05:30"). IANA resolved to the offset in force at the given date and the time field above. Defaults to 0 (UTC). */ timezone?: string; }; url: '/vedic-astrology/kp/ayanamsa'; }; export type GetKpAyanamsaErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetKpAyanamsaError = GetKpAyanamsaErrors[keyof GetKpAyanamsaErrors]; export type GetKpAyanamsaResponses = { /** * Successfully calculated KP-Newcomb ayanamsa */ 200: KpAyanamsaResponse; }; export type GetKpAyanamsaResponse = GetKpAyanamsaResponses[keyof GetKpAyanamsaResponses]; export type GetKpPlanetsData = { body?: KpPlanetsRequest; path?: never; query?: never; url: '/vedic-astrology/kp/planets'; }; export type GetKpPlanetsErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetKpPlanetsError = GetKpPlanetsErrors[keyof GetKpPlanetsErrors]; export type GetKpPlanetsResponses = { /** * Successfully calculated KP planetary positions */ 200: KpPlanetsResponse; }; export type GetKpPlanetsResponse = GetKpPlanetsResponses[keyof GetKpPlanetsResponses]; export type GetKpCuspsData = { body?: KpCuspsRequest; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; /** * Which signification vocabulary the houseThemes map returns. "general" gives the classical bhava significations (self, wealth, siblings, home, and so on). "finance" gives the money reading of the same twelve bhavas, so house 2 returns income and savings, 5 speculation and risk appetite, 8 sudden money and leverage, 11 gains and profits, and 12 expenses and capital outflow. Use "finance" for wealth, income, business and market timing questions in Krishnamurti Paddhati, where the significator house groups 2, 6, 10, 11 for earned income and 5, 8, 11 for speculation are read against a running dasha. Defaults to "general". */ focus?: 'general' | 'finance'; }; url: '/vedic-astrology/kp/cusps'; }; export type GetKpCuspsErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetKpCuspsError = GetKpCuspsErrors[keyof GetKpCuspsErrors]; export type GetKpCuspsResponses = { /** * Successfully calculated Placidus house cusps */ 200: KpCuspsResponse; }; export type GetKpCuspsResponse = GetKpCuspsResponses[keyof GetKpCuspsResponses]; export type GenerateKpChartData = { body?: KpChartRequest; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; /** * Which signification vocabulary the houseThemes map returns. "general" gives the classical bhava significations (self, wealth, siblings, home, and so on). "finance" gives the money reading of the same twelve bhavas, so house 2 returns income and savings, 5 speculation and risk appetite, 8 sudden money and leverage, 11 gains and profits, and 12 expenses and capital outflow. Use "finance" for wealth, income, business and market timing questions in Krishnamurti Paddhati, where the significator house groups 2, 6, 10, 11 for earned income and 5, 8, 11 for speculation are read against a running dasha. Defaults to "general". */ focus?: 'general' | 'finance'; }; url: '/vedic-astrology/kp/chart'; }; export type GenerateKpChartErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GenerateKpChartError = GenerateKpChartErrors[keyof GenerateKpChartErrors]; export type GenerateKpChartResponses = { /** * Successfully generated KP birth chart */ 200: KpChartResponse; }; export type GenerateKpChartResponse = GenerateKpChartResponses[keyof GenerateKpChartResponses]; export type GetKpRulingPlanetsData = { body?: { /** * Observer latitude in decimal degrees */ latitude: number; /** * Observer longitude in decimal degrees */ longitude: number; /** * Timezone: IANA name (e.g. "America/New_York", "Europe/London") OR decimal hours from UTC. IANA resolved to the DST-correct offset based on birthDate or datetime. Defaults to 5.5. */ timezone?: number | string; /** * ISO 8601 datetime (YYYY-MM-DDTHH:MM:SS) for ruling planets. Defaults to current time. Interpreted as local time when a non-zero timezone is provided (a trailing Z is accepted but ignored); with timezone 0 it is UTC. */ datetime?: string; /** * Birth date (YYYY-MM-DD) to calculate significators. If provided with birthTime, response includes which houses each ruling planet signifies. */ birthDate?: string; /** * Birth time (HH:MM:SS) for significator calculation. Required if birthDate is provided. */ birthTime?: string; /** * Lunar node convention. "mean" is the smoothed average node, which always moves retrograde; "true" is the osculating node, which tracks the real perturbed node, oscillates up to about 1.5 degrees either side of the mean on a 173-day cycle, and can briefly turn direct. Neither is more correct and they almost always fall in the same sign. Applies to the Rahu and Ketu positions. Mean is the traditional Vedic default and what printed panchangs use; the choice can move a KP sub-lord in narrow boundary cases, where a span can be as small as 0.5 degrees. Defaults to "mean". */ nodeType?: 'mean' | 'true'; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; /** * Which signification vocabulary the houseThemes map returns. "general" gives the classical bhava significations (self, wealth, siblings, home, and so on). "finance" gives the money reading of the same twelve bhavas, so house 2 returns income and savings, 5 speculation and risk appetite, 8 sudden money and leverage, 11 gains and profits, and 12 expenses and capital outflow. Use "finance" for wealth, income, business and market timing questions in Krishnamurti Paddhati, where the significator house groups 2, 6, 10, 11 for earned income and 5, 8, 11 for speculation are read against a running dasha. Defaults to "general". */ focus?: 'general' | 'finance'; }; url: '/vedic-astrology/kp/ruling-planets'; }; export type GetKpRulingPlanetsErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetKpRulingPlanetsError = GetKpRulingPlanetsErrors[keyof GetKpRulingPlanetsErrors]; export type GetKpRulingPlanetsResponses = { /** * Ruling planets calculated successfully */ 200: KpRulingPlanetsResponse; }; export type GetKpRulingPlanetsResponse = GetKpRulingPlanetsResponses[keyof GetKpRulingPlanetsResponses]; export type GetKpRulingIntervalData = { body?: { /** * Start of the interval range in ISO 8601 (YYYY-MM-DDTHH:MM:SS). Interpreted as local time when a non-zero timezone is provided (a trailing Z is accepted but ignored); with timezone 0 it is UTC. */ startDatetime: string; /** * End of the interval range in ISO 8601 (YYYY-MM-DDTHH:MM:SS). Interpreted as local time when a non-zero timezone is provided (a trailing Z is accepted but ignored); with timezone 0 it is UTC. */ endDatetime: string; /** * Interval between calculations in minutes (1-1440). Use 1-5 for birth time rectification. */ intervalMinutes: number; /** * Observer latitude in decimal degrees */ latitude: number; /** * Observer longitude in decimal degrees */ longitude: number; /** * Timezone offset from UTC in decimal hours. When non-zero, all datetimes are treated as local time in this timezone (Z suffix is ignored). Output times are also converted to this timezone. Defaults to 5.5 (IST). */ timezone?: number | string; /** * Ayanamsa system for sidereal conversion. "kp-newcomb" uses the KP-Newcomb dynamic formula, the most common choice for KP astrology. "kp-old" uses the Krishnamurti original table from KP Reader-1 with constant precession rate. "lahiri" uses Lahiri/Chitrapaksha ayanamsa, matching most traditional Vedic software. "raman" uses the B.V. Raman ayanamsa from Hindu Predictive Astrology, a recognised traditional school that sits about 1.45 degrees below Lahiri. Defaults to "kp-newcomb". */ ayanamsa?: 'kp-newcomb' | 'kp-old' | 'lahiri' | 'raman'; /** * Lunar node convention. "mean" is the smoothed average node, which always moves retrograde; "true" is the osculating node, which tracks the real perturbed node, oscillates up to about 1.5 degrees either side of the mean on a 173-day cycle, and can briefly turn direct. Neither is more correct and they almost always fall in the same sign. Applies to the Rahu and Ketu positions. Mean is the traditional Vedic default and what printed panchangs use; the choice can move a KP sub-lord in narrow boundary cases, where a span can be as small as 0.5 degrees. Defaults to "mean". */ nodeType?: 'mean' | 'true'; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; /** * Which signification vocabulary the houseThemes map returns. "general" gives the classical bhava significations (self, wealth, siblings, home, and so on). "finance" gives the money reading of the same twelve bhavas, so house 2 returns income and savings, 5 speculation and risk appetite, 8 sudden money and leverage, 11 gains and profits, and 12 expenses and capital outflow. Use "finance" for wealth, income, business and market timing questions in Krishnamurti Paddhati, where the significator house groups 2, 6, 10, 11 for earned income and 5, 8, 11 for speculation are read against a running dasha. Defaults to "general". */ focus?: 'general' | 'finance'; }; url: '/vedic-astrology/kp/ruling-planets-interval'; }; export type GetKpRulingIntervalErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetKpRulingIntervalError = GetKpRulingIntervalErrors[keyof GetKpRulingIntervalErrors]; export type GetKpRulingIntervalResponses = { /** * Ruling planets with significators at intervals */ 200: KpRulingPlanetsIntervalResponse; }; export type GetKpRulingIntervalResponse = GetKpRulingIntervalResponses[keyof GetKpRulingIntervalResponses]; export type GetKpSublordChangesData = { body?: KpSublordChangesRequest; path?: never; query?: never; url: '/vedic-astrology/kp/sublord-changes'; }; export type GetKpSublordChangesErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetKpSublordChangesError = GetKpSublordChangesErrors[keyof GetKpSublordChangesErrors]; export type GetKpSublordChangesResponses = { /** * Sublord change timings calculated successfully */ 200: KpSublordChangesResponse; }; export type GetKpSublordChangesResponse = GetKpSublordChangesResponses[keyof GetKpSublordChangesResponses]; export type GetKpRasiChangesData = { body?: KpRasiChangesRequest; path?: never; query?: never; url: '/vedic-astrology/kp/rasi-changes'; }; export type GetKpRasiChangesErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetKpRasiChangesError = GetKpRasiChangesErrors[keyof GetKpRasiChangesErrors]; export type GetKpRasiChangesResponses = { /** * Sign ingress timings calculated successfully */ 200: KpRasiChangesResponse; }; export type GetKpRasiChangesResponse = GetKpRasiChangesResponses[keyof GetKpRasiChangesResponses]; export type GetKpPlanetsIntervalData = { body?: KpPlanetsIntervalRequest; path?: never; query?: never; url: '/vedic-astrology/kp/planets-interval'; }; export type GetKpPlanetsIntervalErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetKpPlanetsIntervalError = GetKpPlanetsIntervalErrors[keyof GetKpPlanetsIntervalErrors]; export type GetKpPlanetsIntervalResponses = { /** * Planetary positions calculated at all intervals */ 200: KpPlanetsIntervalResponse; }; export type GetKpPlanetsIntervalResponse = GetKpPlanetsIntervalResponses[keyof GetKpPlanetsIntervalResponses]; export type CastKpHoraryChartData = { body?: KpHoraryRequest; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; /** * Which signification vocabulary the houseThemes map returns. "general" gives the classical bhava significations (self, wealth, siblings, home, and so on). "finance" gives the money reading of the same twelve bhavas, so house 2 returns income and savings, 5 speculation and risk appetite, 8 sudden money and leverage, 11 gains and profits, and 12 expenses and capital outflow. Use "finance" for wealth, income, business and market timing questions in Krishnamurti Paddhati, where the significator house groups 2, 6, 10, 11 for earned income and 5, 8, 11 for speculation are read against a running dasha. Defaults to "general". */ focus?: 'general' | 'finance'; }; url: '/vedic-astrology/kp/horary'; }; export type CastKpHoraryChartErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type CastKpHoraryChartError = CastKpHoraryChartErrors[keyof CastKpHoraryChartErrors]; export type CastKpHoraryChartResponses = { /** * Horary chart with the Ascendant from the number, Placidus cusps, planets at the question moment, ruling planets, and four-level significators. */ 200: KpHoraryResponse; }; export type CastKpHoraryChartResponse = CastKpHoraryChartResponses[keyof CastKpHoraryChartResponses]; export type GetKpDailyFinanceData = { body?: KpDailyFinanceRequest; path?: never; query?: never; url: '/vedic-astrology/kp/daily-finance'; }; export type GetKpDailyFinanceErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetKpDailyFinanceError = GetKpDailyFinanceErrors[keyof GetKpDailyFinanceErrors]; export type GetKpDailyFinanceResponses = { /** * The four layers, the weighted score, the band and the day windows. */ 200: KpDailyFinanceResponse; }; export type GetKpDailyFinanceResponse = GetKpDailyFinanceResponses[keyof GetKpDailyFinanceResponses]; export type CalculateDrishtiData = { body?: { /** * Date in YYYY-MM-DD format. Planetary positions are calculated for this date to determine mutual aspects (drishti). */ date: string; /** * Time in HH:MM:SS format (24-hour). Exact time affects fast-moving planets (Moon, Mercury) and aspect orbs. */ time: string; /** * Observer latitude in decimal degrees. Used for Lagna calculation which affects house-based aspect analysis. */ latitude: number; /** * Observer longitude in decimal degrees. Affects local sidereal time for positional calculations. */ longitude: number; /** * Timezone offset from UTC in hours. Defaults to 5.5 (IST). */ timezone?: number | string; /** * Coordinate system for longitude output. "sidereal" (Nirayana) uses Lahiri ayanamsa, the standard for Vedic astrology. "tropical" (Sayana) uses raw ecliptic longitude matching Western astrology. Defaults to "sidereal". */ coordinateSystem?: 'sidereal' | 'tropical'; }; path?: never; query?: never; url: '/vedic-astrology/aspects'; }; export type CalculateDrishtiErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type CalculateDrishtiError = CalculateDrishtiErrors[keyof CalculateDrishtiErrors]; export type CalculateDrishtiResponses = { /** * Aspects calculated successfully */ 200: { /** * Chart time the aspects were calculated for, echoed back as the local wall clock of the request (ISO 8601, no offset). This is the `date` and `time` you sent, NOT a UTC instant: hold them fixed and vary `timezone` and every longitude moves while this field does not. Combine it with the `timezone` you sent to recover the absolute moment. */ datetime: string; /** * Sidereal positions of all 9 planets at the given time. */ planets: Array<{ /** * Planet name (Sun through Ketu, all 9 Vedic grahas). */ name: string; /** * Sidereal longitude in degrees (0-360). */ longitude: number; /** * Vedic zodiac sign (rashi) the planet occupies. */ sign: string; }>; /** * Complete list of all Vedic aspects (drishti) between planets. Includes full (7th) and special aspects (Mars 4th/8th, Jupiter 5th/9th, Saturn 3rd/10th). */ aspects: Array<{ /** * Planet casting the aspect (graha drishti). */ aspectingPlanet: string; /** * Planet receiving the aspect. */ aspectedPlanet: string; /** * Vedic aspect type. All planets have 7th aspect. Special aspects: Mars 4th/8th, Jupiter 5th/9th, Saturn 3rd/10th. */ aspectType: 'conjunction' | '7th' | '4th' | '8th' | '5th' | '9th' | '3rd' | '10th'; /** * Aspect strength percentage (0-100). 100 = exact aspect, decreases with orb distance. */ strength: number; /** * Angular distance from exact aspect in degrees. Smaller orb = more potent aspect. */ orb: number; }>; /** * Aspect table grouped by aspecting planet. useful for rendering aspect grids in astrology software. */ aspectTable: Array<{ /** * Planet casting aspects. */ planet: string; /** * All aspects cast by this planet. */ aspects: Array<{ /** * Planet being aspected. */ planet: string; /** * Vedic aspect house (7th, 4th, 8th, 5th, 9th, 3rd, 10th, or conjunction). */ aspectType: string; /** * Aspect strength percentage. */ strength: number; }>; }>; /** * Pairs of planets aspecting each other simultaneously. Mutual aspects amplify planetary influence significantly. */ mutualAspects: Array<{ /** * First planet in the mutual aspect pair. */ planet1: string; /** * Second planet in the mutual aspect pair. */ planet2: string; /** * The aspect type shared mutually. Mutual aspects are especially strong in Vedic astrology. */ aspectType: string; }>; }; }; export type CalculateDrishtiResponse = CalculateDrishtiResponses[keyof CalculateDrishtiResponses]; export type GetMonthlyAspectsData = { body?: { /** * Year for monthly analysis (1900-2100). Defaults to the current year (UTC). */ year?: number; /** * Month number (1-12). Defaults to the current month (UTC). */ month?: number; /** * Timezone offset from UTC in hours. Output times are converted to this timezone. Defaults to 0 (UTC). */ timezone?: number | string; /** * Coordinate system for longitude output. "sidereal" (Nirayana) uses Lahiri ayanamsa, the standard for Vedic astrology. "tropical" (Sayana) uses raw ecliptic longitude matching Western astrology. Defaults to "sidereal". */ coordinateSystem?: 'sidereal' | 'tropical'; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/vedic-astrology/aspects/monthly'; }; export type GetMonthlyAspectsErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetMonthlyAspectsError = GetMonthlyAspectsErrors[keyof GetMonthlyAspectsErrors]; export type GetMonthlyAspectsResponses = { /** * Monthly planetary aspect events */ 200: { /** * Year of the aspect analysis. Echoes the year that was requested, or the current UTC year when it was omitted. */ year: number; /** * Month of the aspect analysis. Echoes the month that was requested, or the current UTC month when it was omitted. */ month: number; /** * Timezone offset from UTC in hours that the event dates and times are reported in. Echoes the requested timezone. */ timezone: number; /** * All planetary aspect events detected during the month, sorted chronologically by closest approach date. */ events: Array<{ /** * First planet forming the aspect. One of the Navagraha, Sun through Ketu. Always English, whatever the lang parameter says, so it stays safe to compare against in code. Use planet1Localized for anything a reader sees. */ planet1: string; /** * First planet name in the requested language, for display. Present only when lang is set to a language other than English, since in English it would repeat planet1 exactly. */ planet1Localized?: string; /** * Second planet forming the aspect. Always English, whatever the lang parameter says. Use planet2Localized for anything a reader sees. */ planet2: string; /** * Second planet name in the requested language, for display. Present only when lang is set to a language other than English. */ planet2Localized?: string; /** * Aspect type. major: conjunction (0 deg), opposition (180 deg), trine (120 deg), square (90 deg), sextile (60 deg). Minor: vigintile (18 deg), semi-sextile (30 deg), undecile (32.73 deg), semi-quintile (36 deg), novile (40 deg), semi-square (45 deg), septile (51.43 deg), quintile (72 deg), binovile (80 deg), centile (100 deg), biseptile (102.86 deg), tredecile (108 deg), sesqui-square (135 deg), bi-quintile (144 deg), quincunx (150 deg), triseptile (154.29 deg), quadranovile (160 deg). */ aspect: string; /** * Date when the aspect is closest to exact (YYYY-MM-DD). Adjusted to requested timezone. */ date: string; /** * Time when the aspect is closest to exact (HH:MM, 24-hour). Adjusted to requested timezone. */ time: string; /** * Full datetime when aspect is closest to exact. Adjusted to requested timezone. */ datetime: string; /** * Angular distance from exact aspect in degrees at closest approach. Smaller orb indicates a more powerful aspect. */ orb: number; /** * Actual angular distance between the two planets in degrees at closest approach. */ distance: number; /** * Sidereal longitude of the first planet at time of aspect (Lahiri ayanamsa). */ planet1Longitude: number; /** * Sidereal longitude of the second planet at time of aspect. */ planet2Longitude: number; }>; }; }; export type GetMonthlyAspectsResponse = GetMonthlyAspectsResponses[keyof GetMonthlyAspectsResponses]; export type GetLunarAspectsData = { body?: { /** * Year for monthly analysis (1900-2100). Defaults to the current year (UTC). */ year?: number; /** * Month number (1-12). Defaults to the current month (UTC). */ month?: number; /** * Timezone offset from UTC in hours. Output times are converted to this timezone. Defaults to 0 (UTC). */ timezone?: number | string; /** * Coordinate system for longitude output. "sidereal" (Nirayana) uses Lahiri ayanamsa, the standard for Vedic astrology. "tropical" (Sayana) uses raw ecliptic longitude matching Western astrology. Defaults to "sidereal". */ coordinateSystem?: 'sidereal' | 'tropical'; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/vedic-astrology/aspects/lunar'; }; export type GetLunarAspectsErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetLunarAspectsError = GetLunarAspectsErrors[keyof GetLunarAspectsErrors]; export type GetLunarAspectsResponses = { /** * Monthly lunar aspect events */ 200: { /** * Year of the lunar aspect analysis. Echoes the year that was requested, or the current UTC year when it was omitted. */ year: number; /** * Month of the lunar aspect analysis. Echoes the month that was requested, or the current UTC month when it was omitted. */ month: number; /** * Timezone offset from UTC in hours that the event dates and times are reported in. Echoes the requested timezone. */ timezone: number; /** * All Moon aspect events during the month, sorted chronologically. Moon completes one full cycle in approximately 27 days. */ events: Array<{ /** * Planet that the Moon forms an aspect with. Always English, whatever the lang parameter says, so it stays safe to compare against in code. Use planetLocalized for anything a reader sees. */ planet: string; /** * Planet name in the requested language, for display. Present only when lang is set to a language other than English, since in English it would repeat planet exactly. */ planetLocalized?: string; /** * Aspect type. major: conjunction, opposition, trine, square, sextile. Minor: vigintile, semi-sextile, undecile, semi-quintile, novile, semi-square, septile, quintile, binovile, centile, biseptile, tredecile, sesqui-square, bi-quintile, quincunx, triseptile, quadranovile. */ aspect: string; /** * Date of closest approach for this lunar aspect (YYYY-MM-DD). Adjusted to requested timezone. */ date: string; /** * Time of closest approach for this lunar aspect (HH:MM, 24-hour). Adjusted to requested timezone. */ time: string; /** * Full datetime of closest approach. Adjusted to requested timezone. */ datetime: string; /** * Angular distance from exact lunar aspect in degrees. Smaller orb = stronger Moon influence. */ orb: number; /** * Actual angular distance between Moon and the aspected planet in degrees. */ distance: number; /** * Sidereal longitude of the Moon at the time of aspect (Lahiri ayanamsa). */ moonLongitude: number; /** * Sidereal longitude of the aspected planet at the time of aspect. */ planetLongitude: number; }>; }; }; export type GetLunarAspectsResponse = GetLunarAspectsResponses[keyof GetLunarAspectsResponses]; export type CalculateTransitData = { body?: { /** * Birth date in YYYY-MM-DD format. Used to calculate the natal chart against which transits are analyzed. */ birthDate: string; /** * Birth time in HH:MM:SS format (24-hour). Critical for accurate natal Lagna and Placidus house cusps which determine transit house placements. */ birthTime: string; /** * Transit date to analyze in YYYY-MM-DD format. Planetary positions on this date are overlaid on the natal chart. */ transitDate: string; /** * Transit time in HH:MM:SS format (24-hour). Affects fast-moving planets like Moon. Defaults to noon. */ transitTime?: string; /** * Observer latitude in decimal degrees. Determines Placidus house cusps for natal chart house assignments. */ latitude: number; /** * Observer longitude in decimal degrees. Affects local sidereal time for Lagna and house calculations. */ longitude: number; /** * Timezone offset from UTC in hours. Defaults to 5.5 (IST). */ timezone?: number | string; /** * Coordinate system for longitude output. "sidereal" (Nirayana) uses Lahiri ayanamsa, the standard for Vedic astrology. "tropical" (Sayana) uses raw ecliptic longitude matching Western astrology. Defaults to "sidereal". */ coordinateSystem?: 'sidereal' | 'tropical'; }; path?: never; query?: never; url: '/vedic-astrology/transit'; }; export type CalculateTransitErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type CalculateTransitError = CalculateTransitErrors[keyof CalculateTransitErrors]; export type CalculateTransitResponses = { /** * Transit analysis calculated successfully */ 200: { /** * The zodiac frame every longitude in this response was computed in, so a cached or forwarded payload is self describing. Sidereal requests report the Lahiri ayanamsa, read at the birth instant; the transit positions use the same named frame resolved at their own instant, which moves by about 50 arcseconds a year. A tropical request reports "tropical" with 0 degrees subtracted, which is the one case a Vedic table can otherwise be rendered in the wrong zodiac with nothing on screen saying so. */ frame: { /** * Sidereal frame this chart was cast in, echoing the ayanamsa request field. "lahiri" when the field was omitted. */ ayanamsa: string; /** * Degrees actually subtracted from every tropical longitude to produce this chart, read at the birth instant. Subtract it back to recover the tropical positions, or compare it against your reference software to confirm you are in the same frame before chasing a placement difference. */ ayanamsaDegrees: number; }; /** * Birth datetime used for the natal chart, echoed as the local civil date and time supplied in the request (YYYY-MM-DDTHH:MM:SS). Combine it with the timezone field to recover the UTC instant. */ birthDatetime: string; /** * Transit datetime being analyzed, echoed as the local civil date and time supplied in the request (YYYY-MM-DDTHH:MM:SS). Gochar positions are computed for this moment and overlaid on the natal chart. */ transitDatetime: string; /** * All 9 planetary positions from the natal (birth) chart. */ natalPlanets: Array<{ /** * Graha name, Sun through Ketu. The Lagna is not one of these entries; it is a house frame rather than a body, and the natal house numbers on every entry are counted from it. */ name: string; /** * Sidereal longitude in degrees (0-360) using Lahiri ayanamsa. */ longitude: number; /** * Vedic zodiac sign (rashi) the planet occupies in the birth chart. */ sign: string; /** * Bhava (house) number 1-12, counted whole-sign from the Lagna (house 1 is the Lagna rashi). */ house: number; }>; /** * Current planetary positions overlaid on the natal chart with house placements, aspects, and the Gochara Kaksha verdict for each graha. */ transitingPlanets: Array<{ /** * Transiting planet name. */ name: string; /** * Current sidereal longitude of the transiting planet. */ longitude: number; /** * Current zodiac sign of the transiting planet. */ sign: string; /** * Which natal house (whole-sign bhava counted from the Lagna) this graha is currently transiting through. This is the Lagna reading of the transit, which is what a transit chart drawn over the birth chart shows. For the house classical Gochara is judged from, read houseFromMoon instead. */ natalHouse: number; /** * Which house this graha is transiting counted from the natal Moon sign (Janma Rashi), 1-12 whole-sign and counted inclusively, so the Moon sign itself is 1. This is the number classical Gochara is reckoned in: Phaladeepika chapter 26 opens by saying that of all the Lagnas only the Moon Lagna matters for transit results, and the Vedha and Ashtakavarga transit rules are counted from the Moon throughout. The reference sign is the sign of the Moon entry in natalPlanets, so a client can label the column without a second request. */ houseFromMoon: number; /** * Degree-based angular aspects between this transiting graha and the natal grahas. Western vocabulary, kept for callers who read a chart that way; drishtiToNatal is the Vedic answer to the same question. */ aspectsToNatal: Array<{ /** * Natal planet being aspected by this transiting planet. */ natalPlanet: string; /** * Degree-based angular aspect between the two longitudes: conjunction, opposition, trine, square, or sextile. This is the Western aspect vocabulary and it is offered for charts read that way. Parashari jyotish has no sextile, square or trine, so for the Vedic reading use drishtiToNatal, which reports graha drishti by house count. */ aspectType: string; /** * Angular distance from exact aspect in degrees. Smaller orb = stronger influence. */ orb: number; }>; /** * Graha drishti cast by this transiting graha onto the natal grahas, the Vedic reading of transit-to-natal aspects. Rahu and Ketu cast none. Empty when this graha reaches no occupied natal sign. */ drishtiToNatal: Array<{ /** * Natal graha receiving the drishti from this transiting graha. */ natalPlanet: string; /** * Which house the drishti falls on, counted whole-sign and inclusively from the transiting graha. Every graha aspects the 7th; Mars adds the 4th and 8th, Jupiter the 5th and 9th, Saturn the 3rd and 10th. Same vocabulary the /aspects endpoint returns, so the two can be compared directly. */ aspectType: 'conjunction' | '7th' | '4th' | '8th' | '5th' | '9th' | '3rd' | '10th'; /** * Drishti strength as a percentage. Full and special aspects are 100; the partial quarter, half and three-quarter sights are not reported. */ strength: number; /** * Gap between the two degrees-in-sign, in degrees. Graha drishti is whole-sign and does not depend on this, so read it as how exact the sight is inside the pair of rashis rather than as a condition for the aspect. */ orb: number; }>; /** * Gochara Kaksha: the ashtakavarga-qualified reading of this transit. The sign says where a graha is, this says whether the exact stretch it currently occupies is one its own Bhinnashtakavarga supports, which is the classical way of refining a transit verdict from sign-level to under four degrees. */ kaksha: { /** * Kaksha number 1-8 within the current sign. Each sign divides into eight kakshas of 3 degrees 45 minutes, crossed in order, so this is how far through the sign the graha has travelled. */ number: number; /** * Graha ruling this kaksha. The eight lords run Saturn, Jupiter, Mars, Sun, Venus, Mercury, Moon, Lagna from the start of every sign, ordered by how long each takes to cross a sign. */ lord: string; /** * Degree within the sign where this kaksha begins (0, 3.75, 7.5 and so on). */ startDegree: number; /** * Degree within the sign where this kaksha ends. */ endDegree: number; /** * Whether this kaksha lord gave the transiting graha a bindu in the sign being transited, which is the Gochara Kaksha verdict: true reads as a favourable stretch of the transit, false as an unfavourable one. Null means the question does not apply rather than that the answer is no, because Rahu and Ketu have no Bhinnashtakavarga to read. Never render null as unfavourable. */ bindu: boolean | null; /** * Bindus the transiting graha holds in this whole sign, 0-8, or null for Rahu and Ketu. Context for the verdict, since the same kaksha reads differently in a sign worth 7 than in one worth 1. */ binduCount: number | null; }; }>; /** * Highlighted transits from slow-moving planets (Jupiter, Saturn, Rahu, Ketu), most impactful for Gochar analysis. */ keyTransits: Array<{ /** * Slow-moving planet (Jupiter, Saturn, Rahu, Ketu) forming a significant transit. */ planet: string; /** * Human-readable transit summary, naming the rashi being transited and both house readings: from the Lagna, then from the natal Moon. */ description: string; /** * Natal house being transited by this slow graha, counted whole-sign from the Lagna. Mirrors natalHouse on the matching transitingPlanets entry. */ natalHouse: number; /** * House being transited by this slow graha counted from the natal Moon sign (Janma Rashi), the classical Gochara reference. Mirrors houseFromMoon on the matching transitingPlanets entry. */ houseFromMoon: number; /** * Notable degree-based angular aspects to natal planets from this slow-moving transiting planet, in Western vocabulary. */ aspects: Array; /** * Graha drishti this slow-moving transiting graha casts on the natal grahas, the Vedic reading. Empty for Rahu and Ketu, which cast none. */ drishti: Array; }>; }; }; export type CalculateTransitResponse = CalculateTransitResponses[keyof CalculateTransitResponses]; export type GetMonthlyTransitsData = { body?: { /** * Year for monthly transit analysis (1900-2100). Defaults to the current year (UTC). */ year?: number; /** * Month number (1-12) for transit analysis. Defaults to the current month (UTC). */ month?: number; /** * Timezone offset from UTC in hours. Output times are converted to this timezone. Defaults to 0 (UTC). */ timezone?: number | string; /** * Coordinate system for longitude output. "sidereal" (Nirayana) uses Lahiri ayanamsa, the standard for Vedic astrology. "tropical" (Sayana) uses raw ecliptic longitude matching Western astrology. Defaults to "sidereal". */ coordinateSystem?: 'sidereal' | 'tropical'; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/vedic-astrology/transit/monthly'; }; export type GetMonthlyTransitsErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetMonthlyTransitsError = GetMonthlyTransitsErrors[keyof GetMonthlyTransitsErrors]; export type GetMonthlyTransitsResponses = { /** * Monthly transit data calculated successfully */ 200: { /** * Year of the monthly transit analysis. Echoes the year that was requested, or the current UTC year when it was omitted. */ year: number; /** * Month of the monthly transit analysis. Echoes the month that was requested, or the current UTC month when it was omitted. */ month: number; /** * Timezone offset from UTC in hours that the event dates and times are reported in. Echoes the requested timezone. */ timezone: number; /** * Planetary positions at the beginning of the month (day 1, 00:00 UTC). */ startingPositions: Array<{ /** * Planet (graha) name. One of the 9 Navagraha used in Vedic transit (Gochar) analysis. Always English, whatever the lang parameter says, so it stays safe to compare against in code. Use planetLocalized for anything a reader sees. */ planet: string; /** * Planet name in the requested language, for display. Present only when lang is set to a language other than English. */ planetLocalized?: string; /** * Zodiac sign (rashi) the planet occupies at the start of the month. Always English. Use signLocalized for anything a reader sees. */ sign: string; /** * Zodiac sign name in the requested language, for display. Present only when lang is set to a language other than English. */ signLocalized?: string; /** * Sidereal longitude at the start of the month. */ longitude: number; }>; /** * All sign change events during the month, sorted chronologically. Moon changes sign roughly every 2.25 days, Sun once a month, slow planets less frequently. */ transitEvents: Array<{ /** * Planet that changes sign (rashi) during this month. One of the Navagraha: Sun, Moon, Mars, Mercury, Jupiter, Venus, Saturn, Rahu, Ketu. Always English, whatever the lang parameter says, so it stays safe to compare against in code. Use planetLocalized for anything a reader sees. */ planet: string; /** * Planet name in the requested language, for display. Present only when lang is set to a language other than English, since in English it would repeat planet exactly. */ planetLocalized?: string; /** * Zodiac sign the planet is leaving (previous rashi). Always English. Use fromSignLocalized for anything a reader sees. */ fromSign: string; /** * Name of the sign being left, in the requested language, for display. Present only when lang is set to a language other than English. */ fromSignLocalized?: string; /** * Zodiac sign the planet is entering (new rashi transit). Always English. Use toSignLocalized for anything a reader sees. */ toSign: string; /** * Name of the sign being entered, in the requested language, for display. Present only when lang is set to a language other than English. */ toSignLocalized?: string; /** * Date of the sign change (YYYY-MM-DD). Adjusted to requested timezone. */ date: string; /** * Time of the sign change (HH:MM, 24-hour). Adjusted to requested timezone. Precise to ~1 minute via binary search. */ time: string; /** * Full datetime of the sign change. Adjusted to requested timezone. */ datetime: string; /** * Whether the planet is in retrograde motion (vakri) at the time of sign change. A retrograde ingress means the planet is moving backward into the previous sign, which carries different astrological significance than a direct (forward) ingress. Rahu and Ketu are always retrograde. */ isRetrograde: boolean; }>; }; }; export type GetMonthlyTransitsResponse = GetMonthlyTransitsResponses[keyof GetMonthlyTransitsResponses]; export type CalculateParallelsData = { body?: { /** * Date in YYYY-MM-DD format. Planetary declinations are calculated for this date to find parallel and contraparallel aspects. */ date: string; /** * Time in HH:MM:SS format (24-hour). Exact time affects declination values, especially for the fast-moving Moon. */ time: string; /** * Observer latitude in decimal degrees. Used for topocentric declination corrections. */ latitude: number; /** * Observer longitude in decimal degrees. Affects local time context for declination calculations. */ longitude: number; /** * Timezone offset from UTC in hours. Defaults to 5.5 (IST). */ timezone?: number | string; /** * Orb in degrees for parallel/contraparallel detection. Defaults to 1.5°. */ orb?: number; }; path?: never; query?: never; url: '/vedic-astrology/parallels'; }; export type CalculateParallelsErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type CalculateParallelsError = CalculateParallelsErrors[keyof CalculateParallelsErrors]; export type CalculateParallelsResponses = { /** * Declination parallels calculated successfully */ 200: { /** * Datetime used for the declination calculation, echoed as the local civil date and time supplied in the request (YYYY-MM-DDTHH:MM:SS). The timezone field of the request is what converts it to the instant the declinations are computed for. */ datetime: string; /** * Declination and right ascension for each planet at the given moment. */ planets: Array<{ /** * Planet name (Sun through Saturn, the 7 visible planets). */ name: string; /** * Celestial declination in degrees. Positive = north of celestial equator, negative = south. */ declination: number; /** * Right ascension in degrees (0-360) along the celestial equator. */ rightAscension: number; }>; /** * All parallel and contraparallel aspects found within the specified orb. Parallels are powerful hidden aspects often overlooked in standard chart analysis. */ parallels: Array<{ /** * First planet in the parallel/contraparallel pair. */ planet1: string; /** * Second planet in the pair. */ planet2: string; /** * Parallel = same declination (acts like conjunction). Contraparallel = opposite declination (acts like opposition). */ type: 'parallel' | 'contraparallel'; /** * Angular difference from exact parallel/contraparallel in degrees. Smaller = stronger. */ orb: number; /** * Declination of the first planet in degrees. */ dec1: number; /** * Declination of the second planet in degrees. */ dec2: number; }>; }; }; export type CalculateParallelsResponse = CalculateParallelsResponses[keyof CalculateParallelsResponses]; export type GetMonthlyParallelsData = { body?: { /** * Year for monthly parallel analysis (1900-2100). Defaults to the current year (UTC). */ year?: number; /** * Month number (1-12) for parallel analysis. Defaults to the current month (UTC). */ month?: number; /** * Timezone offset from UTC in hours. Output times are converted to this timezone. Defaults to 0 (UTC). */ timezone?: number | string; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/vedic-astrology/parallels/monthly'; }; export type GetMonthlyParallelsErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetMonthlyParallelsError = GetMonthlyParallelsErrors[keyof GetMonthlyParallelsErrors]; export type GetMonthlyParallelsResponses = { /** * Monthly parallel events */ 200: { /** * Year of the parallel analysis. Echoes the year that was requested, or the current UTC year when it was omitted. */ year: number; /** * Month of the parallel analysis. Echoes the month that was requested, or the current UTC month when it was omitted. */ month: number; /** * All parallel and contraparallel events detected during the month, sorted chronologically. */ events: Array<{ /** * First planet in the parallel or contraparallel pair. Always English, whatever the lang parameter says, so it stays safe to compare against in code. Use planet1Localized for anything a reader sees. */ planet1: string; /** * First planet name in the requested language, for display. Present only when lang is set to a language other than English, since in English it would repeat planet1 exactly. */ planet1Localized?: string; /** * Second planet in the pair. Always English, whatever the lang parameter says. Use planet2Localized for anything a reader sees. */ planet2: string; /** * Second planet name in the requested language, for display. Present only when lang is set to a language other than English. */ planet2Localized?: string; /** * Parallel = same declination (acts like conjunction in strength). Contraparallel = opposite declination (acts like opposition). */ type: 'parallel' | 'contraparallel'; /** * Date of closest declination match (YYYY-MM-DD). Adjusted to requested timezone. */ date: string; /** * Time of closest declination match (HH:MM, 24-hour). Adjusted to requested timezone. */ time: string; /** * Full datetime of closest declination match. Adjusted to requested timezone. */ datetime: string; /** * Declination difference from exact parallel/contraparallel in degrees. Smaller = stronger. */ orb: number; /** * Declination of the first planet in degrees. */ dec1: number; /** * Declination of the second planet in degrees. */ dec2: number; }>; }; }; export type GetMonthlyParallelsResponse = GetMonthlyParallelsResponses[keyof GetMonthlyParallelsResponses]; export type GetEclipticCrossingsData = { body?: { /** * Year to scan for ecliptic crossings (1900-2100). */ year: number; /** * Timezone offset from UTC in hours. Output times are converted to this timezone. Defaults to 0 (UTC). */ timezone?: number | string; /** * Coordinate system for longitude output. "sidereal" (Nirayana) uses Lahiri ayanamsa, the standard for Vedic astrology. "tropical" (Sayana) uses raw ecliptic longitude matching Western astrology. Defaults to "sidereal". */ coordinateSystem?: 'sidereal' | 'tropical'; }; path?: never; query?: never; url: '/vedic-astrology/ecliptic-crossings'; }; export type GetEclipticCrossingsErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetEclipticCrossingsError = GetEclipticCrossingsErrors[keyof GetEclipticCrossingsErrors]; export type GetEclipticCrossingsResponses = { /** * Ecliptic crossing events for the year */ 200: { /** * Year scanned for ecliptic crossings. */ year: number; /** * Timezone offset from UTC in hours that the event dates and times are reported in. Echoes the requested timezone. */ timezone: number; /** * All ecliptic crossing events for visible planets during the year, sorted chronologically. */ events: Array<{ /** * Planet crossing the ecliptic plane. Sun is excluded (always on the ecliptic by definition). */ planet: string; /** * Date of the ecliptic crossing (YYYY-MM-DD). Adjusted to requested timezone. */ date: string; /** * Time of the ecliptic crossing (HH:MM, 24-hour). Adjusted to requested timezone. */ time: string; /** * Full datetime of the ecliptic crossing. Adjusted to requested timezone. */ datetime: string; /** * Ascending = planet moves from south to north of the ecliptic. Descending = north to south. */ direction: 'ascending' | 'descending'; /** * Longitude of the planet at the moment of crossing, in the requested coordinateSystem: sidereal (Lahiri ayanamsa) by default, tropical when asked. */ longitude: number; /** * Zodiac sign the planet occupies at the crossing, read in the same coordinateSystem as longitude: the rashi under sidereal, the tropical sign under tropical. */ sign: string; }>; }; }; export type GetEclipticCrossingsResponse = GetEclipticCrossingsResponses[keyof GetEclipticCrossingsResponses]; export type ListRashisData = { body?: never; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/vedic-astrology/rashis'; }; export type ListRashisErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type ListRashisError = ListRashisErrors[keyof ListRashisErrors]; export type ListRashisResponses = { /** * Array of all 12 Vedic rashis (Mesha through Meen) with Sanskrit names, Western equivalents, sidereal date ranges, symbols, governing Adityas, and personality characteristics. */ 200: RashiListResponse; }; export type ListRashisResponse = ListRashisResponses[keyof ListRashisResponses]; export type GetRashiData = { body?: never; path: { /** * Rashi ID slug. One of: mesha, vrishabha, mithun, karka, simha, kanya, tula, vrischika, dhanu, makar, kumbha, meen. */ id: 'mesha' | 'vrishabha' | 'mithun' | 'karka' | 'simha' | 'kanya' | 'tula' | 'vrischika' | 'dhanu' | 'makar' | 'kumbha' | 'meen'; }; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/vedic-astrology/rashis/{id}'; }; export type GetRashiErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetRashiError = GetRashiErrors[keyof GetRashiErrors]; export type GetRashiResponses = { /** * Single rashi with Sanskrit name, Western equivalent, sidereal date range, symbol, governing Aditya, and personality characteristics. */ 200: RashiResponse; }; export type GetRashiResponse = GetRashiResponses[keyof GetRashiResponses]; export type ListNakshatrasData = { body?: never; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/vedic-astrology/nakshatras'; }; export type ListNakshatrasErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type ListNakshatrasError = ListNakshatrasErrors[keyof ListNakshatrasErrors]; export type ListNakshatrasResponses = { /** * Array of all 27 nakshatras (Ashwini through Revati) with zodiac ranges, ruling planets, deities, symbols, personality characteristics, and traditional remedies. */ 200: NakshatraListResponse; }; export type ListNakshatrasResponse = ListNakshatrasResponses[keyof ListNakshatrasResponses]; export type GetNakshatraData = { body?: never; path: { /** * Nakshatra ID slug. Examples: ashwini, bharani, krittika, rohini, mrigashira, ardra, punarvasu, pushya, ashlesha, magha, etc. */ id: 'ashwini' | 'bharani' | 'krittika' | 'rohini' | 'mrigashira' | 'ardra' | 'punarvasu' | 'pushya' | 'ashlesha' | 'magha' | 'purva-phalguni' | 'uttara-phalguni' | 'hasta' | 'chitra' | 'swati' | 'vishakha' | 'anuradha' | 'jyeshtha' | 'moola' | 'purva-ashadha' | 'uttara-ashadha' | 'shravana' | 'dhanishta' | 'shatabhisha' | 'purva-bhadrapada' | 'uttara-bhadrapada' | 'revati'; }; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/vedic-astrology/nakshatras/{id}'; }; export type GetNakshatraErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetNakshatraError = GetNakshatraErrors[keyof GetNakshatraErrors]; export type GetNakshatraResponses = { /** * Single nakshatra with zodiac range, ruling planet, presiding deity, symbol, personality characteristics, and traditional remedies (mantras, gemstones, rituals). */ 200: NakshatraResponse; }; export type GetNakshatraResponse = GetNakshatraResponses[keyof GetNakshatraResponses]; export type GetUpagrahaPositionsData = { body?: UpagrahaRequest; path?: never; query?: never; url: '/vedic-astrology/upagraha'; }; export type GetUpagrahaPositionsErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetUpagrahaPositionsError = GetUpagrahaPositionsErrors[keyof GetUpagrahaPositionsErrors]; export type GetUpagrahaPositionsResponses = { /** * All 11 upagraha positions with rashi, nakshatra, and pada details. */ 200: UpagrahaResponse; }; export type GetUpagrahaPositionsResponse = GetUpagrahaPositionsResponses[keyof GetUpagrahaPositionsResponses]; export type CalculateAshtakavargaData = { body?: AshtakavargaRequest; path?: never; query?: never; url: '/vedic-astrology/ashtakavarga'; }; export type CalculateAshtakavargaErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type CalculateAshtakavargaError = CalculateAshtakavargaErrors[keyof CalculateAshtakavargaErrors]; export type CalculateAshtakavargaResponses = { /** * Complete Ashtakavarga with Bhinnashtakavarga, Sarvashtakavarga (337-point), Reduced Ashtakavarga (Trikona + Ekadipati Shodhana), and Shodhya Pinda planetary strength. */ 200: AshtakavargaResponse; }; export type CalculateAshtakavargaResponse = CalculateAshtakavargaResponses[keyof CalculateAshtakavargaResponses]; export type CalculateShadbalaData = { body?: ShadbalaRequest; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/vedic-astrology/shadbala'; }; export type CalculateShadbalaErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type CalculateShadbalaError = CalculateShadbalaErrors[keyof CalculateShadbalaErrors]; export type CalculateShadbalaResponses = { /** * Complete Shadbala with 6 strength components, Ishta/Kashta Phala, strength ratios, and relative ranking for all 7 planets. */ 200: ShadbalaResponse; }; export type CalculateShadbalaResponse = CalculateShadbalaResponses[keyof CalculateShadbalaResponses]; export type ListAvasthasData = { body?: never; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; /** * Return only the states of one system: "baladi" (5), "jagradadi" (3) or "deeptadi" (9). Omit for all 17. */ system?: 'baladi' | 'jagradadi' | 'deeptadi'; }; url: '/vedic-astrology/avasthas'; }; export type ListAvasthasErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type ListAvasthasError = ListAvasthasErrors[keyof ListAvasthasErrors]; export type ListAvasthasResponses = { /** * Avastha states with their labels and interpretations, in system order. */ 200: Array<{ /** * Unique slug for the avastha state. It is the lowercased form of the state name the birth chart returns, so a chart value maps straight onto this record. */ id: string; /** * Sanskrit name of the state, exactly as it appears in the `awastha`, `jagradadi` or `deeptadi` field of a birth chart. */ name: string; /** * Which avastha system the state belongs to, and therefore which birth-chart field it appears in. "baladi" is the five-fold age state set by degree within the sign and appears in `awastha`. "jagradadi" is the three-fold waking state set by sign dignity. "deeptadi" is the nine-fold dispositional state. Baladi applies to every body; the other two apply to the seven classical grahas only. */ system: 'baladi' | 'jagradadi' | 'deeptadi'; /** * Short label for the state, sized for a table cell beside the graha. */ meaning: string; /** * What the state means for the results the graha delivers, which is the whole purpose of reading an avastha: the chart says where a graha is, the avastha says how much of its promise it can keep. */ interpretation: string; }>; }; export type ListAvasthasResponse = ListAvasthasResponses[keyof ListAvasthasResponses]; export type GetAvasthaData = { body?: never; path: { /** * Avastha slug. Baladi: bala, kumara, yuva, vriddha, mrita. Jagradadi: jagrat, swapna, sushupti. Deeptadi: dipta, svastha, pramudita, shanta, dina, duhkhita, vikala, khala, kopa. */ id: 'bala' | 'kumara' | 'yuva' | 'vriddha' | 'mrita' | 'jagrat' | 'swapna' | 'sushupti' | 'dipta' | 'svastha' | 'pramudita' | 'shanta' | 'dina' | 'duhkhita' | 'vikala' | 'khala' | 'kopa'; }; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/vedic-astrology/avasthas/{id}'; }; export type GetAvasthaErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetAvasthaError = GetAvasthaErrors[keyof GetAvasthaErrors]; export type GetAvasthaResponses = { /** * The avastha state with its system, label and interpretation. */ 200: { /** * Unique slug for the avastha state. It is the lowercased form of the state name the birth chart returns, so a chart value maps straight onto this record. */ id: string; /** * Sanskrit name of the state, exactly as it appears in the `awastha`, `jagradadi` or `deeptadi` field of a birth chart. */ name: string; /** * Which avastha system the state belongs to, and therefore which birth-chart field it appears in. "baladi" is the five-fold age state set by degree within the sign and appears in `awastha`. "jagradadi" is the three-fold waking state set by sign dignity. "deeptadi" is the nine-fold dispositional state. Baladi applies to every body; the other two apply to the seven classical grahas only. */ system: 'baladi' | 'jagradadi' | 'deeptadi'; /** * Short label for the state, sized for a table cell beside the graha. */ meaning: string; /** * What the state means for the results the graha delivers, which is the whole purpose of reading an avastha: the chart says where a graha is, the avastha says how much of its promise it can keep. */ interpretation: string; }; }; export type GetAvasthaResponse = GetAvasthaResponses[keyof GetAvasthaResponses]; export type CalculateArudhaPadasData = { body?: ArudhaRequest; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/vedic-astrology/arudha'; }; export type CalculateArudhaPadasErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type CalculateArudhaPadasError = CalculateArudhaPadasErrors[keyof CalculateArudhaPadasErrors]; export type CalculateArudhaPadasResponses = { /** * All twelve Arudha padas with derivation detail, plus the Arudha Lagna and Upapada lifted to the top level. */ 200: ArudhaResponse; }; export type CalculateArudhaPadasResponse = CalculateArudhaPadasResponses[keyof CalculateArudhaPadasResponses]; export type CalculateCharaKarakasData = { body?: CharaKarakaRequest; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/vedic-astrology/chara-karakas'; }; export type CalculateCharaKarakasErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type CalculateCharaKarakasError = CalculateCharaKarakasErrors[keyof CalculateCharaKarakasErrors]; export type CalculateCharaKarakasResponses = { /** * Karaka offices in descending rank with the ranking degree for each, plus the Atmakaraka and Darakaraka lifted to the top level. */ 200: CharaKarakaResponse; }; export type CalculateCharaKarakasResponse = CalculateCharaKarakasResponses[keyof CalculateCharaKarakasResponses]; export type CalculateBhavaBalaData = { body?: BhavaBalaRequest; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; /** * Which signification vocabulary the houseThemes map returns. "general" gives the classical bhava significations (self, wealth, siblings, home, and so on). "finance" gives the money reading of the same twelve bhavas, so house 2 returns income and savings, 5 speculation and risk appetite, 8 sudden money and leverage, 11 gains and profits, and 12 expenses and capital outflow. Use "finance" for wealth, income, business and market timing questions in Krishnamurti Paddhati, where the significator house groups 2, 6, 10, 11 for earned income and 5, 8, 11 for speculation are read against a running dasha. Defaults to "general". */ focus?: 'general' | 'finance'; }; url: '/vedic-astrology/bhava-bala'; }; export type CalculateBhavaBalaErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type CalculateBhavaBalaError = CalculateBhavaBalaErrors[keyof CalculateBhavaBalaErrors]; export type CalculateBhavaBalaResponses = { /** * Bhava Bala for all twelve houses with the three components, totals in virupas and rupas, ranking, and the localized house-theme legend. */ 200: BhavaBalaResponse; }; export type CalculateBhavaBalaResponse = CalculateBhavaBalaResponses[keyof CalculateBhavaBalaResponses]; export type CalculateBhavChalitData = { body?: BhavChalitRequest; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; /** * Which signification vocabulary the houseThemes map returns. "general" gives the classical bhava significations (self, wealth, siblings, home, and so on). "finance" gives the money reading of the same twelve bhavas, so house 2 returns income and savings, 5 speculation and risk appetite, 8 sudden money and leverage, 11 gains and profits, and 12 expenses and capital outflow. Use "finance" for wealth, income, business and market timing questions in Krishnamurti Paddhati, where the significator house groups 2, 6, 10, 11 for earned income and 5, 8, 11 for speculation are read against a running dasha. Defaults to "general". */ focus?: 'general' | 'finance'; }; url: '/vedic-astrology/bhav-chalit'; }; export type CalculateBhavChalitErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type CalculateBhavChalitError = CalculateBhavChalitErrors[keyof CalculateBhavChalitErrors]; export type CalculateBhavChalitResponses = { /** * Bhav Chalit chart with the twelve Sripati bhavas, every graha in both frames, and the localized house-theme legend. */ 200: BhavChalitResponse; }; export type CalculateBhavChalitResponse = CalculateBhavChalitResponses[keyof CalculateBhavChalitResponses]; export type GetHeliacalVisibilityData = { body?: HeliacalRequest; path?: never; query?: never; url: '/vedic-astrology/heliacal'; }; export type GetHeliacalVisibilityErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetHeliacalVisibilityError = GetHeliacalVisibilityErrors[keyof GetHeliacalVisibilityErrors]; export type GetHeliacalVisibilityResponses = { /** * Heliacal visibility and the surrounding udaya and asta events for each graha. */ 200: HeliacalResponse; }; export type GetHeliacalVisibilityResponse = GetHeliacalVisibilityResponses[keyof GetHeliacalVisibilityResponses]; export type GenerateTimelineData = { body?: { /** * The single birth subject this forecast is built for. One object only, never an array. */ birthData: { /** * Birth date in YYYY-MM-DD format. Anchors the natal chart and the Vimshottari dasha sequence. */ date: string; /** * Birth time in 24-hour HH:MM:SS format. Precision matters for the natal positions the transit aspects are measured against. */ time: string; /** * IANA name (e.g. "America/New_York", "Europe/London", "UTC"), decimal hours (e.g. -5 for EST, 1 for CET), or a fixed UTC offset (e.g. "-05:00", "+01:00"). Prefer the IANA name: it is resolved to the offset in force at the birth date and time, historical daylight-saving rules included, while a fixed offset or decimal is taken literally and will be wrong if it does not match the daylight-saving state at that moment. On a transition day a time in the repeated hour is read as its first occurrence and a time in the skipped hour is moved forward past the gap. Invalid timezones return 400 with a validation error. */ timezone: number | string; /** * Birth latitude in decimal degrees. Optional and does not affect the timeline. Defaults to 0. */ latitude?: number; /** * Birth longitude in decimal degrees. Optional and does not affect the timeline. Defaults to 0. */ longitude?: number; }; /** * First day of the forecast window in YYYY-MM-DD format. Defaults to today in UTC. */ startDate?: string; /** * Last day of the forecast window in YYYY-MM-DD format. Defaults to startDate plus 30 days. The window is clamped to a maximum of 90 days from startDate. */ endDate?: string; /** * Which forecast domains to include. Defaults to all three. Pass a subset to scope the timeline to one or two engines. */ domains?: Array<'western' | 'vedic' | 'biorhythm'>; /** * Drop events scoring below this significance threshold from 0 to 100. Defaults to 0, keeping all events. */ minSignificance?: number; /** * Per-domain significance multipliers applied before the significance floor and event cap. Bias which domains survive filtering and the cap. Omitted domains default to a weight of 1. Valid keys are western, vedic, and biorhythm. */ domainWeights?: { /** * Multiplier for this domain significance. 1 leaves it unchanged, above 1 promotes the domain, below 1 demotes it. */ western?: number; /** * Multiplier for this domain significance. 1 leaves it unchanged, above 1 promotes the domain, below 1 demotes it. */ vedic?: number; /** * Multiplier for this domain significance. 1 leaves it unchanged, above 1 promotes the domain, below 1 demotes it. */ biorhythm?: number; }; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/forecast/timeline'; }; export type GenerateTimelineErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GenerateTimelineError = GenerateTimelineErrors[keyof GenerateTimelineErrors]; export type GenerateTimelineResponses = { /** * Merged forecast timeline with time-ordered events across the requested domains */ 200: { /** * Echo of the birth subject this forecast was built for. */ birthData: { /** * Birth date in YYYY-MM-DD format. Anchors the natal chart and the Vimshottari dasha sequence. */ date: string; /** * Birth time in 24-hour HH:MM:SS format. Precision matters for the natal positions the transit aspects are measured against. */ time: string; /** * Decimal UTC offset the forecast was computed with, resolved from whatever the request sent. An IANA name is resolved to the offset in force at the birth date and time, so this is the literal number applied, never the name. */ timezone: number; /** * Birth latitude in decimal degrees. Optional and does not affect the timeline. Defaults to 0. */ latitude?: number; /** * Birth longitude in decimal degrees. Optional and does not affect the timeline. Defaults to 0. */ longitude?: number; }; /** * First day of the resolved forecast window. */ startDate: string; /** * Last day of the resolved forecast window after the horizon clamp. */ endDate: string; /** * Number of events in the timeline after deduplication, filtering, and the event cap. */ count: number; /** * The merged, time-ordered forecast events across the requested domains. */ events: Array<{ /** * Calendar date of the event in YYYY-MM-DD (UTC). */ date: string; /** * Exact instant of the event as an ISO-8601 UTC datetime. Astronomical events are refined to this instant by search, not reported at a daily sample point. */ datetime: string; /** * Forecast domain. western covers transit aspects, sign ingresses, retrograde stations, eclipses, and new and full moons. vedic covers Vimshottari mahadasha, antardasha, and pratyantardasha boundaries. biorhythm covers critical days. A stable machine value, never localized, so consumers can branch on it under any language. */ domain: 'western' | 'vedic' | 'biorhythm'; /** * Event kind. transit-aspect, sign-ingress, retrograde-station, eclipse, and lunar-phase are western, dasha-change is vedic Vimshottari, critical-day is biorhythm. A stable machine value, never localized, so consumers can branch on it under any language. */ type: 'transit-aspect' | 'sign-ingress' | 'retrograde-station' | 'eclipse' | 'lunar-phase' | 'dasha-change' | 'critical-day'; /** * Primary subject of the event. A transiting planet for western events, Sun for a solar eclipse, Moon for a lunar eclipse or a new or full moon, a mahadasha, antardasha, or pratyantardasha label for dasha changes, or the critical cycle for biorhythm days. */ body: string; /** * For a transit-aspect, the natal body the transit aspects. For a sign-ingress, the zodiac sign entered, and for a lunar-phase, the zodiac sign of the New or Full Moon. Absent for other event types. */ target?: string; /** * For a transit-aspect, the angular relationship. One of conjunction, sextile, square, trine, opposition. Absent for other event types. */ aspect?: string; /** * For a transit-aspect, the separation in degrees from the exact aspect at the reported instant. Tighter orb means a more exact and significant aspect. */ orb?: number; /** * For a retrograde-station, whether the planet turns retrograde or direct. A stable machine value, never localized. Absent for other event types. */ station?: 'retrograde' | 'direct'; /** * For an eclipse, its classification. total and penumbral apply to lunar eclipses, partial applies to both, annular and total apply to solar eclipses. A stable machine value, never localized. Absent for other event types. */ kind?: 'penumbral' | 'partial' | 'annular' | 'total'; /** * For a lunar eclipse, the peak fraction from 0 to 1 of the Moon disc covered by Earth umbra. 1 for a total lunar eclipse, between 0 and 1 for a partial, 0 for a penumbral. Absent for solar eclipses and other event types. */ obscuration?: number; /** * For a lunar-phase event, which syzygy it is: new-moon (Sun-Moon conjunction) or full-moon (Sun-Moon opposition). The intermediate quarters are not emitted. A stable machine value, never localized. Absent for other event types. */ phase?: 'new-moon' | 'full-moon'; /** * Plain-language summary of the event, suitable for direct display. The only localized field: when lang is set this sentence, and the body, target, and aspect names within it, render in the requested language while the structured fields stay English. */ description: string; /** * Importance score from 0 to 100. Outer-planet exact transit aspects and mahadasha changes score highest; fast Moon events and biorhythm critical days score lower. When domainWeights is supplied this is the weighted score, rounded and clamped to 0 to 100, which is the same value the significance floor and the event cap acted on. */ significance: number; }>; }; }; export type GenerateTimelineResponse = GenerateTimelineResponses[keyof GenerateTimelineResponses]; export type ForecastTransitsData = { body?: { /** * The single birth subject this transit forecast is built for. One object only, never an array. */ birthData: { /** * Birth date in YYYY-MM-DD format. Anchors the natal chart and the Vimshottari dasha sequence. */ date: string; /** * Birth time in 24-hour HH:MM:SS format. Precision matters for the natal positions the transit aspects are measured against. */ time: string; /** * IANA name (e.g. "America/New_York", "Europe/London", "UTC"), decimal hours (e.g. -5 for EST, 1 for CET), or a fixed UTC offset (e.g. "-05:00", "+01:00"). Prefer the IANA name: it is resolved to the offset in force at the birth date and time, historical daylight-saving rules included, while a fixed offset or decimal is taken literally and will be wrong if it does not match the daylight-saving state at that moment. On a transition day a time in the repeated hour is read as its first occurrence and a time in the skipped hour is moved forward past the gap. Invalid timezones return 400 with a validation error. */ timezone: number | string; /** * Birth latitude in decimal degrees. Optional and does not affect the timeline. Defaults to 0. */ latitude?: number; /** * Birth longitude in decimal degrees. Optional and does not affect the timeline. Defaults to 0. */ longitude?: number; }; /** * First day of the transit window in YYYY-MM-DD format. Defaults to today in UTC. */ startDate?: string; /** * Last day of the transit window in YYYY-MM-DD format. Defaults to startDate plus 30 days. Clamped to a maximum of 90 days from startDate. */ endDate?: string; /** * Drop transit events scoring below this significance threshold from 0 to 100. Defaults to 0. */ minSignificance?: number; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/forecast/transits'; }; export type ForecastTransitsErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type ForecastTransitsError = ForecastTransitsErrors[keyof ForecastTransitsErrors]; export type ForecastTransitsResponses = { /** * Time-ordered western forecast events: aspects, ingresses, stations, eclipses, and moon phases */ 200: { /** * Echo of the birth subject this forecast was built for. */ birthData: { /** * Birth date in YYYY-MM-DD format. Anchors the natal chart and the Vimshottari dasha sequence. */ date: string; /** * Birth time in 24-hour HH:MM:SS format. Precision matters for the natal positions the transit aspects are measured against. */ time: string; /** * Decimal UTC offset the forecast was computed with, resolved from whatever the request sent. An IANA name is resolved to the offset in force at the birth date and time, so this is the literal number applied, never the name. */ timezone: number; /** * Birth latitude in decimal degrees. Optional and does not affect the timeline. Defaults to 0. */ latitude?: number; /** * Birth longitude in decimal degrees. Optional and does not affect the timeline. Defaults to 0. */ longitude?: number; }; /** * First day of the resolved forecast window. */ startDate: string; /** * Last day of the resolved forecast window after the horizon clamp. */ endDate: string; /** * Number of events in the timeline after deduplication, filtering, and the event cap. */ count: number; /** * The merged, time-ordered forecast events across the requested domains. */ events: Array<{ /** * Calendar date of the event in YYYY-MM-DD (UTC). */ date: string; /** * Exact instant of the event as an ISO-8601 UTC datetime. Astronomical events are refined to this instant by search, not reported at a daily sample point. */ datetime: string; /** * Forecast domain. western covers transit aspects, sign ingresses, retrograde stations, eclipses, and new and full moons. vedic covers Vimshottari mahadasha, antardasha, and pratyantardasha boundaries. biorhythm covers critical days. A stable machine value, never localized, so consumers can branch on it under any language. */ domain: 'western' | 'vedic' | 'biorhythm'; /** * Event kind. transit-aspect, sign-ingress, retrograde-station, eclipse, and lunar-phase are western, dasha-change is vedic Vimshottari, critical-day is biorhythm. A stable machine value, never localized, so consumers can branch on it under any language. */ type: 'transit-aspect' | 'sign-ingress' | 'retrograde-station' | 'eclipse' | 'lunar-phase' | 'dasha-change' | 'critical-day'; /** * Primary subject of the event. A transiting planet for western events, Sun for a solar eclipse, Moon for a lunar eclipse or a new or full moon, a mahadasha, antardasha, or pratyantardasha label for dasha changes, or the critical cycle for biorhythm days. */ body: string; /** * For a transit-aspect, the natal body the transit aspects. For a sign-ingress, the zodiac sign entered, and for a lunar-phase, the zodiac sign of the New or Full Moon. Absent for other event types. */ target?: string; /** * For a transit-aspect, the angular relationship. One of conjunction, sextile, square, trine, opposition. Absent for other event types. */ aspect?: string; /** * For a transit-aspect, the separation in degrees from the exact aspect at the reported instant. Tighter orb means a more exact and significant aspect. */ orb?: number; /** * For a retrograde-station, whether the planet turns retrograde or direct. A stable machine value, never localized. Absent for other event types. */ station?: 'retrograde' | 'direct'; /** * For an eclipse, its classification. total and penumbral apply to lunar eclipses, partial applies to both, annular and total apply to solar eclipses. A stable machine value, never localized. Absent for other event types. */ kind?: 'penumbral' | 'partial' | 'annular' | 'total'; /** * For a lunar eclipse, the peak fraction from 0 to 1 of the Moon disc covered by Earth umbra. 1 for a total lunar eclipse, between 0 and 1 for a partial, 0 for a penumbral. Absent for solar eclipses and other event types. */ obscuration?: number; /** * For a lunar-phase event, which syzygy it is: new-moon (Sun-Moon conjunction) or full-moon (Sun-Moon opposition). The intermediate quarters are not emitted. A stable machine value, never localized. Absent for other event types. */ phase?: 'new-moon' | 'full-moon'; /** * Plain-language summary of the event, suitable for direct display. The only localized field: when lang is set this sentence, and the body, target, and aspect names within it, render in the requested language while the structured fields stay English. */ description: string; /** * Importance score from 0 to 100. Outer-planet exact transit aspects and mahadasha changes score highest; fast Moon events and biorhythm critical days score lower. When domainWeights is supplied this is the weighted score, rounded and clamped to 0 to 100, which is the same value the significance floor and the event cap acted on. */ significance: number; }>; }; }; export type ForecastTransitsResponse = ForecastTransitsResponses[keyof ForecastTransitsResponses]; export type FindSignificantDatesData = { body?: { /** * The single birth subject this forecast is built for. One object only, never an array. */ birthData: { /** * Birth date in YYYY-MM-DD format. Anchors the natal chart and the Vimshottari dasha sequence. */ date: string; /** * Birth time in 24-hour HH:MM:SS format. Precision matters for the natal positions the transit aspects are measured against. */ time: string; /** * IANA name (e.g. "America/New_York", "Europe/London", "UTC"), decimal hours (e.g. -5 for EST, 1 for CET), or a fixed UTC offset (e.g. "-05:00", "+01:00"). Prefer the IANA name: it is resolved to the offset in force at the birth date and time, historical daylight-saving rules included, while a fixed offset or decimal is taken literally and will be wrong if it does not match the daylight-saving state at that moment. On a transition day a time in the repeated hour is read as its first occurrence and a time in the skipped hour is moved forward past the gap. Invalid timezones return 400 with a validation error. */ timezone: number | string; /** * Birth latitude in decimal degrees. Optional and does not affect the timeline. Defaults to 0. */ latitude?: number; /** * Birth longitude in decimal degrees. Optional and does not affect the timeline. Defaults to 0. */ longitude?: number; }; /** * First day of the window in YYYY-MM-DD format. Defaults to today in UTC. */ startDate?: string; /** * Last day of the window in YYYY-MM-DD format. Defaults to startDate plus 30 days. Clamped to a maximum of 90 days from startDate. */ endDate?: string; /** * Which forecast domains to consider before filtering by significance. Defaults to all three. */ domains?: Array<'western' | 'vedic' | 'biorhythm'>; /** * Significance floor from 0 to 100 for what counts as a significant date. Defaults to 70. */ minSignificance?: number; /** * Per-domain significance multipliers applied before the significance floor and event cap. Bias which domains survive filtering and the cap. Omitted domains default to a weight of 1. Valid keys are western, vedic, and biorhythm. */ domainWeights?: { /** * Multiplier for this domain significance. 1 leaves it unchanged, above 1 promotes the domain, below 1 demotes it. */ western?: number; /** * Multiplier for this domain significance. 1 leaves it unchanged, above 1 promotes the domain, below 1 demotes it. */ vedic?: number; /** * Multiplier for this domain significance. 1 leaves it unchanged, above 1 promotes the domain, below 1 demotes it. */ biorhythm?: number; }; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/forecast/significant-dates'; }; export type FindSignificantDatesErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type FindSignificantDatesError = FindSignificantDatesErrors[keyof FindSignificantDatesErrors]; export type FindSignificantDatesResponses = { /** * High-significance forecast events across the requested domains */ 200: { /** * Echo of the birth subject this forecast was built for. */ birthData: { /** * Birth date in YYYY-MM-DD format. Anchors the natal chart and the Vimshottari dasha sequence. */ date: string; /** * Birth time in 24-hour HH:MM:SS format. Precision matters for the natal positions the transit aspects are measured against. */ time: string; /** * Decimal UTC offset the forecast was computed with, resolved from whatever the request sent. An IANA name is resolved to the offset in force at the birth date and time, so this is the literal number applied, never the name. */ timezone: number; /** * Birth latitude in decimal degrees. Optional and does not affect the timeline. Defaults to 0. */ latitude?: number; /** * Birth longitude in decimal degrees. Optional and does not affect the timeline. Defaults to 0. */ longitude?: number; }; /** * First day of the resolved forecast window. */ startDate: string; /** * Last day of the resolved forecast window after the horizon clamp. */ endDate: string; /** * Number of events in the timeline after deduplication, filtering, and the event cap. */ count: number; /** * The merged, time-ordered forecast events across the requested domains. */ events: Array<{ /** * Calendar date of the event in YYYY-MM-DD (UTC). */ date: string; /** * Exact instant of the event as an ISO-8601 UTC datetime. Astronomical events are refined to this instant by search, not reported at a daily sample point. */ datetime: string; /** * Forecast domain. western covers transit aspects, sign ingresses, retrograde stations, eclipses, and new and full moons. vedic covers Vimshottari mahadasha, antardasha, and pratyantardasha boundaries. biorhythm covers critical days. A stable machine value, never localized, so consumers can branch on it under any language. */ domain: 'western' | 'vedic' | 'biorhythm'; /** * Event kind. transit-aspect, sign-ingress, retrograde-station, eclipse, and lunar-phase are western, dasha-change is vedic Vimshottari, critical-day is biorhythm. A stable machine value, never localized, so consumers can branch on it under any language. */ type: 'transit-aspect' | 'sign-ingress' | 'retrograde-station' | 'eclipse' | 'lunar-phase' | 'dasha-change' | 'critical-day'; /** * Primary subject of the event. A transiting planet for western events, Sun for a solar eclipse, Moon for a lunar eclipse or a new or full moon, a mahadasha, antardasha, or pratyantardasha label for dasha changes, or the critical cycle for biorhythm days. */ body: string; /** * For a transit-aspect, the natal body the transit aspects. For a sign-ingress, the zodiac sign entered, and for a lunar-phase, the zodiac sign of the New or Full Moon. Absent for other event types. */ target?: string; /** * For a transit-aspect, the angular relationship. One of conjunction, sextile, square, trine, opposition. Absent for other event types. */ aspect?: string; /** * For a transit-aspect, the separation in degrees from the exact aspect at the reported instant. Tighter orb means a more exact and significant aspect. */ orb?: number; /** * For a retrograde-station, whether the planet turns retrograde or direct. A stable machine value, never localized. Absent for other event types. */ station?: 'retrograde' | 'direct'; /** * For an eclipse, its classification. total and penumbral apply to lunar eclipses, partial applies to both, annular and total apply to solar eclipses. A stable machine value, never localized. Absent for other event types. */ kind?: 'penumbral' | 'partial' | 'annular' | 'total'; /** * For a lunar eclipse, the peak fraction from 0 to 1 of the Moon disc covered by Earth umbra. 1 for a total lunar eclipse, between 0 and 1 for a partial, 0 for a penumbral. Absent for solar eclipses and other event types. */ obscuration?: number; /** * For a lunar-phase event, which syzygy it is: new-moon (Sun-Moon conjunction) or full-moon (Sun-Moon opposition). The intermediate quarters are not emitted. A stable machine value, never localized. Absent for other event types. */ phase?: 'new-moon' | 'full-moon'; /** * Plain-language summary of the event, suitable for direct display. The only localized field: when lang is set this sentence, and the body, target, and aspect names within it, render in the requested language while the structured fields stay English. */ description: string; /** * Importance score from 0 to 100. Outer-planet exact transit aspects and mahadasha changes score highest; fast Moon events and biorhythm critical days score lower. When domainWeights is supplied this is the weighted score, rounded and clamped to 0 to 100, which is the same value the significance floor and the event cap acted on. */ significance: number; }>; }; }; export type FindSignificantDatesResponse = FindSignificantDatesResponses[keyof FindSignificantDatesResponses]; export type GenerateDigestData = { body?: { /** * The single birth subject this digest is built for. One object only, never an array. */ birthData: { /** * Birth date in YYYY-MM-DD format. Anchors the natal chart and the Vimshottari dasha sequence. */ date: string; /** * Birth time in 24-hour HH:MM:SS format. Precision matters for the natal positions the transit aspects are measured against. */ time: string; /** * IANA name (e.g. "America/New_York", "Europe/London", "UTC"), decimal hours (e.g. -5 for EST, 1 for CET), or a fixed UTC offset (e.g. "-05:00", "+01:00"). Prefer the IANA name: it is resolved to the offset in force at the birth date and time, historical daylight-saving rules included, while a fixed offset or decimal is taken literally and will be wrong if it does not match the daylight-saving state at that moment. On a transition day a time in the repeated hour is read as its first occurrence and a time in the skipped hour is moved forward past the gap. Invalid timezones return 400 with a validation error. */ timezone: number | string; /** * Birth latitude in decimal degrees. Optional and does not affect the timeline. Defaults to 0. */ latitude?: number; /** * Birth longitude in decimal degrees. Optional and does not affect the timeline. Defaults to 0. */ longitude?: number; }; /** * Start anchor for every window in YYYY-MM-DD format. The next 24h, 7d, 30d, and 90d windows are measured forward from this date at 00:00:00 UTC. Defaults to today in UTC. */ startDate?: string; /** * Which forecast domains to include before rolling up the windows. Defaults to all three. */ domains?: Array<'western' | 'vedic' | 'biorhythm'>; /** * Drop events scoring below this significance threshold from 0 to 100 before the rollup. Defaults to 0. */ minSignificance?: number; /** * Per-domain significance multipliers applied before the significance floor and event cap. Bias which domains survive filtering and the cap. Omitted domains default to a weight of 1. Valid keys are western, vedic, and biorhythm. */ domainWeights?: { /** * Multiplier for this domain significance. 1 leaves it unchanged, above 1 promotes the domain, below 1 demotes it. */ western?: number; /** * Multiplier for this domain significance. 1 leaves it unchanged, above 1 promotes the domain, below 1 demotes it. */ vedic?: number; /** * Multiplier for this domain significance. 1 leaves it unchanged, above 1 promotes the domain, below 1 demotes it. */ biorhythm?: number; }; /** * Number of highest-significance events to surface per window. Defaults to 3, capped at 20. */ top?: number; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/forecast/digest'; }; export type GenerateDigestErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GenerateDigestError = GenerateDigestErrors[keyof GenerateDigestErrors]; export type GenerateDigestResponses = { /** * Pre-summarized forecast windows: next 24h, 7d, 30d, and 90d rollups */ 200: { /** * Echo of the birth subject this digest was built for. */ birthData: { /** * Birth date in YYYY-MM-DD format. Anchors the natal chart and the Vimshottari dasha sequence. */ date: string; /** * Birth time in 24-hour HH:MM:SS format. Precision matters for the natal positions the transit aspects are measured against. */ time: string; /** * Decimal UTC offset the forecast was computed with, resolved from whatever the request sent. An IANA name is resolved to the offset in force at the birth date and time, so this is the literal number applied, never the name. */ timezone: number; /** * Birth latitude in decimal degrees. Optional and does not affect the timeline. Defaults to 0. */ latitude?: number; /** * Birth longitude in decimal degrees. Optional and does not affect the timeline. Defaults to 0. */ longitude?: number; }; /** * Start anchor every window is measured from. */ startDate: string; /** * Last day of the resolved 90 day horizon the timeline was built over before slicing. */ endDate: string; /** * The four rollups in ascending window length: next 24h, 7d, 30d, and 90d from the start anchor. */ windows: Array<{ /** * Length of this window in days forward from the start anchor. One of 1, 7, 30, 90. */ days: number; /** * Inclusive lower bound of the window as an ISO-8601 UTC datetime, the start anchor. */ from: string; /** * Exclusive upper bound of the window as an ISO-8601 UTC datetime, the start anchor plus the window length. */ to: string; /** * Number of events whose datetime falls inside this window. */ count: number; /** * Count of events in this window broken down by domain. Only domains with at least one event in the window are present. The values sum to count. */ byDomain: { /** * Number of events in this window produced by this forecast domain. Absent when the domain contributed nothing, so a zero is never written. */ western?: number; /** * Number of events in this window produced by this forecast domain. Absent when the domain contributed nothing, so a zero is never written. */ vedic?: number; /** * Number of events in this window produced by this forecast domain. Absent when the domain contributed nothing, so a zero is never written. */ biorhythm?: number; }; /** * Count of events in this window broken down by event type. Only types with at least one event in the window are present. The values sum to count. */ byType: { /** * Number of events in this window of this event type. Absent when the type did not occur, so a zero is never written. */ 'transit-aspect'?: number; /** * Number of events in this window of this event type. Absent when the type did not occur, so a zero is never written. */ 'sign-ingress'?: number; /** * Number of events in this window of this event type. Absent when the type did not occur, so a zero is never written. */ 'retrograde-station'?: number; /** * Number of events in this window of this event type. Absent when the type did not occur, so a zero is never written. */ eclipse?: number; /** * Number of events in this window of this event type. Absent when the type did not occur, so a zero is never written. */ 'lunar-phase'?: number; /** * Number of events in this window of this event type. Absent when the type did not occur, so a zero is never written. */ 'dasha-change'?: number; /** * Number of events in this window of this event type. Absent when the type did not occur, so a zero is never written. */ 'critical-day'?: number; }; /** * The highest-significance events in this window, most significant first, up to the requested top count. The same TimelineEvent shape as the timeline endpoints. */ top: Array<{ /** * Calendar date of the event in YYYY-MM-DD (UTC). */ date: string; /** * Exact instant of the event as an ISO-8601 UTC datetime. Astronomical events are refined to this instant by search, not reported at a daily sample point. */ datetime: string; /** * Forecast domain. western covers transit aspects, sign ingresses, retrograde stations, eclipses, and new and full moons. vedic covers Vimshottari mahadasha, antardasha, and pratyantardasha boundaries. biorhythm covers critical days. A stable machine value, never localized, so consumers can branch on it under any language. */ domain: 'western' | 'vedic' | 'biorhythm'; /** * Event kind. transit-aspect, sign-ingress, retrograde-station, eclipse, and lunar-phase are western, dasha-change is vedic Vimshottari, critical-day is biorhythm. A stable machine value, never localized, so consumers can branch on it under any language. */ type: 'transit-aspect' | 'sign-ingress' | 'retrograde-station' | 'eclipse' | 'lunar-phase' | 'dasha-change' | 'critical-day'; /** * Primary subject of the event. A transiting planet for western events, Sun for a solar eclipse, Moon for a lunar eclipse or a new or full moon, a mahadasha, antardasha, or pratyantardasha label for dasha changes, or the critical cycle for biorhythm days. */ body: string; /** * For a transit-aspect, the natal body the transit aspects. For a sign-ingress, the zodiac sign entered, and for a lunar-phase, the zodiac sign of the New or Full Moon. Absent for other event types. */ target?: string; /** * For a transit-aspect, the angular relationship. One of conjunction, sextile, square, trine, opposition. Absent for other event types. */ aspect?: string; /** * For a transit-aspect, the separation in degrees from the exact aspect at the reported instant. Tighter orb means a more exact and significant aspect. */ orb?: number; /** * For a retrograde-station, whether the planet turns retrograde or direct. A stable machine value, never localized. Absent for other event types. */ station?: 'retrograde' | 'direct'; /** * For an eclipse, its classification. total and penumbral apply to lunar eclipses, partial applies to both, annular and total apply to solar eclipses. A stable machine value, never localized. Absent for other event types. */ kind?: 'penumbral' | 'partial' | 'annular' | 'total'; /** * For a lunar eclipse, the peak fraction from 0 to 1 of the Moon disc covered by Earth umbra. 1 for a total lunar eclipse, between 0 and 1 for a partial, 0 for a penumbral. Absent for solar eclipses and other event types. */ obscuration?: number; /** * For a lunar-phase event, which syzygy it is: new-moon (Sun-Moon conjunction) or full-moon (Sun-Moon opposition). The intermediate quarters are not emitted. A stable machine value, never localized. Absent for other event types. */ phase?: 'new-moon' | 'full-moon'; /** * Plain-language summary of the event, suitable for direct display. The only localized field: when lang is set this sentence, and the body, target, and aspect names within it, render in the requested language while the structured fields stay English. */ description: string; /** * Importance score from 0 to 100. Outer-planet exact transit aspects and mahadasha changes score highest; fast Moon events and biorhythm critical days score lower. When domainWeights is supplied this is the weighted score, rounded and clamped to 0 to 100, which is the same value the significance floor and the event cap acted on. */ significance: number; }>; }>; }; }; export type GenerateDigestResponse = GenerateDigestResponses[keyof GenerateDigestResponses]; export type ForecastSolarReturnData = { body?: { /** * Birth date in YYYY-MM-DD format. Anchors the natal Sun longitude the transiting Sun returns to each year. */ date: string; /** * Birth time in 24-hour HH:MM:SS format. Pins the exact natal Sun position that defines the solar return moment. */ time: string; /** * Year to cast the solar return for. The chart is erected for the moment in this year when the transiting Sun returns to the natal Sun longitude, on or within a day of the birthday. */ year: number; /** * Latitude of the solar return location in decimal degrees. The solar return is location-sensitive: use the birthplace to anchor the chart to natal geography, or the current city for a relocated solar return. */ latitude: number; /** * Longitude of the solar return location in decimal degrees. Sets the local sidereal time, so it drives the Ascendant, Midheaven, and house cusps of the return chart. */ longitude: number; /** * IANA name (e.g. "America/New_York", "Europe/London", "UTC"), decimal hours (e.g. -5 for EST, 1 for CET), or a fixed UTC offset (e.g. "-05:00", "+01:00"). Prefer the IANA name: it is resolved to the offset in force at the birth date and time, historical daylight-saving rules included, while a fixed offset or decimal is taken literally and will be wrong if it does not match the daylight-saving state at that moment. On a transition day a time in the repeated hour is read as its first occurrence and a time in the skipped hour is moved forward past the gap. Invalid timezones return 400 with a validation error. */ timezone: number | string; /** * House system for the return chart. placidus is the Western default. whole-sign, equal, and koch are also supported. */ houseSystem?: 'placidus' | 'whole-sign' | 'equal' | 'koch'; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/forecast/solar-return'; }; export type ForecastSolarReturnErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type ForecastSolarReturnError = ForecastSolarReturnErrors[keyof ForecastSolarReturnErrors]; export type ForecastSolarReturnResponses = { /** * Solar return chart cast for the requested year and location */ 200: { /** * Echo of the birth date used to find the natal Sun longitude. */ birthDate: string; /** * Exact solar return moment, when the transiting Sun returns to the natal Sun longitude, formatted in the requested timezone. The astrological birthday for the year. */ solarReturnDate: string; /** * Year of this solar return. The chart covers the period to the next birthday. */ solarReturnYear: number; /** * Location the return chart was cast for. The Ascendant and house cusps change with this location, the basis of the relocated solar return technique. */ location: { /** * Latitude used for the return chart house cusps and Ascendant. */ latitude: number; /** * Longitude used for local sidereal time and the Midheaven. */ longitude: number; /** * Decimal timezone offset applied to the output datetime. */ timezone: number; }; /** * The natal Sun position whose annual return defines this chart. */ natalSunPosition: { /** * Natal Sun ecliptic longitude in degrees from 0 to 360 that the Sun returns to. */ longitude: number; /** * Tropical zodiac sign of the natal Sun. */ sign: string; /** * Degree within the sign from 0 to 29.999 that the Sun returns to. */ degree: number; }; /** * Full chart erected for the solar return moment: all bodies with house placements, the 12 house cusps, aspects, Part of Fortune, and Vertex in the tropical zodiac. */ chart: { /** * Birth details used to generate this chart. */ birthDetails: { /** * Birth date in YYYY-MM-DD format. Determines planetary positions for the specific calendar day. */ date: string; /** * Birth time in 24-hour HH:MM:SS format. Determines the Ascendant (rising sign) and house cusps. Use 12:00:00 if unknown. */ time: string; /** * Birth location latitude in decimal degrees (-90 to 90). Positive = North, negative = South. */ latitude: number; /** * Birth location longitude in decimal degrees (-180 to 180). Positive = East, negative = West. */ longitude: number; /** * Timezone offset from UTC in decimal hours. Examples: New York = -5, London = 0, India = 5.5, Tokyo = 9. */ timezone: number; }; /** * All 14 celestial bodies in the tropical zodiac with house placements: the 10 classical planets (Sun through Pluto), the lunar nodes (North Node, South Node, in the requested `nodeType` convention), Chiron, and Black Moon Lilith. */ planets: Array<{ /** * Body name. One of the 10 classical planets (Sun, Moon, Mercury, Venus, Mars, Jupiter, Saturn, Uranus, Neptune, Pluto), the lunar nodes (North Node, South Node), Chiron, or Black Moon Lilith (the mean lunar apogee). The lunar nodes follow the request nodeType, which defaults to the true (osculating) node; pass "mean" for the smoothed node. The two differ by up to about 1.8 degrees and no other body is affected. */ name: 'Sun' | 'Moon' | 'Mercury' | 'Venus' | 'Mars' | 'Jupiter' | 'Saturn' | 'Uranus' | 'Neptune' | 'Pluto' | 'North Node' | 'South Node' | 'Chiron' | 'Black Moon Lilith'; /** * Apparent geocentric tropical longitude on the true ecliptic of date, in degrees (0-360): light time and aberration applied, nutation included, the convention desktop chart software and the NASA JPL Horizons observer tables print, so it compares directly with either. Primary coordinate for zodiac sign and aspect calculations. */ longitude: number; /** * Apparent geocentric ecliptic latitude of date, in degrees. Near zero for most planets, varies for the Moon and Pluto, and reaches up to about 5 degrees for Black Moon Lilith (projected from the inclined mean lunar orbit). */ latitude: number; /** * Tropical zodiac sign this planet occupies. Determined by 30-degree divisions of ecliptic longitude. */ sign: string; /** * Degree within the zodiac sign (0-29.999). Indicates how far the planet has progressed through the sign. */ degree: number; /** * House placement (1-12). Determined by the selected house system and birth location. */ house: number; /** * Daily motion in degrees per day. Negative values indicate retrograde motion. */ speed: number; /** * Whether the planet appears to move backward from Earth perspective. Retrograde periods signal review and introspection. */ isRetrograde: boolean; }>; /** * All 12 house cusps calculated using the selected house system. */ houses: Array<{ /** * House number (1-12). Each house governs specific life themes in Western astrology. */ number: number; /** * Ecliptic longitude of this house cusp in degrees (0-360). */ longitude: number; /** * Zodiac sign on this house cusp. Colors the themes of this life area. */ sign: string; /** * Degree within the zodiac sign on this cusp (0-29.999). */ degree: number; }>; /** * House system used for this chart (placidus, whole-sign, equal, or koch). */ houseSystem: 'placidus' | 'whole-sign' | 'equal' | 'koch'; /** * All planetary aspects found in this chart with orbs, strength, and applying/separating status. */ aspects: Array<{ /** * First planet in the aspect pair. */ planet1: 'Sun' | 'Moon' | 'Mercury' | 'Venus' | 'Mars' | 'Jupiter' | 'Saturn' | 'Uranus' | 'Neptune' | 'Pluto' | 'North Node' | 'South Node' | 'Chiron' | 'Black Moon Lilith'; /** * Second planet in the aspect pair. */ planet2: 'Sun' | 'Moon' | 'Mercury' | 'Venus' | 'Mars' | 'Jupiter' | 'Saturn' | 'Uranus' | 'Neptune' | 'Pluto' | 'North Node' | 'South Node' | 'Chiron' | 'Black Moon Lilith'; /** * Aspect type. Major: conjunction (0), opposition (180), trine (120), square (90), sextile (60). Minor: semi-sextile, quincunx, semi-square, sesquiquadrate. */ type: 'CONJUNCTION' | 'OPPOSITION' | 'TRINE' | 'SQUARE' | 'SEXTILE' | 'SEMI_SEXTILE' | 'QUINCUNX' | 'SEMI_SQUARE' | 'SESQUIQUADRATE'; /** * Exact angular separation that defines this aspect type in degrees. */ angle: number; /** * Deviation from exact aspect in degrees. Tighter orb means stronger influence. */ orb: number; /** * Whether the aspect is applying (planets moving toward exact) or separating (moving apart). Applying aspects grow stronger. */ isApplying: boolean; /** * Aspect strength percentage (0-100). Based on orb tightness relative to the allowed maximum. */ strength: number; /** * Aspect nature. Harmonious (trine, sextile) flows easily. Challenging (square, opposition) creates tension and growth. Neutral (conjunction) blends energies. Always English, whatever the lang parameter says: it is an identifier consumers switch and style on. Use interpretationLocalized for anything a reader sees. */ interpretation: 'harmonious' | 'challenging' | 'neutral'; }>; /** * Part of Fortune (Lot of Fortune). A point derived from the Ascendant and the two luminaries that marks an area of ease, vitality, and material wellbeing in the chart. */ partOfFortune: { /** * Zodiac sign holding the Part of Fortune. */ sign: string; /** * Degree within the Part of Fortune sign (0-29.999). */ degree: number; /** * Absolute ecliptic longitude of the Part of Fortune (0-360). */ longitude: number; /** * House containing this point, resolved against the same cusps as `planets[].house` and using the requested house system. Read this field rather than inferring a house from the sign: the two disagree whenever a house spans more than one sign, which is most of the time outside Whole Sign. */ house: number; /** * Chart sect used for the calculation. Day (diurnal) when the Sun is above the horizon, night (nocturnal) when below. Day charts use Ascendant plus Moon minus Sun, night charts use Ascendant plus Sun minus Moon. */ sect: 'day' | 'night'; }; /** * Vertex. The western intersection of the prime vertical with the ecliptic, often read as a point of fated encounters and turning-point relationships. The opposite point is the Anti-Vertex. */ vertex: { /** * Zodiac sign holding the Vertex. */ sign: string; /** * Degree within the Vertex sign (0-29.999). */ degree: number; /** * Absolute ecliptic longitude of the Vertex (0-360). */ longitude: number; /** * House containing this point, resolved against the same cusps as `planets[].house` and using the requested house system. Read this field rather than inferring a house from the sign: the two disagree whenever a house spans more than one sign, which is most of the time outside Whole Sign. */ house: number; }; }; }; }; export type ForecastSolarReturnResponse = ForecastSolarReturnResponses[keyof ForecastSolarReturnResponses]; export type GenerateBodygraphData = { body?: { /** * Birth date in YYYY-MM-DD format. The anchor for both the Personality activations at birth and the Design activations 88 degrees of solar arc earlier. */ date: string; /** * Birth time in 24-hour HH:MM:SS format. Precision matters: the profile lines and gate boundaries shift with the exact minute of birth. */ time: string; /** * IANA name (e.g. "America/New_York", "Europe/London", "UTC"), decimal hours (e.g. -5 for EST, 1 for CET), or a fixed UTC offset (e.g. "-05:00", "+01:00"). Prefer the IANA name: it is resolved to the offset in force at the birth date and time, historical daylight-saving rules included, while a fixed offset or decimal is taken literally and will be wrong if it does not match the daylight-saving state at that moment. On a transition day a time in the repeated hour is read as its first occurrence and a time in the skipped hour is moved forward past the gap. Invalid timezones return 400 with a validation error. */ timezone: number | string; /** * Birth latitude in decimal degrees. Optional and does not affect the bodygraph, which depends only on ecliptic longitudes. Defaults to 0. */ latitude?: number; /** * Birth longitude in decimal degrees. Optional and does not affect the bodygraph. Defaults to 0. */ longitude?: number; /** * Lunar node convention. "mean" is the smoothed average node, which always moves retrograde; "true" is the osculating node, which tracks the real perturbed node, oscillates up to about 1.5 degrees either side of the mean on a 173-day cycle, and can briefly turn direct. Neither is more correct and they almost always fall in the same sign. Applies to the North and South Node activations. True is what professional Human Design software uses (HumanDesign.ai, Total Human Design) and is the value RoxyAPI verifies against, so leave it unset for a standard chart. It matters only when a node sits on a gate boundary, where the choice moves a node gate. Because a gate can be half of a channel, that can change the completed channels and, with them, whether a center reads defined or open, plus the definition, authority, profile or type. A chart where only one center disagrees is the usual shape, since the type and profile often survive unchanged. If another calculator disagrees on any of those, it is almost certainly using the mean node: pass "mean" to match it. Defaults to "true". */ nodeType?: 'mean' | 'true'; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/human-design/bodygraph'; }; export type GenerateBodygraphErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GenerateBodygraphError = GenerateBodygraphErrors[keyof GenerateBodygraphErrors]; export type GenerateBodygraphResponses = { /** * Complete bodygraph with type, authority, profile, centers, channels, and gates */ 200: { /** * Human Design energy type. One of Manifestor, Generator, Manifesting Generator, Projector, Reflector. Always English, whatever the lang parameter says, so it stays safe to compare against in code. Use typeLocalized for anything a reader sees. */ type: string; /** * Energy type name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ typeLocalized?: string; /** * What the aura of this type does and how it is designed to engage life. The grounding text for the type label, so a consuming agent does not have to supply the meaning itself. */ typeDescription: string; /** * The aura mechanic of the type: how the energy field itself operates, for example open and enveloping, or closed and repelling. */ aura: string; /** * The aura strategy for engaging life correctly for this type. Always English, whatever the lang parameter says. Use strategyLocalized for anything a reader sees. */ strategy: string; /** * Strategy name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ strategyLocalized?: string; /** * How to actually apply the strategy. The strategy field alone is a bare label such as Respond or Inform; this is the operating instruction behind it. */ strategyDescription: string; /** * Inner authority for decision making. One of Emotional, Sacral, Splenic, Ego, Self-Projected, Mental, Lunar. Always English, whatever the lang parameter says, so it stays safe to compare against in code. Use authorityLocalized for anything a reader sees. */ authority: string; /** * Inner authority name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ authorityLocalized?: string; /** * How the decision is made, the timing it requires, and the characteristic trap. Inner authority is the most actionable output of a Human Design chart, so this is the field to lean on when grounding a reading. */ authorityDescription: string; /** * The signature feeling of living in alignment with the type. Always English, whatever the lang parameter says. Use signatureLocalized for anything a reader sees. */ signature: string; /** * Signature theme name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ signatureLocalized?: string; /** * The not-self theme, the recurring feeling that signals being out of alignment. Always English, whatever the lang parameter says. Use notSelfLocalized for anything a reader sees. */ notSelf: string; /** * Not-self theme name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ notSelfLocalized?: string; /** * Profile in conscious/unconscious form from the Personality Sun line over the Design Sun line. */ profile: string; /** * The two line keynotes the profile is built from, conscious over unconscious, so the profile is readable without a separate lookup. */ profileKeynotes: { /** * Line number 1 to 6 of the conscious Personality Sun, the first digit of the profile. */ personalityLine: number; /** * Line number 1 to 6 of the unconscious Design Sun, the second digit of the profile. */ designLine: number; /** * Keynote of the conscious Personality line. The half of the life role the person is aware of and can speak to. */ personality: string; /** * Keynote of the unconscious Design line. The half of the life role others see operating in the body, which the person does not directly experience. */ design: string; }; /** * Meaning of the combined profile. A profile is not the sum of its two lines: 6/2 has its own meaning that neither the line 6 nor the line 2 keynote carries alone. */ profileDescription: string; /** * Definition type from the number of connected components among defined centers. One of None, Single, Split, Triple Split, Quadruple Split. Always English, whatever the lang parameter says, so it stays safe to compare against in code. Use definitionLocalized for anything a reader sees. */ definition: string; /** * Definition type name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ definitionLocalized?: string; /** * How energy flows through the defined centers in this configuration, and what the configuration needs. For a split, this is where the bridging gates of other people matter. */ definitionDescription: string; /** * What the two chart sides are: personality is the conscious mind side, design is the unconscious body side computed 88 degrees of solar arc before birth. Returned once at the top level rather than repeated across all 26 activations. */ sides: { [key: string]: string; }; /** * The Design moment as an ISO 8601 UTC instant: the exact time the Sun stood 88 degrees of solar arc before its natal longitude, and the instant every Design activation was computed at. Compare it with the Design date a reference tool prints to validate the chart on the moment itself. */ designInstantUtc: string; /** * The incarnation cross built from the four cardinal gates and the profile angle. */ incarnationCross: { /** * The four cardinal gates of the cross: Personality Sun, Personality Earth, Design Sun, Design Earth. */ gates: Array; /** * Cross angle. One of Right Angle, Juxtaposition, Left Angle. Always English, whatever the lang parameter says. Use angleLocalized for anything a reader sees. */ angle: string; /** * Cross angle name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ angleLocalized?: string; /** * Short code for the angle. One of RAX, JXT, LAX. */ angleCode: string; /** * Canonical published name of the incarnation cross, determined by the Personality Sun gate and the angle. All 192 crosses (64 Personality Sun gates times three angles) carry their published name, numbered variants included, so this is never a composed placeholder. Always begins with the angle followed by Cross of. Always English, whatever the lang parameter says. */ name: string; /** * The life theme of the cross, synthesized from its four gates and the orientation the angle gives them. The same Sun gate under a different angle is a genuinely different theme: Right Angle is personal destiny, Left Angle is worked out through other people, Juxtaposition is a fixed fate. */ description?: string; }; /** * All nine centers with their defined state and active gates. */ centers: Array<{ /** * Center identifier. One of head, ajna, throat, g, heart, sacral, solar-plexus, spleen, root. */ id: string; /** * Display name of the center. Always English, whatever the lang parameter says, so it stays safe to compare against in code. Use nameLocalized for anything a reader sees. */ name: string; /** * Center name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ nameLocalized?: string; /** * Whether the center is defined. A defined center is a consistent source of energy or awareness; an undefined center is open and conditioned by others. */ defined: boolean; /** * Whether this is a motor center (energy source). The four motors are Heart, Sacral, Solar Plexus, and Root. */ motor: boolean; /** * Whether this is an awareness center. The three awareness centers are Ajna, Solar Plexus, and Spleen. */ awareness: boolean; /** * Theme text describing the center in its current defined or undefined state. */ theme: string; /** * The conditioning trap of this center when it is open. Returned on every center so a consumer can surface it the moment `defined` is false, which is where the not-self operates. */ notSelfQuestion: string; /** * The gland, organ, or system this center corresponds to in the body. */ biology: string; /** * Active gate numbers that sit in this center. */ gates: Array; }>; /** * The defined channels where both gates are activated. */ channels: Array<{ /** * First gate of the channel. */ gateA: number; /** * Second gate of the channel. */ gateB: number; /** * Name of the defined channel. Always English, whatever the lang parameter says. Use nameLocalized for anything a reader sees. */ name: string; /** * Channel name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ nameLocalized?: string; /** * Circuit family of the channel. One of Individual, Collective, Tribal. Always English, whatever the lang parameter says. Use circuitLocalized for anything a reader sees. */ circuit: string; /** * Circuit family name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ circuitLocalized?: string; /** * The two centers this channel connects and defines. */ centers: Array; /** * What this channel wires between its two centers and the nature of the energy it carries. */ description: string; /** * What the circuit family of this channel governs. */ circuitDescription: string; }>; /** * All 26 activations, 13 Personality and 13 Design. */ gates: Array<{ /** * Activating body. One of Sun, Earth, Moon, North Node, South Node, Mercury, Venus, Mars, Jupiter, Saturn, Uranus, Neptune, Pluto. Always English, whatever the lang parameter says, so it stays safe to compare against in code and to key a glyph table on. Use planetLocalized for anything a reader sees. */ planet: string; /** * Activating body name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ planetLocalized?: string; /** * Chart side. personality is the conscious birth-moment activation, design is the unconscious activation 88 degrees of solar arc before birth. */ side: string; /** * Human Design gate number from 1 to 64 that this activation falls in. */ gate: number; /** * Line number from 1 to 6 within the gate, setting the line keynote and the profile. */ line: number; /** * Human Design keynote name of the gate, describing its bodygraph function. Always English, whatever the lang parameter says. Use gateNameLocalized for anything a reader sees. */ gateName: string; /** * Gate keynote name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ gateNameLocalized?: string; /** * Bodygraph function of the gate: what it does in the center it sits in and the channel it forms. This is NOT the meaning of the I-Ching hexagram that shares its number. They share a number, not a definition. */ gateDescription: string; /** * Meaning of this gate at this specific line, one of 384. The finest interpretive layer in the chart and the one that makes a reading specific rather than generic. This is not the six abstract line archetypes: gate 41 line 3 carries its own meaning that neither the gate keynote nor the line-3 archetype holds alone. */ lineMeaning: string; /** * What this planetary activation contributes in Human Design specifically, which is not its meaning in western astrology. */ planetDescription: string; /** * Cross-reference to the I-Ching hexagram that shares this gate number. */ ichingHexagram: { /** * I-Ching hexagram number, identical to the gate number it corresponds to. */ number: number; /** * English name of the corresponding I-Ching hexagram. */ english: string; }; }>; }; }; export type GenerateBodygraphResponse = GenerateBodygraphResponses[keyof GenerateBodygraphResponses]; export type CalculateConnectionData = { body?: { /** * Birth moment of the first person in the connection. */ personA: { /** * Birth date in YYYY-MM-DD format. The anchor for both the Personality activations at birth and the Design activations 88 degrees of solar arc earlier. */ date: string; /** * Birth time in 24-hour HH:MM:SS format. Precision matters: the profile lines and gate boundaries shift with the exact minute of birth. */ time: string; /** * IANA name (e.g. "America/New_York", "Europe/London", "UTC"), decimal hours (e.g. -5 for EST, 1 for CET), or a fixed UTC offset (e.g. "-05:00", "+01:00"). Prefer the IANA name: it is resolved to the offset in force at the birth date and time, historical daylight-saving rules included, while a fixed offset or decimal is taken literally and will be wrong if it does not match the daylight-saving state at that moment. On a transition day a time in the repeated hour is read as its first occurrence and a time in the skipped hour is moved forward past the gap. Invalid timezones return 400 with a validation error. */ timezone: number | string; /** * Birth latitude in decimal degrees. Optional and does not affect the bodygraph, which depends only on ecliptic longitudes. Defaults to 0. */ latitude?: number; /** * Birth longitude in decimal degrees. Optional and does not affect the bodygraph. Defaults to 0. */ longitude?: number; /** * Lunar node convention. "mean" is the smoothed average node, which always moves retrograde; "true" is the osculating node, which tracks the real perturbed node, oscillates up to about 1.5 degrees either side of the mean on a 173-day cycle, and can briefly turn direct. Neither is more correct and they almost always fall in the same sign. Applies to the North and South Node activations. True is what professional Human Design software uses (HumanDesign.ai, Total Human Design) and is the value RoxyAPI verifies against, so leave it unset for a standard chart. It matters only when a node sits on a gate boundary, where the choice moves a node gate. Because a gate can be half of a channel, that can change the completed channels and, with them, whether a center reads defined or open, plus the definition, authority, profile or type. A chart where only one center disagrees is the usual shape, since the type and profile often survive unchanged. If another calculator disagrees on any of those, it is almost certainly using the mean node: pass "mean" to match it. Defaults to "true". */ nodeType?: 'mean' | 'true'; }; /** * Birth moment of the second person in the connection. */ personB: { /** * Birth date in YYYY-MM-DD format. The anchor for both the Personality activations at birth and the Design activations 88 degrees of solar arc earlier. */ date: string; /** * Birth time in 24-hour HH:MM:SS format. Precision matters: the profile lines and gate boundaries shift with the exact minute of birth. */ time: string; /** * IANA name (e.g. "America/New_York", "Europe/London", "UTC"), decimal hours (e.g. -5 for EST, 1 for CET), or a fixed UTC offset (e.g. "-05:00", "+01:00"). Prefer the IANA name: it is resolved to the offset in force at the birth date and time, historical daylight-saving rules included, while a fixed offset or decimal is taken literally and will be wrong if it does not match the daylight-saving state at that moment. On a transition day a time in the repeated hour is read as its first occurrence and a time in the skipped hour is moved forward past the gap. Invalid timezones return 400 with a validation error. */ timezone: number | string; /** * Birth latitude in decimal degrees. Optional and does not affect the bodygraph, which depends only on ecliptic longitudes. Defaults to 0. */ latitude?: number; /** * Birth longitude in decimal degrees. Optional and does not affect the bodygraph. Defaults to 0. */ longitude?: number; /** * Lunar node convention. "mean" is the smoothed average node, which always moves retrograde; "true" is the osculating node, which tracks the real perturbed node, oscillates up to about 1.5 degrees either side of the mean on a 173-day cycle, and can briefly turn direct. Neither is more correct and they almost always fall in the same sign. Applies to the North and South Node activations. True is what professional Human Design software uses (HumanDesign.ai, Total Human Design) and is the value RoxyAPI verifies against, so leave it unset for a standard chart. It matters only when a node sits on a gate boundary, where the choice moves a node gate. Because a gate can be half of a channel, that can change the completed channels and, with them, whether a center reads defined or open, plus the definition, authority, profile or type. A chart where only one center disagrees is the usual shape, since the type and profile often survive unchanged. If another calculator disagrees on any of those, it is almost certainly using the mean node: pass "mean" to match it. Defaults to "true". */ nodeType?: 'mean' | 'true'; }; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/human-design/connection'; }; export type CalculateConnectionErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type CalculateConnectionError = CalculateConnectionErrors[keyof CalculateConnectionErrors]; export type CalculateConnectionResponses = { /** * Connection chart with per-channel dynamics, combined centers, definition, and a dynamic count */ 200: { /** * Total number of connected channels between the two people. Equals the length of channels and the sum of the summary counts. */ totalChannels: number; /** * Every connected channel between the two people with its dynamic. A channel is connected when the two people together hold both of its gates. */ channels: Array<{ /** * First gate of the channel. */ gateA: number; /** * Second gate of the channel. */ gateB: number; /** * Name of the channel whose connection dynamic is reported. Always English, whatever the lang parameter says. Use nameLocalized for anything a reader sees. */ name: string; /** * Channel name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ nameLocalized?: string; /** * Circuit family of the channel. One of Individual, Collective, Tribal. Always English, whatever the lang parameter says. Use circuitLocalized for anything a reader sees. */ circuit: string; /** * Circuit family name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ circuitLocalized?: string; /** * The two centers this channel connects in the bodygraph. */ centers: Array; /** * Connection dynamic for this channel. Electromagnetic means each person holds one of the two gates and the channel completes only together, the classic point of attraction. Dominance means one person holds both gates and the other holds neither, a one-way conditioning. Compromise means one person holds both gates and the other holds a single hanging gate. Companionship means both people independently hold both gates, a shared and familiar frequency. Always English, whatever the lang parameter says, so it stays safe to compare against in code. Use dynamicLocalized for anything a reader sees. */ dynamic: string; /** * Connection dynamic name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ dynamicLocalized?: string; /** * Which of the channel two gates person A holds, from one to both. */ personAGates: Array; /** * Which of the channel two gates person B holds, from one to both. */ personBGates: Array; }>; /** * All nine centers with their defined state in the combined connection bodygraph and which person defines each. */ centers: Array<{ /** * Center identifier. One of head, ajna, throat, g, heart, sacral, solar-plexus, spleen, root. */ id: string; /** * Display name of the center. Always English, whatever the lang parameter says. Use nameLocalized for anything a reader sees. */ name: string; /** * Center name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ nameLocalized?: string; /** * Whether the center is defined in the combined connection bodygraph, where a channel counts as defined when the two people together hold both of its gates. */ defined: boolean; /** * Who defines this center in their own chart. A, B, both, or empty when the center is open in both individual charts. */ definedBy: Array; }>; /** * Definition of the combined connection bodygraph from connected components among its defined centers. One of None, Single, Split, Triple Split, Quadruple Split. Always English, whatever the lang parameter says, so it stays safe to compare against in code. Use combinedDefinitionLocalized for anything a reader sees. */ combinedDefinition: string; /** * Combined definition name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ combinedDefinitionLocalized?: string; /** * Count of each connection dynamic across all connected channels. */ summary: { /** * Count of electromagnetic channels, the points of mutual attraction. */ electromagnetic: number; /** * Count of dominance channels, where one person conditions the other one way. */ dominance: number; /** * Count of compromise channels, a full channel meeting a single hanging gate. */ compromise: number; /** * Count of companionship channels, where both people share the whole channel. */ companionship: number; }; }; }; export type CalculateConnectionResponse = CalculateConnectionResponses[keyof CalculateConnectionResponses]; export type CalculatePentaData = { body?: { /** * Birth moments of the three to five people in the group. Below three no Penta forms; above five a second Penta emerges. */ members: Array<{ /** * Birth date in YYYY-MM-DD format. The anchor for both the Personality activations at birth and the Design activations 88 degrees of solar arc earlier. */ date: string; /** * Birth time in 24-hour HH:MM:SS format. Precision matters: the profile lines and gate boundaries shift with the exact minute of birth. */ time: string; /** * IANA name (e.g. "America/New_York", "Europe/London", "UTC"), decimal hours (e.g. -5 for EST, 1 for CET), or a fixed UTC offset (e.g. "-05:00", "+01:00"). Prefer the IANA name: it is resolved to the offset in force at the birth date and time, historical daylight-saving rules included, while a fixed offset or decimal is taken literally and will be wrong if it does not match the daylight-saving state at that moment. On a transition day a time in the repeated hour is read as its first occurrence and a time in the skipped hour is moved forward past the gap. Invalid timezones return 400 with a validation error. */ timezone: number | string; /** * Birth latitude in decimal degrees. Optional and does not affect the bodygraph, which depends only on ecliptic longitudes. Defaults to 0. */ latitude?: number; /** * Birth longitude in decimal degrees. Optional and does not affect the bodygraph. Defaults to 0. */ longitude?: number; /** * Lunar node convention. "mean" is the smoothed average node, which always moves retrograde; "true" is the osculating node, which tracks the real perturbed node, oscillates up to about 1.5 degrees either side of the mean on a 173-day cycle, and can briefly turn direct. Neither is more correct and they almost always fall in the same sign. Applies to the North and South Node activations. True is what professional Human Design software uses (HumanDesign.ai, Total Human Design) and is the value RoxyAPI verifies against, so leave it unset for a standard chart. It matters only when a node sits on a gate boundary, where the choice moves a node gate. Because a gate can be half of a channel, that can change the completed channels and, with them, whether a center reads defined or open, plus the definition, authority, profile or type. A chart where only one center disagrees is the usual shape, since the type and profile often survive unchanged. If another calculator disagrees on any of those, it is almost certainly using the mean node: pass "mean" to match it. Defaults to "true". */ nodeType?: 'mean' | 'true'; }>; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/human-design/penta'; }; export type CalculatePentaErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type CalculatePentaError = CalculatePentaErrors[keyof CalculatePentaErrors]; export type CalculatePentaResponses = { /** * Penta chart with per-channel Strengths, per-gate fill state, and a group summary */ 200: { /** * Number of people in the group, always between 3 and 5. */ memberCount: number; /** * The six channels of the Penta with their defined Strength state and which members supply each gate. Three upper channels run G to Throat (The Alpha, Inspiration, The Prodigal); three lower channels run G to Sacral (Rhythm, The Beat, Discovery). */ channels: Array<{ /** * First gate of the Penta channel. */ gateA: number; /** * Second gate of the Penta channel. */ gateB: number; /** * Name of the Penta channel. One of The Alpha, Inspiration, The Prodigal, Rhythm, The Beat, Discovery. Always English, whatever the lang parameter says. Use nameLocalized for anything a reader sees. */ name: string; /** * Penta channel name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ nameLocalized?: string; /** * Circuit family of the channel. One of Individual, Collective, Tribal. Always English, whatever the lang parameter says. Use circuitLocalized for anything a reader sees. */ circuit: string; /** * Circuit family name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ circuitLocalized?: string; /** * Position of the channel in the Penta. upper channels run from the G Center to the Throat and carry the leadership and how-the-group-presents roles. lower channels run from the G Center to the Sacral and carry the managed, generative, resource roles. */ position: string; /** * Whether this is the 2/14 Channel of the Beat, the material core of the Penta vortex: gate 2 the direction for resources, gate 14 the resources themselves. */ isCore: boolean; /** * Whether the channel is a defined Strength: both of its gates are present somewhere in the group, so the function it governs has no gap. */ defined: boolean; /** * Zero-based indices of the members whose chart holds gate A, in member order. */ gateAHeldBy: Array; /** * Zero-based indices of the members whose chart holds gate B, in member order. */ gateBHeldBy: Array; }>; /** * The twelve Penta gates with their filled state and which members hold each. */ gates: Array<{ /** * Penta gate number. One of 1, 2, 5, 7, 8, 13, 14, 15, 29, 31, 33, 46. */ gate: number; /** * Human Design keynote name of the gate, describing the role it brings to the group. Always English, whatever the lang parameter says. Use gateNameLocalized for anything a reader sees. */ gateName: string; /** * Gate keynote name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ gateNameLocalized?: string; /** * Whether at least one member holds this gate. A gate held by nobody is a gap that conditions the group to compensate for the missing role. */ filled: boolean; /** * Zero-based indices of the members whose chart holds this gate. Empty when the gate is a gap. */ heldBy: Array; }>; /** * Group-level rollup of the Penta channels and gates. */ summary: { /** * Count of the six Penta channels that are defined Strengths in the group. */ definedChannels: number; /** * Count of the twelve Penta gates filled by at least one member. */ filledGates: number; /** * Penta gates held by no member. A non-empty list flags the functional gaps in the group. */ gapGates: Array; /** * Whether the 2/14 Channel of the Beat, the material core of the Penta, is defined across the group. */ coreDefined: boolean; }; }; }; export type CalculatePentaResponse = CalculatePentaResponses[keyof CalculatePentaResponses]; export type GenerateTransitData = { body?: { /** * Birth moment whose natal bodygraph the transit is overlaid on. */ birthData: { /** * Birth date in YYYY-MM-DD format. The anchor for both the Personality activations at birth and the Design activations 88 degrees of solar arc earlier. */ date: string; /** * Birth time in 24-hour HH:MM:SS format. Precision matters: the profile lines and gate boundaries shift with the exact minute of birth. */ time: string; /** * IANA name (e.g. "America/New_York", "Europe/London", "UTC"), decimal hours (e.g. -5 for EST, 1 for CET), or a fixed UTC offset (e.g. "-05:00", "+01:00"). Prefer the IANA name: it is resolved to the offset in force at the birth date and time, historical daylight-saving rules included, while a fixed offset or decimal is taken literally and will be wrong if it does not match the daylight-saving state at that moment. On a transition day a time in the repeated hour is read as its first occurrence and a time in the skipped hour is moved forward past the gap. Invalid timezones return 400 with a validation error. */ timezone: number | string; /** * Birth latitude in decimal degrees. Optional and does not affect the bodygraph, which depends only on ecliptic longitudes. Defaults to 0. */ latitude?: number; /** * Birth longitude in decimal degrees. Optional and does not affect the bodygraph. Defaults to 0. */ longitude?: number; /** * Lunar node convention. "mean" is the smoothed average node, which always moves retrograde; "true" is the osculating node, which tracks the real perturbed node, oscillates up to about 1.5 degrees either side of the mean on a 173-day cycle, and can briefly turn direct. Neither is more correct and they almost always fall in the same sign. Applies to the North and South Node activations. True is what professional Human Design software uses (HumanDesign.ai, Total Human Design) and is the value RoxyAPI verifies against, so leave it unset for a standard chart. It matters only when a node sits on a gate boundary, where the choice moves a node gate. Because a gate can be half of a channel, that can change the completed channels and, with them, whether a center reads defined or open, plus the definition, authority, profile or type. A chart where only one center disagrees is the usual shape, since the type and profile often survive unchanged. If another calculator disagrees on any of those, it is almost certainly using the mean node: pass "mean" to match it. Defaults to "true". */ nodeType?: 'mean' | 'true'; }; /** * Transit date in YYYY-MM-DD UTC. Optional. Defaults to today in UTC when omitted, giving the just-now transit. */ date?: string; /** * Transit time in HH:MM:SS UTC. Optional. Defaults to the current UTC time when omitted. Precision matters: the Moon moves through a gate in roughly half a day. */ time?: string; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/human-design/transit'; }; export type GenerateTransitErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GenerateTransitError = GenerateTransitErrors[keyof GenerateTransitErrors]; export type GenerateTransitResponses = { /** * Transit overlay with transiting activations, completed channels, temporary centers, and a summary */ 200: { /** * Date the transit overlay was computed for, in YYYY-MM-DD UTC. */ date: string; /** * Time the transit overlay was computed for, in HH:MM:SS UTC. */ time: string; /** * UTC offset of the transit moment. Always 0, since the transit is computed in UTC. */ timezone: number; /** * The 13 transiting bodies at this moment with the gate and line each currently activates. A transit is a single instant, so there is no Design side, only current positions. */ activations: Array<{ /** * Transiting body whose current position lands on this gate. One of Sun, Earth, Moon, North Node, South Node, Mercury, Venus, Mars, Jupiter, Saturn, Uranus, Neptune, Pluto. Always English, whatever the lang parameter says, so it stays safe to compare against in code and to key a glyph table on. Use bodyLocalized for anything a reader sees. */ body: string; /** * Transiting body name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ bodyLocalized?: string; /** * Human Design gate number from 1 to 64 this transiting body currently sits in. */ gate: number; /** * Line number from 1 to 6 within the gate, setting the line keynote of the transit. */ line: number; /** * Human Design keynote name of the gate the transiting body activates. Always English, whatever the lang parameter says. Use gateNameLocalized for anything a reader sees. */ gateName: string; /** * Gate keynote name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ gateNameLocalized?: string; /** * Cross-reference to the I-Ching hexagram that shares this gate number. */ ichingHexagram: { /** * I-Ching hexagram number, identical to the gate number it corresponds to. */ number: number; /** * English name of the corresponding I-Ching hexagram. */ english: string; }; }>; /** * Channels the transit temporarily completes that the natal chart did not already define, each labelled personal or educational with the side that supplied each gate. */ completedChannels: Array<{ /** * First gate of the completed channel. */ gateA: number; /** * Second gate of the completed channel. */ gateB: number; /** * Name of the channel the transit temporarily completes. Always English, whatever the lang parameter says. Use nameLocalized for anything a reader sees. */ name: string; /** * Channel name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ nameLocalized?: string; /** * Circuit family of the channel. One of Individual, Collective, Tribal. Always English, whatever the lang parameter says. Use circuitLocalized for anything a reader sees. */ circuit: string; /** * Circuit family name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ circuitLocalized?: string; /** * The two centers this channel connects and temporarily defines. */ centers: Array; /** * How the transit completes the channel. personal means the natal chart already holds one gate and the transit supplies the other, the classic electromagnetic completion. educational means both gates are open in the natal chart and the transit supplies both at once. Always English, whatever the lang parameter says, so it stays safe to compare against in code. Use kindLocalized for anything a reader sees. */ kind: string; /** * Completion kind name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ kindLocalized?: string; /** * Gate or gates of this channel the natal chart already holds. Empty for an educational channel. */ natalGates: Array; /** * Gate or gates of this channel supplied by the transit. One gate for a personal channel, both gates for an educational channel. */ transitGates: Array; }>; /** * Centers that are open in the natal chart and temporarily defined by a transit-completed channel. */ temporaryCenters: Array<{ /** * Center identifier. One of head, ajna, throat, g, heart, sacral, solar-plexus, spleen, root. */ id: string; /** * Display name of the center. Always English, whatever the lang parameter says. Use nameLocalized for anything a reader sees. */ name: string; /** * Center name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ nameLocalized?: string; /** * Always true. The center is open in the natal chart and temporarily defined by a transit-completed channel for the duration of the transit. */ temporarilyDefined: boolean; }>; /** * Short factual summary of the overlay with channel and center counts only. */ summary: string; }; }; export type GenerateTransitResponse = GenerateTransitResponses[keyof GenerateTransitResponses]; export type CalculateTypeData = { body?: { /** * Birth date in YYYY-MM-DD format. The anchor for both the Personality activations at birth and the Design activations 88 degrees of solar arc earlier. */ date: string; /** * Birth time in 24-hour HH:MM:SS format. Precision matters: the profile lines and gate boundaries shift with the exact minute of birth. */ time: string; /** * IANA name (e.g. "America/New_York", "Europe/London", "UTC"), decimal hours (e.g. -5 for EST, 1 for CET), or a fixed UTC offset (e.g. "-05:00", "+01:00"). Prefer the IANA name: it is resolved to the offset in force at the birth date and time, historical daylight-saving rules included, while a fixed offset or decimal is taken literally and will be wrong if it does not match the daylight-saving state at that moment. On a transition day a time in the repeated hour is read as its first occurrence and a time in the skipped hour is moved forward past the gap. Invalid timezones return 400 with a validation error. */ timezone: number | string; /** * Birth latitude in decimal degrees. Optional and does not affect the bodygraph, which depends only on ecliptic longitudes. Defaults to 0. */ latitude?: number; /** * Birth longitude in decimal degrees. Optional and does not affect the bodygraph. Defaults to 0. */ longitude?: number; /** * Lunar node convention. "mean" is the smoothed average node, which always moves retrograde; "true" is the osculating node, which tracks the real perturbed node, oscillates up to about 1.5 degrees either side of the mean on a 173-day cycle, and can briefly turn direct. Neither is more correct and they almost always fall in the same sign. Applies to the North and South Node activations. True is what professional Human Design software uses (HumanDesign.ai, Total Human Design) and is the value RoxyAPI verifies against, so leave it unset for a standard chart. It matters only when a node sits on a gate boundary, where the choice moves a node gate. Because a gate can be half of a channel, that can change the completed channels and, with them, whether a center reads defined or open, plus the definition, authority, profile or type. A chart where only one center disagrees is the usual shape, since the type and profile often survive unchanged. If another calculator disagrees on any of those, it is almost certainly using the mean node: pass "mean" to match it. Defaults to "true". */ nodeType?: 'mean' | 'true'; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/human-design/type'; }; export type CalculateTypeErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type CalculateTypeError = CalculateTypeErrors[keyof CalculateTypeErrors]; export type CalculateTypeResponses = { /** * Type, strategy, authority, signature, not-self theme, and profile */ 200: { /** * Human Design energy type. One of Manifestor, Generator, Manifesting Generator, Projector, Reflector. Always English, whatever the lang parameter says, so it stays safe to compare against in code. Use typeLocalized for anything a reader sees. */ type: string; /** * Energy type name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ typeLocalized?: string; /** * What the aura of this type does and how it is designed to engage life. The grounding text for the type label, so a consuming agent does not have to supply the meaning itself. */ typeDescription: string; /** * The aura mechanic of the type: how the energy field itself operates, for example open and enveloping, or closed and repelling. */ aura: string; /** * The aura strategy for engaging life correctly for this type. Always English, whatever the lang parameter says. Use strategyLocalized for anything a reader sees. */ strategy: string; /** * Strategy name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ strategyLocalized?: string; /** * How to actually apply the strategy. The strategy field alone is a bare label such as Respond or Inform; this is the operating instruction behind it. */ strategyDescription: string; /** * Inner authority for decision making. One of Emotional, Sacral, Splenic, Ego, Self-Projected, Mental, Lunar. Always English, whatever the lang parameter says, so it stays safe to compare against in code. Use authorityLocalized for anything a reader sees. */ authority: string; /** * Inner authority name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ authorityLocalized?: string; /** * How the decision is made, the timing it requires, and the characteristic trap. Inner authority is the most actionable output of a Human Design chart. */ authorityDescription: string; /** * The signature feeling of living in alignment. Always English, whatever the lang parameter says. Use signatureLocalized for anything a reader sees. */ signature: string; /** * Signature theme name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ signatureLocalized?: string; /** * The not-self theme that signals being out of alignment. Always English, whatever the lang parameter says. Use notSelfLocalized for anything a reader sees. */ notSelf: string; /** * Not-self theme name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ notSelfLocalized?: string; /** * Profile from the Personality Sun line over the Design Sun line. */ profile: string; }; }; export type CalculateTypeResponse = CalculateTypeResponses[keyof CalculateTypeResponses]; export type CalculateGatesData = { body?: { /** * Birth date in YYYY-MM-DD format. The anchor for both the Personality activations at birth and the Design activations 88 degrees of solar arc earlier. */ date: string; /** * Birth time in 24-hour HH:MM:SS format. Precision matters: the profile lines and gate boundaries shift with the exact minute of birth. */ time: string; /** * IANA name (e.g. "America/New_York", "Europe/London", "UTC"), decimal hours (e.g. -5 for EST, 1 for CET), or a fixed UTC offset (e.g. "-05:00", "+01:00"). Prefer the IANA name: it is resolved to the offset in force at the birth date and time, historical daylight-saving rules included, while a fixed offset or decimal is taken literally and will be wrong if it does not match the daylight-saving state at that moment. On a transition day a time in the repeated hour is read as its first occurrence and a time in the skipped hour is moved forward past the gap. Invalid timezones return 400 with a validation error. */ timezone: number | string; /** * Birth latitude in decimal degrees. Optional and does not affect the bodygraph, which depends only on ecliptic longitudes. Defaults to 0. */ latitude?: number; /** * Birth longitude in decimal degrees. Optional and does not affect the bodygraph. Defaults to 0. */ longitude?: number; /** * Lunar node convention. "mean" is the smoothed average node, which always moves retrograde; "true" is the osculating node, which tracks the real perturbed node, oscillates up to about 1.5 degrees either side of the mean on a 173-day cycle, and can briefly turn direct. Neither is more correct and they almost always fall in the same sign. Applies to the North and South Node activations. True is what professional Human Design software uses (HumanDesign.ai, Total Human Design) and is the value RoxyAPI verifies against, so leave it unset for a standard chart. It matters only when a node sits on a gate boundary, where the choice moves a node gate. Because a gate can be half of a channel, that can change the completed channels and, with them, whether a center reads defined or open, plus the definition, authority, profile or type. A chart where only one center disagrees is the usual shape, since the type and profile often survive unchanged. If another calculator disagrees on any of those, it is almost certainly using the mean node: pass "mean" to match it. Defaults to "true". */ nodeType?: 'mean' | 'true'; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/human-design/gates'; }; export type CalculateGatesErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type CalculateGatesError = CalculateGatesErrors[keyof CalculateGatesErrors]; export type CalculateGatesResponses = { /** * Personality and Design activation lists, 13 each */ 200: { /** * The 13 conscious Personality activations computed at the exact birth moment, in black on a standard chart. */ personality: Array<{ /** * Activating body. One of Sun, Earth, Moon, North Node, South Node, Mercury, Venus, Mars, Jupiter, Saturn, Uranus, Neptune, Pluto. Always English, whatever the lang parameter says, so it stays safe to compare against in code and to key a glyph table on. Use planetLocalized for anything a reader sees. */ planet: string; /** * Activating body name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ planetLocalized?: string; /** * Chart side. personality is the conscious birth-moment activation, design is the unconscious activation 88 degrees of solar arc before birth. */ side: string; /** * Human Design gate number from 1 to 64 that this activation falls in. */ gate: number; /** * Line number from 1 to 6 within the gate, setting the line keynote and the profile. */ line: number; /** * Human Design keynote name of the gate, describing its bodygraph function. Always English, whatever the lang parameter says. Use gateNameLocalized for anything a reader sees. */ gateName: string; /** * Gate keynote name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ gateNameLocalized?: string; /** * Bodygraph function of the gate: what it does in the center it sits in and the channel it forms. This is NOT the meaning of the I-Ching hexagram that shares its number. They share a number, not a definition. */ gateDescription: string; /** * Meaning of this gate at this specific line, one of 384. The finest interpretive layer in the chart and the one that makes a reading specific rather than generic. This is not the six abstract line archetypes: gate 41 line 3 carries its own meaning that neither the gate keynote nor the line-3 archetype holds alone. */ lineMeaning: string; /** * What this planetary activation contributes in Human Design specifically, which is not its meaning in western astrology. */ planetDescription: string; /** * Cross-reference to the I-Ching hexagram that shares this gate number. */ ichingHexagram: { /** * I-Ching hexagram number, identical to the gate number it corresponds to. */ number: number; /** * English name of the corresponding I-Ching hexagram. */ english: string; }; }>; /** * The 13 unconscious Design activations computed 88 degrees of solar arc before birth, in red on a standard chart. */ design: Array<{ /** * Activating body. One of Sun, Earth, Moon, North Node, South Node, Mercury, Venus, Mars, Jupiter, Saturn, Uranus, Neptune, Pluto. Always English, whatever the lang parameter says, so it stays safe to compare against in code and to key a glyph table on. Use planetLocalized for anything a reader sees. */ planet: string; /** * Activating body name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ planetLocalized?: string; /** * Chart side. personality is the conscious birth-moment activation, design is the unconscious activation 88 degrees of solar arc before birth. */ side: string; /** * Human Design gate number from 1 to 64 that this activation falls in. */ gate: number; /** * Line number from 1 to 6 within the gate, setting the line keynote and the profile. */ line: number; /** * Human Design keynote name of the gate, describing its bodygraph function. Always English, whatever the lang parameter says. Use gateNameLocalized for anything a reader sees. */ gateName: string; /** * Gate keynote name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ gateNameLocalized?: string; /** * Bodygraph function of the gate: what it does in the center it sits in and the channel it forms. This is NOT the meaning of the I-Ching hexagram that shares its number. They share a number, not a definition. */ gateDescription: string; /** * Meaning of this gate at this specific line, one of 384. The finest interpretive layer in the chart and the one that makes a reading specific rather than generic. This is not the six abstract line archetypes: gate 41 line 3 carries its own meaning that neither the gate keynote nor the line-3 archetype holds alone. */ lineMeaning: string; /** * What this planetary activation contributes in Human Design specifically, which is not its meaning in western astrology. */ planetDescription: string; /** * Cross-reference to the I-Ching hexagram that shares this gate number. */ ichingHexagram: { /** * I-Ching hexagram number, identical to the gate number it corresponds to. */ number: number; /** * English name of the corresponding I-Ching hexagram. */ english: string; }; }>; }; }; export type CalculateGatesResponse = CalculateGatesResponses[keyof CalculateGatesResponses]; export type GetGateData = { body?: never; path: { /** * Gate number from 1 to 64. */ number: number; }; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/human-design/gates/{number}'; }; export type GetGateErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetGateError = GetGateErrors[keyof GetGateErrors]; export type GetGateResponses = { /** * Gate reference data with center, hexagram, and channel partners */ 200: { /** * Gate number from 1 to 64. */ number: number; /** * Human Design keynote name of the gate. Always English, whatever the lang parameter says. Use nameLocalized for anything a reader sees. */ name: string; /** * Gate keynote name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ nameLocalized?: string; /** * Center the gate sits in. */ center: string; /** * Display name of the center. Always English, whatever the lang parameter says. Use centerNameLocalized for anything a reader sees. */ centerName: string; /** * Center name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ centerNameLocalized?: string; /** * The I-Ching hexagram that shares this gate number. */ ichingHexagram: { /** * I-Ching hexagram number. */ number: number; /** * Hexagram name. */ english: string; }; /** * Gates that form a channel with this gate, with the channel name for each. */ channelPartners: Array<{ /** * Partner gate number. */ gate: number; /** * Name of the shared channel. Always English, whatever the lang parameter says. Use channelLocalized for anything a reader sees. */ channel: string; /** * Channel name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ channelLocalized?: string; }>; }; }; export type GetGateResponse = GetGateResponses[keyof GetGateResponses]; export type CalculateChannelsData = { body?: { /** * Birth date in YYYY-MM-DD format. The anchor for both the Personality activations at birth and the Design activations 88 degrees of solar arc earlier. */ date: string; /** * Birth time in 24-hour HH:MM:SS format. Precision matters: the profile lines and gate boundaries shift with the exact minute of birth. */ time: string; /** * IANA name (e.g. "America/New_York", "Europe/London", "UTC"), decimal hours (e.g. -5 for EST, 1 for CET), or a fixed UTC offset (e.g. "-05:00", "+01:00"). Prefer the IANA name: it is resolved to the offset in force at the birth date and time, historical daylight-saving rules included, while a fixed offset or decimal is taken literally and will be wrong if it does not match the daylight-saving state at that moment. On a transition day a time in the repeated hour is read as its first occurrence and a time in the skipped hour is moved forward past the gap. Invalid timezones return 400 with a validation error. */ timezone: number | string; /** * Birth latitude in decimal degrees. Optional and does not affect the bodygraph, which depends only on ecliptic longitudes. Defaults to 0. */ latitude?: number; /** * Birth longitude in decimal degrees. Optional and does not affect the bodygraph. Defaults to 0. */ longitude?: number; /** * Lunar node convention. "mean" is the smoothed average node, which always moves retrograde; "true" is the osculating node, which tracks the real perturbed node, oscillates up to about 1.5 degrees either side of the mean on a 173-day cycle, and can briefly turn direct. Neither is more correct and they almost always fall in the same sign. Applies to the North and South Node activations. True is what professional Human Design software uses (HumanDesign.ai, Total Human Design) and is the value RoxyAPI verifies against, so leave it unset for a standard chart. It matters only when a node sits on a gate boundary, where the choice moves a node gate. Because a gate can be half of a channel, that can change the completed channels and, with them, whether a center reads defined or open, plus the definition, authority, profile or type. A chart where only one center disagrees is the usual shape, since the type and profile often survive unchanged. If another calculator disagrees on any of those, it is almost certainly using the mean node: pass "mean" to match it. Defaults to "true". */ nodeType?: 'mean' | 'true'; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/human-design/channels'; }; export type CalculateChannelsErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type CalculateChannelsError = CalculateChannelsErrors[keyof CalculateChannelsErrors]; export type CalculateChannelsResponses = { /** * Defined channels with circuits and the centers they define */ 200: { /** * The defined channels, where both gates are activated. */ channels: Array<{ /** * First gate of the channel. */ gateA: number; /** * Second gate of the channel. */ gateB: number; /** * Name of the defined channel. Always English, whatever the lang parameter says. Use nameLocalized for anything a reader sees. */ name: string; /** * Channel name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ nameLocalized?: string; /** * Circuit family of the channel. One of Individual, Collective, Tribal. Always English, whatever the lang parameter says. Use circuitLocalized for anything a reader sees. */ circuit: string; /** * Circuit family name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ circuitLocalized?: string; /** * The two centers this channel connects and defines. */ centers: Array; /** * What this channel wires between its two centers and the nature of the energy it carries. */ description: string; /** * What the circuit family of this channel governs. */ circuitDescription: string; }>; /** * Number of defined channels in the bodygraph. */ total: number; /** * The centers defined by these channels. */ definedCenters: Array; }; }; export type CalculateChannelsResponse = CalculateChannelsResponses[keyof CalculateChannelsResponses]; export type CalculateCentersData = { body?: { /** * Birth date in YYYY-MM-DD format. The anchor for both the Personality activations at birth and the Design activations 88 degrees of solar arc earlier. */ date: string; /** * Birth time in 24-hour HH:MM:SS format. Precision matters: the profile lines and gate boundaries shift with the exact minute of birth. */ time: string; /** * IANA name (e.g. "America/New_York", "Europe/London", "UTC"), decimal hours (e.g. -5 for EST, 1 for CET), or a fixed UTC offset (e.g. "-05:00", "+01:00"). Prefer the IANA name: it is resolved to the offset in force at the birth date and time, historical daylight-saving rules included, while a fixed offset or decimal is taken literally and will be wrong if it does not match the daylight-saving state at that moment. On a transition day a time in the repeated hour is read as its first occurrence and a time in the skipped hour is moved forward past the gap. Invalid timezones return 400 with a validation error. */ timezone: number | string; /** * Birth latitude in decimal degrees. Optional and does not affect the bodygraph, which depends only on ecliptic longitudes. Defaults to 0. */ latitude?: number; /** * Birth longitude in decimal degrees. Optional and does not affect the bodygraph. Defaults to 0. */ longitude?: number; /** * Lunar node convention. "mean" is the smoothed average node, which always moves retrograde; "true" is the osculating node, which tracks the real perturbed node, oscillates up to about 1.5 degrees either side of the mean on a 173-day cycle, and can briefly turn direct. Neither is more correct and they almost always fall in the same sign. Applies to the North and South Node activations. True is what professional Human Design software uses (HumanDesign.ai, Total Human Design) and is the value RoxyAPI verifies against, so leave it unset for a standard chart. It matters only when a node sits on a gate boundary, where the choice moves a node gate. Because a gate can be half of a channel, that can change the completed channels and, with them, whether a center reads defined or open, plus the definition, authority, profile or type. A chart where only one center disagrees is the usual shape, since the type and profile often survive unchanged. If another calculator disagrees on any of those, it is almost certainly using the mean node: pass "mean" to match it. Defaults to "true". */ nodeType?: 'mean' | 'true'; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/human-design/centers'; }; export type CalculateCentersErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type CalculateCentersError = CalculateCentersErrors[keyof CalculateCentersErrors]; export type CalculateCentersResponses = { /** * All nine centers with defined state, flags, theme, and active gates */ 200: { /** * All nine centers with their defined state and active gates. */ centers: Array<{ /** * Center identifier. One of head, ajna, throat, g, heart, sacral, solar-plexus, spleen, root. */ id: string; /** * Display name of the center. Always English, whatever the lang parameter says, so it stays safe to compare against in code. Use nameLocalized for anything a reader sees. */ name: string; /** * Center name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ nameLocalized?: string; /** * Whether the center is defined. A defined center is a consistent source of energy or awareness; an undefined center is open and conditioned by others. */ defined: boolean; /** * Whether this is a motor center (energy source). The four motors are Heart, Sacral, Solar Plexus, and Root. */ motor: boolean; /** * Whether this is an awareness center. The three awareness centers are Ajna, Solar Plexus, and Spleen. */ awareness: boolean; /** * Theme text describing the center in its current defined or undefined state. */ theme: string; /** * The conditioning trap of this center when it is open. Returned on every center so a consumer can surface it the moment `defined` is false, which is where the not-self operates. */ notSelfQuestion: string; /** * The gland, organ, or system this center corresponds to in the body. */ biology: string; /** * Active gate numbers that sit in this center. */ gates: Array; }>; /** * How many of the nine centers are defined. */ definedCount: number; }; }; export type CalculateCentersResponse = CalculateCentersResponses[keyof CalculateCentersResponses]; export type GetCenterData = { body?: never; path: { /** * Center id. One of head, ajna, throat, g, heart, sacral, solar-plexus, spleen, root. */ id: 'head' | 'ajna' | 'throat' | 'g' | 'heart' | 'sacral' | 'solar-plexus' | 'spleen' | 'root'; }; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/human-design/centers/{id}'; }; export type GetCenterErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetCenterError = GetCenterErrors[keyof GetCenterErrors]; export type GetCenterResponses = { /** * Center reference data with defined and undefined meanings */ 200: { /** * Center identifier. */ id: string; /** * Display name of the center. Always English, whatever the lang parameter says. Use nameLocalized for anything a reader sees. */ name: string; /** * Center name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ nameLocalized?: string; /** * Whether this is a motor center. */ motor: boolean; /** * Whether this is an awareness center. */ awareness: boolean; /** * What this center means when defined: a consistent, reliable energy or awareness. */ definedMeaning: string; /** * What this center means when undefined and open: a place of conditioning and learning. */ undefinedMeaning: string; }; }; export type GetCenterResponse = GetCenterResponses[keyof GetCenterResponses]; export type CalculateProfileData = { body?: { /** * Birth date in YYYY-MM-DD format. The anchor for both the Personality activations at birth and the Design activations 88 degrees of solar arc earlier. */ date: string; /** * Birth time in 24-hour HH:MM:SS format. Precision matters: the profile lines and gate boundaries shift with the exact minute of birth. */ time: string; /** * IANA name (e.g. "America/New_York", "Europe/London", "UTC"), decimal hours (e.g. -5 for EST, 1 for CET), or a fixed UTC offset (e.g. "-05:00", "+01:00"). Prefer the IANA name: it is resolved to the offset in force at the birth date and time, historical daylight-saving rules included, while a fixed offset or decimal is taken literally and will be wrong if it does not match the daylight-saving state at that moment. On a transition day a time in the repeated hour is read as its first occurrence and a time in the skipped hour is moved forward past the gap. Invalid timezones return 400 with a validation error. */ timezone: number | string; /** * Birth latitude in decimal degrees. Optional and does not affect the bodygraph, which depends only on ecliptic longitudes. Defaults to 0. */ latitude?: number; /** * Birth longitude in decimal degrees. Optional and does not affect the bodygraph. Defaults to 0. */ longitude?: number; /** * Lunar node convention. "mean" is the smoothed average node, which always moves retrograde; "true" is the osculating node, which tracks the real perturbed node, oscillates up to about 1.5 degrees either side of the mean on a 173-day cycle, and can briefly turn direct. Neither is more correct and they almost always fall in the same sign. Applies to the North and South Node activations. True is what professional Human Design software uses (HumanDesign.ai, Total Human Design) and is the value RoxyAPI verifies against, so leave it unset for a standard chart. It matters only when a node sits on a gate boundary, where the choice moves a node gate. Because a gate can be half of a channel, that can change the completed channels and, with them, whether a center reads defined or open, plus the definition, authority, profile or type. A chart where only one center disagrees is the usual shape, since the type and profile often survive unchanged. If another calculator disagrees on any of those, it is almost certainly using the mean node: pass "mean" to match it. Defaults to "true". */ nodeType?: 'mean' | 'true'; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/human-design/profile'; }; export type CalculateProfileErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type CalculateProfileError = CalculateProfileErrors[keyof CalculateProfileErrors]; export type CalculateProfileResponses = { /** * Profile string, the two line numbers, and line keynotes */ 200: { /** * Profile in conscious/unconscious form, the Personality Sun line over the Design Sun line. */ profile: string; /** * Line number from 1 to 6 of the conscious Personality Sun. */ personalityLine: number; /** * Line number from 1 to 6 of the unconscious Design Sun. */ designLine: number; /** * Keynote of the Personality line, the conscious half of the profile. */ personalityKeynote: string; /** * Keynote of the Design line, the unconscious half of the profile. */ designKeynote: string; }; }; export type CalculateProfileResponse = CalculateProfileResponses[keyof CalculateProfileResponses]; export type CalculateVariablesData = { body?: { /** * Birth date in YYYY-MM-DD format. The anchor for both the Personality activations at birth and the Design activations 88 degrees of solar arc earlier. */ date: string; /** * Birth time in 24-hour HH:MM:SS format. Precision matters: the profile lines and gate boundaries shift with the exact minute of birth. */ time: string; /** * IANA name (e.g. "America/New_York", "Europe/London", "UTC"), decimal hours (e.g. -5 for EST, 1 for CET), or a fixed UTC offset (e.g. "-05:00", "+01:00"). Prefer the IANA name: it is resolved to the offset in force at the birth date and time, historical daylight-saving rules included, while a fixed offset or decimal is taken literally and will be wrong if it does not match the daylight-saving state at that moment. On a transition day a time in the repeated hour is read as its first occurrence and a time in the skipped hour is moved forward past the gap. Invalid timezones return 400 with a validation error. */ timezone: number | string; /** * Birth latitude in decimal degrees. Optional and does not affect the bodygraph, which depends only on ecliptic longitudes. Defaults to 0. */ latitude?: number; /** * Birth longitude in decimal degrees. Optional and does not affect the bodygraph. Defaults to 0. */ longitude?: number; /** * Lunar node convention. "mean" is the smoothed average node, which always moves retrograde; "true" is the osculating node, which tracks the real perturbed node, oscillates up to about 1.5 degrees either side of the mean on a 173-day cycle, and can briefly turn direct. Neither is more correct and they almost always fall in the same sign. Applies to the North and South Node activations. True is what professional Human Design software uses (HumanDesign.ai, Total Human Design) and is the value RoxyAPI verifies against, so leave it unset for a standard chart. It matters only when a node sits on a gate boundary, where the choice moves a node gate. Because a gate can be half of a channel, that can change the completed channels and, with them, whether a center reads defined or open, plus the definition, authority, profile or type. A chart where only one center disagrees is the usual shape, since the type and profile often survive unchanged. If another calculator disagrees on any of those, it is almost certainly using the mean node: pass "mean" to match it. Defaults to "true". */ nodeType?: 'mean' | 'true'; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/human-design/variables'; }; export type CalculateVariablesErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type CalculateVariablesError = CalculateVariablesErrors[keyof CalculateVariablesErrors]; export type CalculateVariablesResponses = { /** * The four Variable arrows with substructure numbers, labels, and confidence flags */ 200: { /** * The four Variable arrows: Determination and Environment from the design side, Perspective and Motivation from the personality side. Together they form the Rave Variables / Primary Health System layer that sits beneath Type, Strategy, Authority, and Profile. */ arrows: Array<{ /** * Stable arrow identifier. One of determination, environment, perspective, motivation. */ key: string; /** * Arrow name. Determination is the top-left arrow governing the Primary Health System and digestion, Environment the bottom-left arrow, Perspective the bottom-right arrow also called View, and Motivation the top-right arrow. Always English, whatever the lang parameter says. Use nameLocalized for anything a reader sees. */ name: string; /** * Arrow name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ nameLocalized?: string; /** * Which half of the advanced layer the arrow belongs to. Primary Health System covers the body-side Determination and Environment arrows, Rave Psychology covers the mind-side Perspective and Motivation arrows. Always English, whatever the lang parameter says, so it stays safe to compare against in code. Use layerLocalized for anything a reader sees. */ layer: string; /** * Layer name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ layerLocalized?: string; /** * Position of the arrow at the head of the bodygraph. One of Top left, Bottom left, Top right, Bottom right. Always English, whatever the lang parameter says, so it stays safe to compare against in code. Use positionLocalized for anything a reader sees. */ position: string; /** * Arrow position name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ positionLocalized?: string; /** * The single activation, body and chart side, that this arrow is derived from. */ activation: { /** * Activating body whose substructure feeds this arrow. Determination and Motivation come from the Sun, Environment and Perspective from the North Node. Always English, whatever the lang parameter says, so it stays safe to compare against in code and to key a glyph table on. Use planetLocalized for anything a reader sees. */ planet: string; /** * Activating body name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ planetLocalized?: string; /** * Chart side of the activation. Determination and Environment come from the design side, Perspective and Motivation from the personality side. Always English, whatever the lang parameter says, so it stays safe to compare against in code. */ side: string; }; /** * Color number from 1 to 6, the substructure level one octave finer than the line. Color selects the arrow theme, for example the determination family or the motivation. */ color: number; /** * Tone number from 1 to 6, the substructure level beneath Color. Tone sets the arrow direction: tones 1 to 3 face left, tones 4 to 6 face right. */ tone: number; /** * Base number from 1 to 5, the finest published subdivision of the wheel. Returned for completeness but treated as informational, since it is finer than most birth times can resolve. */ base: number; /** * Arrow direction derived from the Tone. left for tones 1 to 3, right for tones 4 to 6. */ direction: string; /** * Name of the Color theme for this arrow, for example a determination family such as Touch, an environment such as Mountains, a perspective such as Personal, or a motivation such as Hope. Always English, whatever the lang parameter says. Use colorLabelLocalized for anything a reader sees. */ colorLabel: string; /** * Color theme name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ colorLabelLocalized?: string; /** * Keynote of the arrow direction for this arrow, for example Active or Passive for Determination, Focused or Peripheral for Perspective. Always English, whatever the lang parameter says. Use directionLabelLocalized for anything a reader sees. */ directionLabel: string; /** * Arrow direction keynote in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ directionLabelLocalized?: string; /** * What this arrow is and what it governs. */ description: string; /** * What the layer this arrow belongs to governs, the body side or the mind side. */ layerDescription: string; /** * Meaning of the Color for THIS arrow. The same Color number means something different under Determination than under Motivation, so this is the reading of colorLabel in context, not a generic gloss. */ colorMeaning: string; /** * Meaning of the Tone. The six Tones are shared across all four arrows: the arrow does not change the Tone, it changes what the Tone qualifies. */ toneMeaning: string; /** * Meaning of the left or right direction for THIS arrow, the reading of directionLabel. */ directionMeaning: string; /** * Name of the Base. Informational only: the Base is finer than any civil birth time can resolve. Always English, whatever the lang parameter says. Use baseNameLocalized for anything a reader sees. */ baseName: string; /** * Base name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ baseNameLocalized?: string; /** * Cognition, the strongest sense, read off the Determination Tone. Present on the determination arrow ONLY: no authority supports reading Cognition from the other three arrows, so it is omitted rather than invented. */ cognition?: { /** * Name of the Cognition, the strongest sense. One of six read off the Determination Tone: Smell, Taste, Outer Vision, Inner Vision, Feeling, Touch. Always English, whatever the lang parameter says, so it stays safe to compare against in code. Use labelLocalized for anything a reader sees. */ label: string; /** * Cognition name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ labelLocalized?: string; /** * How this Cognition discriminates what is correct for the body, and the conditions that sharpen it. Renderable as the Cognition paragraph of a Variables or Primary Health System report. */ description: string; }; /** * Whether this arrow is far enough from a Color or Tone boundary to be reliable. When false the activation sits on a knife edge where the Color label or the arrow direction could flip with a more precise birth time, and the arrow should not be presented as fact. */ confident: boolean; }>; /** * True only when all four arrows are confident. A single knife-edge arrow makes the whole configuration uncertain. */ confident: boolean; /** * Boundary margin in degrees of ecliptic longitude used for the per-arrow confidence flag, the solar arc over a few minutes of clock time. An activation within this distance of a Color or Tone boundary is flagged low-confidence. */ confidenceMarginDeg: number; /** * What the Base layer is. Returned once at the top level rather than repeated on every arrow, since the Base layer is the same concept for all four. No per-Base meaning is returned: every one in circulation traces back to a single origin, so it fails the two-source bar this package holds. */ baseDescription: string; }; }; export type CalculateVariablesResponse = CalculateVariablesResponses[keyof CalculateVariablesResponses]; export type GenerateBaziChartData = { body?: { /** * Birth date in YYYY-MM-DD format. Sets the year, month and day pillars. The year pillar turns at Beginning of Spring rather than on 1 January, and the month pillar turns at each of the twelve minor solar terms rather than at a calendar month boundary. */ date: string; /** * Birth time in 24-hour HH:MM:SS format. Sets the hour pillar, which is one of the four and carries the whole picture of later life and offspring. Each Earthly Branch covers two hours, so a birth within a few minutes of an odd hour can land in either. All four pillars are read in the local clock of the birth, and the day boundary is applied in that same clock; only the lunisolar calendar date itself is a world constant, fixed at UTC plus 8 so one instant has one Chinese date everywhere. */ time: string; /** * IANA name (e.g. "America/New_York", "Europe/London", "UTC"), decimal hours (e.g. -5 for EST, 1 for CET), or a fixed UTC offset (e.g. "-05:00", "+01:00"). Prefer the IANA name: it is resolved to the offset in force at the birth date and time, historical daylight-saving rules included, while a fixed offset or decimal is taken literally and will be wrong if it does not match the daylight-saving state at that moment. On a transition day a time in the repeated hour is read as its first occurrence and a time in the skipped hour is moved forward past the gap. Invalid timezones return 400 with a validation error. */ timezone: number | string; /** * Birth latitude in decimal degrees. Accepted for consistency with the other birth-data endpoints and does not affect any part of a BaZi chart. Defaults to 0. */ latitude?: number; /** * Birth longitude in decimal degrees. Positive is East, negative is West. Required when hourClock is "local-mean" or "solar", which shift the hour branch to the sun over the birth place; omitting it in either case returns 400. Ignored when hourClock is "clock". */ longitude?: number; /** * Which instant starts the sexagenary DAY, which only matters for a birth between 23:00 and 23:59. "midnight" is the classical position of the Ming compendium San Ming Tong Hui: the day turns at 00:00 and 23:00 to 23:59 is the late zi hour of the day that is ending, so the hour stem is taken from that day. "early-zi" turns the whole day at 23:00, the practice in Hong Kong, Taiwan and much of South East Asia. "split-zi" is the compromise most software implements and the default here: the day still turns at 00:00, but the hour stem is taken from the next day. The three give three different answers for a late-evening birth and identical answers for every other birth. */ dayBoundary?: 'split-zi' | 'midnight' | 'early-zi'; /** * Which instant starts the sexagenary YEAR. "li-chun" is Beginning of Spring, around 4 February, and is the classical rule every BaZi text uses, so it is the default on this endpoint. "lunar-new-year" is the folk rule people mean when they say which animal they are, and it falls between late January and late February. The two disagree for any birth in the weeks between them: 14 February 2026 is a Wood Snake year under lunar-new-year and a Fire Horse year under li-chun. */ yearBoundary?: 'li-chun' | 'lunar-new-year'; /** * Which clock the HOUR branch is read from. "clock" is civil time exactly as a birth certificate records it, which is what most calculators use and the default here. "local-mean" shifts to the mean sun over the birth longitude, a correction of up to 59 minutes at the edge of a wide time zone. "solar" adds the equation of time on top of that, up to a further 16 minutes. Both non-civil options need "longitude" in the request and return 400 without it. */ hourClock?: 'clock' | 'local-mean' | 'solar'; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/chinese-astrology/bazi/chart'; }; export type GenerateBaziChartErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GenerateBaziChartError = GenerateBaziChartErrors[keyof GenerateBaziChartErrors]; export type GenerateBaziChartResponses = { /** * Four pillars, Day Master, element balance, interactions, and the conventions */ 200: { /** * Echo of the birth moment the chart was computed from. */ birthData: { /** * Birth date in YYYY-MM-DD format. Sets the year, month and day pillars. The year pillar turns at Beginning of Spring rather than on 1 January, and the month pillar turns at each of the twelve minor solar terms rather than at a calendar month boundary. */ date: string; /** * Birth time in 24-hour HH:MM:SS format. Sets the hour pillar, which is one of the four and carries the whole picture of later life and offspring. Each Earthly Branch covers two hours, so a birth within a few minutes of an odd hour can land in either. All four pillars are read in the local clock of the birth, and the day boundary is applied in that same clock; only the lunisolar calendar date itself is a world constant, fixed at UTC plus 8 so one instant has one Chinese date everywhere. */ time: string; /** * Decimal UTC offset the chart was computed with, resolved from whatever the request sent. An IANA name is resolved to the offset in force on the birth date, so this is the literal number applied and never the name. */ timezone: number; /** * Birth latitude in decimal degrees. Accepted for consistency with the other birth-data endpoints and does not affect any part of a BaZi chart. Defaults to 0. */ latitude?: number; /** * Birth longitude in decimal degrees. Positive is East, negative is West. Required when hourClock is "local-mean" or "solar", which shift the hour branch to the sun over the birth place; omitting it in either case returns 400. Ignored when hourClock is "clock". */ longitude?: number; }; /** * The three school conventions this result was computed under. Returned on every BaZi response so a chart is self-describing: two calculators can produce different pillars for one birth and both be correct, and this object says which reading you are holding. */ conventions: { /** * Day-boundary school actually applied. Echoes the request, or the default when it was omitted. Always English, whatever the lang parameter says, so it stays safe to compare against in code. */ dayBoundary: 'split-zi' | 'midnight' | 'early-zi'; /** * Year-boundary school actually applied. Echoes the request, or the default when it was omitted. */ yearBoundary: 'li-chun' | 'lunar-new-year'; /** * Hour clock actually applied. Echoes the request, or the default when omitted. */ hourClock: 'clock' | 'local-mean' | 'solar'; }; /** * The four pillars, year first. Each carries its stem, its branch, the hidden stems stored in the branch, the Ten God relation to the Day Master, and the Na Yin sound element of the pair. */ pillars: Array<{ /** * Which of the four pillars this is. One of year, month, day, hour. The year pillar reads ancestry and early life, the month career and parents, the day the self and the partner, the hour later life and children. */ position: string; /** * Pillar identifier, the stem id and the branch id joined by a hyphen. Always English pinyin, whatever the lang parameter says. */ id: string; /** * Position of this pillar in the sexagenary cycle, 1 to 60, where jia-zi is 1. The cycle runs stems and branches together, which is why only 60 of the 120 possible pairings occur. */ number: number; /** * The Heavenly Stem of this pillar. */ stem: { /** * Heavenly Stem identifier. One of jia, yi, bing, ding, wu, ji, geng, xin, ren, gui. Always English pinyin, whatever the lang parameter says, so it stays safe to compare against in code and to key a glyph table on. */ id: string; /** * The stem in hanzi. Data rather than display copy, so it is identical under every lang. */ chinese: string; /** * Tone-marked pinyin for the stem. Identical under every lang. */ pinyin: string; /** * Five-phase element of the stem. One of Wood, Fire, Earth, Metal, Water. Always English, whatever the lang parameter says. Use elementLocalized for anything a reader sees. */ element: string; /** * Element name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ elementLocalized?: string; /** * Polarity of the stem, yang or yin. The five odd stems are yang and the five even ones are yin, and this is half of what decides every Ten God relation in the chart. */ polarity: string; }; /** * The Earthly Branch of this pillar. */ branch: { /** * Earthly Branch identifier. One of zi, chou, yin, mao, chen, si, wu, wei, shen, you, xu, hai. Always English pinyin, whatever the lang parameter says. Note that "wu" is also a stem identifier: they never share a field, so a branch id is only ever read out of a branch position. */ id: string; /** * The branch in hanzi. Identical under every lang. */ chinese: string; /** * Tone-marked pinyin for the branch. Identical under every lang. */ pinyin: string; /** * Zodiac animal of the branch. One of rat, ox, tiger, rabbit, dragon, snake, horse, goat, monkey, rooster, dog, pig. Always English, whatever the lang parameter says. Use animalLocalized for anything a reader sees. */ animal: string; /** * Zodiac animal name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ animalLocalized?: string; /** * Five-phase element of the branch. Always English, whatever the lang parameter says. Use elementLocalized for anything a reader sees. */ element: string; /** * Element name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ elementLocalized?: string; /** * Polarity of the branch, yang or yin. */ polarity: string; }; /** * Relation the pillar STEM holds to the Day Master. The day pillar carries day-master instead, because the day stem is the reference point every other position is measured from rather than a relation to itself. */ tenGod: { /** * Ten God identifier. One of friend, rob-wealth, eating-god, hurting-officer, indirect-wealth, direct-wealth, seven-killings, direct-officer, indirect-resource, direct-resource, plus day-master in the day-stem position. Always English, whatever the lang parameter says. */ id: string; /** * Display name of the relation. Always English, whatever the lang parameter says. Use nameLocalized for anything a reader sees. */ name: string; /** * Ten God name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ nameLocalized?: string; /** * The relation in traditional hanzi. Identical under every lang. */ chinese: string; /** * Tone-marked pinyin for the relation. Identical under every lang. */ pinyin: string; /** * Which of the five cycle relations this belongs to. peer is the same element as the Day Master, output is what the Day Master generates, wealth is what it controls, influence is what controls it, resource is what generates it, and self marks the Day Master itself. Always English, whatever the lang parameter says. */ category: string; /** * One-line summary of what this relation contributes, for a compact rendering that has no room for the full meaning. */ keynote: string; }; /** * Stems stored inside the branch, principal first. These carry the qi a branch holds without showing it, and they are where a Day Master finds a root. */ hiddenStems: Array<{ /** * The stem stored in the branch. */ stem: { /** * Heavenly Stem identifier. One of jia, yi, bing, ding, wu, ji, geng, xin, ren, gui. Always English pinyin, whatever the lang parameter says, so it stays safe to compare against in code and to key a glyph table on. */ id: string; /** * The stem in hanzi. Data rather than display copy, so it is identical under every lang. */ chinese: string; /** * Tone-marked pinyin for the stem. Identical under every lang. */ pinyin: string; /** * Five-phase element of the stem. One of Wood, Fire, Earth, Metal, Water. Always English, whatever the lang parameter says. Use elementLocalized for anything a reader sees. */ element: string; /** * Element name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ elementLocalized?: string; /** * Polarity of the stem, yang or yin. The five odd stems are yang and the five even ones are yin, and this is half of what decides every Ten God relation in the chart. */ polarity: string; }; /** * Rank of this stem inside the branch, by the classical day-count that divides a thirty-day month 18, 9 and 3 days between the stems a branch holds. principal is the first-ranked stem and always matches the branch element; middle is the second-ranked; residual is the third. A branch holds one to three, always returned in rank order. What each rank CONTAINS depends on the branch family: on a storage branch the second-ranked stem is the seasonal carryover from the month before and the third is the stem that branch stores as the close of its trine, while on a growth branch the second-ranked stem is the one beginning its long-life phase there and the third is the carryover. Some schools name the same three positions by that function rather than by rank, which swaps the second and third labels on the four storage branches, so compare on rank rather than assuming a name. */ role: string; /** * Relation this hidden stem holds to the Day Master. */ tenGod: { /** * Ten God identifier. One of friend, rob-wealth, eating-god, hurting-officer, indirect-wealth, direct-wealth, seven-killings, direct-officer, indirect-resource, direct-resource, plus day-master in the day-stem position. Always English, whatever the lang parameter says. */ id: string; /** * Display name of the relation. Always English, whatever the lang parameter says. Use nameLocalized for anything a reader sees. */ name: string; /** * Ten God name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ nameLocalized?: string; /** * The relation in traditional hanzi. Identical under every lang. */ chinese: string; /** * Tone-marked pinyin for the relation. Identical under every lang. */ pinyin: string; /** * Which of the five cycle relations this belongs to. peer is the same element as the Day Master, output is what the Day Master generates, wealth is what it controls, influence is what controls it, resource is what generates it, and self marks the Day Master itself. Always English, whatever the lang parameter says. */ category: string; /** * One-line summary of what this relation contributes, for a compact rendering that has no room for the full meaning. */ keynote: string; }; }>; /** * Na Yin sound element of the pillar, an older elemental reading assigned to each of the 30 stem-and-branch pairs. The hanzi name sits beside it in naYinChinese. */ naYin: string; /** * The Na Yin name in hanzi. Identical under every lang. */ naYinChinese: string; /** * Element the Na Yin resolves to. Independent of the stem element and often different from it, which is why it is reported separately rather than folded in. */ naYinElement: string; }>; /** * The day stem, which is the subject of the whole chart. Everything else in the response is named by what it does to this one. */ dayMaster: { /** * Day stem identifier, which IS the Day Master. Always English pinyin, whatever the lang parameter says. */ stem: string; /** * The Day Master stem in hanzi. Identical under every lang. */ chinese: string; /** * Tone-marked pinyin for the Day Master stem. */ pinyin: string; /** * Five-phase element of the Day Master. Every Ten God in the chart is measured from this element and this polarity. Always English, whatever the lang parameter says. Use elementLocalized for anything a reader sees. */ element: string; /** * Element name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ elementLocalized?: string; /** * Polarity of the Day Master, yang or yin. */ polarity: string; /** * What this particular stem is like as a Day Master, in the imagery the tradition uses to distinguish the two stems of each element. The yang and yin forms of one element behave very differently and this is where that difference lives. */ nature: string; }; /** * Zodiac animal of the year branch, under the year boundary this request applied. Always English, whatever the lang parameter says. Use zodiacAnimalLocalized for anything a reader sees. */ zodiacAnimal: string; /** * Zodiac animal name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ zodiacAnimalLocalized?: string; /** * Element balance across the eight chart characters, one entry per phase, with the reading for how represented each one is. */ fiveElements: Array<{ /** * Five-phase element. Always English, whatever the lang parameter says. Use elementLocalized for anything a reader sees. */ element: string; /** * Element name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ elementLocalized?: string; /** * How many of the eight chart characters carry this element, counting the four stems and the four branch elements one point each. Hidden stems are deliberately not counted here: a weighted total is a different quantity and mixing the two produces a number that matches no other calculator. */ count: number; /** * How represented the element is. deficient means absent from all eight characters, excess means three or more, balanced is one or two. Always English, whatever the lang parameter says. */ level: string; /** * What this level of representation means for the chart. */ reading: string; }>; /** * Combinations, clashes, harms and punishments running between the four pillars. An empty array means the four pillars stand independently of each other, which is common and is not a defect. */ interactions: Array<{ /** * Kind of interaction. stem-combination and six-combination bind two positions, trine binds three, and clash, harm, punishment and stem-clash break them. Always English, whatever the lang parameter says. */ type: string; /** * Identifier of the pairing itself, the member ids joined by hyphens in canonical order. */ id: string; /** * The interaction named in hanzi. Identical under every lang. */ chinese: string; /** * Tone-marked pinyin for the interaction. Identical under every lang. */ pinyin: string; /** * Whether the interaction binds or breaks. harmonious for combinations and trines, challenging for clashes, harms and punishments. Always English, whatever the lang parameter says. */ quality: string; /** * The chart positions taking part, in the same order as members. On a two-person reading these are prefixed with the subject, for example personA.day. */ positions: Array; /** * The stem or branch ids taking part, in the same order as positions. */ members: Array; /** * Element the formation resolves to. Present on stem combinations and on complete trines, absent on everything else. Branch six combinations deliberately carry none: the classical sources assign transformed elements to the stem pairs and not to these, and one of the six is contested between schools. */ transformsTo?: string; /** * Class of a punishment, present on punishments only. ungrateful is the tiger, snake and monkey group, bullying the ox, dog and goat group, discourteous the rat and rabbit pair, and self a branch doubled against itself. */ variety?: string; /** * Punishments only. True when the third branch of the group is also present in the chart, which is what a complete three-punishment means. False marks the partial case, where only two of the three are in play. */ complete?: boolean; /** * What this kind of interaction does between the positions it joins. */ meaning: string; }>; /** * One-paragraph reading composed from the Day Master nature and the seasonal state of its element in the birth month. The narrative entry point for a chart, for a consumer that renders one block before the detail. */ summary: string; }; }; export type GenerateBaziChartResponse = GenerateBaziChartResponses[keyof GenerateBaziChartResponses]; export type CalculateLuckPillarsData = { body?: { /** * Birth date in YYYY-MM-DD format. Sets the year, month and day pillars. The year pillar turns at Beginning of Spring rather than on 1 January, and the month pillar turns at each of the twelve minor solar terms rather than at a calendar month boundary. */ date: string; /** * Birth time in 24-hour HH:MM:SS format. Sets the hour pillar, which is one of the four and carries the whole picture of later life and offspring. Each Earthly Branch covers two hours, so a birth within a few minutes of an odd hour can land in either. All four pillars are read in the local clock of the birth, and the day boundary is applied in that same clock; only the lunisolar calendar date itself is a world constant, fixed at UTC plus 8 so one instant has one Chinese date everywhere. */ time: string; /** * IANA name (e.g. "America/New_York", "Europe/London", "UTC"), decimal hours (e.g. -5 for EST, 1 for CET), or a fixed UTC offset (e.g. "-05:00", "+01:00"). Prefer the IANA name: it is resolved to the offset in force at the birth date and time, historical daylight-saving rules included, while a fixed offset or decimal is taken literally and will be wrong if it does not match the daylight-saving state at that moment. On a transition day a time in the repeated hour is read as its first occurrence and a time in the skipped hour is moved forward past the gap. Invalid timezones return 400 with a validation error. */ timezone: number | string; /** * Birth latitude in decimal degrees. Accepted for consistency with the other birth-data endpoints and does not affect any part of a BaZi chart. Defaults to 0. */ latitude?: number; /** * Birth longitude in decimal degrees. Positive is East, negative is West. Required when hourClock is "local-mean" or "solar", which shift the hour branch to the sun over the birth place; omitting it in either case returns 400. Ignored when hourClock is "clock". */ longitude?: number; /** * Which instant starts the sexagenary DAY, which only matters for a birth between 23:00 and 23:59. "midnight" is the classical position of the Ming compendium San Ming Tong Hui: the day turns at 00:00 and 23:00 to 23:59 is the late zi hour of the day that is ending, so the hour stem is taken from that day. "early-zi" turns the whole day at 23:00, the practice in Hong Kong, Taiwan and much of South East Asia. "split-zi" is the compromise most software implements and the default here: the day still turns at 00:00, but the hour stem is taken from the next day. The three give three different answers for a late-evening birth and identical answers for every other birth. */ dayBoundary?: 'split-zi' | 'midnight' | 'early-zi'; /** * Which instant starts the sexagenary YEAR. "li-chun" is Beginning of Spring, around 4 February, and is the classical rule every BaZi text uses, so it is the default on this endpoint. "lunar-new-year" is the folk rule people mean when they say which animal they are, and it falls between late January and late February. The two disagree for any birth in the weeks between them: 14 February 2026 is a Wood Snake year under lunar-new-year and a Fire Horse year under li-chun. */ yearBoundary?: 'li-chun' | 'lunar-new-year'; /** * Which clock the HOUR branch is read from. "clock" is civil time exactly as a birth certificate records it, which is what most calculators use and the default here. "local-mean" shifts to the mean sun over the birth longitude, a correction of up to 59 minutes at the edge of a wide time zone. "solar" adds the equation of time on top of that, up to a further 16 minutes. Both non-civil options need "longitude" in the request and return 400 without it. */ hourClock?: 'clock' | 'local-mean' | 'solar'; /** * Subject sex, used only to pick the luck-pillar direction: a male born in a yang-stem year and a female born in a yin-stem year run forward through the sexagenary cycle, and the other two combinations run backward. It affects nothing else in the response. */ gender: 'male' | 'female'; /** * How many ten-year luck pillars to return, 1 to 12. Eight covers eighty years from the start age, which reaches past a normal lifetime for most start ages. */ count?: number; /** * First Gregorian year of the annual pillar overlay. Omit it to leave annualPillars out of the response entirely. The annual pillar is the year the chart is currently walking through, read against the ten-year luck pillar underneath it. */ annualFromYear?: number; /** * How many consecutive years the annual overlay covers, 1 to 20. Ignored unless annualFromYear is present. */ annualYears?: number; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/chinese-astrology/bazi/luck-pillars'; }; export type CalculateLuckPillarsErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type CalculateLuckPillarsError = CalculateLuckPillarsErrors[keyof CalculateLuckPillarsErrors]; export type CalculateLuckPillarsResponses = { /** * Luck pillar sequence with start age, direction, and optional annual overlay */ 200: { /** * Echo of the birth moment the chart was computed from. */ birthData: { /** * Birth date in YYYY-MM-DD format. Sets the year, month and day pillars. The year pillar turns at Beginning of Spring rather than on 1 January, and the month pillar turns at each of the twelve minor solar terms rather than at a calendar month boundary. */ date: string; /** * Birth time in 24-hour HH:MM:SS format. Sets the hour pillar, which is one of the four and carries the whole picture of later life and offspring. Each Earthly Branch covers two hours, so a birth within a few minutes of an odd hour can land in either. All four pillars are read in the local clock of the birth, and the day boundary is applied in that same clock; only the lunisolar calendar date itself is a world constant, fixed at UTC plus 8 so one instant has one Chinese date everywhere. */ time: string; /** * Decimal UTC offset the chart was computed with, resolved from whatever the request sent. An IANA name is resolved to the offset in force on the birth date, so this is the literal number applied and never the name. */ timezone: number; /** * Birth latitude in decimal degrees. Accepted for consistency with the other birth-data endpoints and does not affect any part of a BaZi chart. Defaults to 0. */ latitude?: number; /** * Birth longitude in decimal degrees. Positive is East, negative is West. Required when hourClock is "local-mean" or "solar", which shift the hour branch to the sun over the birth place; omitting it in either case returns 400. Ignored when hourClock is "clock". */ longitude?: number; }; /** * The three school conventions this result was computed under. Returned on every BaZi response so a chart is self-describing: two calculators can produce different pillars for one birth and both be correct, and this object says which reading you are holding. */ conventions: { /** * Day-boundary school actually applied. Echoes the request, or the default when it was omitted. Always English, whatever the lang parameter says, so it stays safe to compare against in code. */ dayBoundary: 'split-zi' | 'midnight' | 'early-zi'; /** * Year-boundary school actually applied. Echoes the request, or the default when it was omitted. */ yearBoundary: 'li-chun' | 'lunar-new-year'; /** * Hour clock actually applied. Echoes the request, or the default when omitted. */ hourClock: 'clock' | 'local-mean' | 'solar'; }; /** * Echo of the sex sent, which is what selected the direction below. */ gender: string; /** * Which way the sequence walks the sexagenary cycle. A male born in a yang-stem year and a female born in a yin-stem year run forward, and the other two combinations run backward. Always English, whatever the lang parameter says. */ direction: string; /** * Age in whole years at which the first luck pillar begins. Counted from the birth instant to the adjacent minor solar term at three days to the year, forward for a forward direction and backward for a reverse one. */ startAge: number; /** * Additional months past startAge, 0 to 11, from the remainder of the same count at one day to four months. Calculators that round the whole count to the nearest year will differ from this by up to six months. */ startAgeMonths: number; /** * Days from the birth instant to the minor solar term the count ran to, before conversion. Published so the start age can be checked rather than taken on trust. */ daysToTerm: number; /** * The minor solar term the count ran to. One of the twelve that also move the month pillar. Always the pinyin identifier, whatever the lang parameter says. */ boundaryTerm: string; /** * Display name of that same term, in the requested language. Always present, and English when lang is en. Several English renderings of a term are in circulation, so treat this as the label and boundaryTerm as the value. */ boundaryTermName: string; /** * The ten-year periods in order, each with the relation its stem holds to the natal Day Master. */ luckPillars: Array<{ /** * Position in the sequence, starting at 1 for the first ten-year period. */ index: number; /** * Pillar identifier, the stem id and the branch id joined by a hyphen. */ id: string; /** * Position of this pillar in the sexagenary cycle, 1 to 60. Consecutive luck pillars always differ by exactly one step, forward or backward, because the sequence walks the cycle from the birth month pillar. */ number: number; /** * The Heavenly Stem of this luck pillar, with its element and polarity. */ stem: { /** * Heavenly Stem identifier. One of jia, yi, bing, ding, wu, ji, geng, xin, ren, gui. Always English pinyin, whatever the lang parameter says, so it stays safe to compare against in code and to key a glyph table on. */ id: string; /** * The stem in hanzi. Data rather than display copy, so it is identical under every lang. */ chinese: string; /** * Tone-marked pinyin for the stem. Identical under every lang. */ pinyin: string; /** * Five-phase element of the stem. One of Wood, Fire, Earth, Metal, Water. Always English, whatever the lang parameter says. Use elementLocalized for anything a reader sees. */ element: string; /** * Element name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ elementLocalized?: string; /** * Polarity of the stem, yang or yin. The five odd stems are yang and the five even ones are yin, and this is half of what decides every Ten God relation in the chart. */ polarity: string; }; /** * The Earthly Branch of this luck pillar, with its animal, element and polarity. */ branch: { /** * Earthly Branch identifier. One of zi, chou, yin, mao, chen, si, wu, wei, shen, you, xu, hai. Always English pinyin, whatever the lang parameter says. Note that "wu" is also a stem identifier: they never share a field, so a branch id is only ever read out of a branch position. */ id: string; /** * The branch in hanzi. Identical under every lang. */ chinese: string; /** * Tone-marked pinyin for the branch. Identical under every lang. */ pinyin: string; /** * Zodiac animal of the branch. One of rat, ox, tiger, rabbit, dragon, snake, horse, goat, monkey, rooster, dog, pig. Always English, whatever the lang parameter says. Use animalLocalized for anything a reader sees. */ animal: string; /** * Zodiac animal name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ animalLocalized?: string; /** * Five-phase element of the branch. Always English, whatever the lang parameter says. Use elementLocalized for anything a reader sees. */ element: string; /** * Element name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ elementLocalized?: string; /** * Polarity of the branch, yang or yin. */ polarity: string; }; /** * Relation the luck pillar STEM holds to the natal Day Master. This is what tells you whether a decade supports the chart or spends it. */ tenGod: { /** * Ten God identifier. One of friend, rob-wealth, eating-god, hurting-officer, indirect-wealth, direct-wealth, seven-killings, direct-officer, indirect-resource, direct-resource, plus day-master in the day-stem position. Always English, whatever the lang parameter says. */ id: string; /** * Display name of the relation. Always English, whatever the lang parameter says. Use nameLocalized for anything a reader sees. */ name: string; /** * Ten God name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ nameLocalized?: string; /** * The relation in traditional hanzi. Identical under every lang. */ chinese: string; /** * Tone-marked pinyin for the relation. Identical under every lang. */ pinyin: string; /** * Which of the five cycle relations this belongs to. peer is the same element as the Day Master, output is what the Day Master generates, wealth is what it controls, influence is what controls it, resource is what generates it, and self marks the Day Master itself. Always English, whatever the lang parameter says. */ category: string; /** * One-line summary of what this relation contributes, for a compact rendering that has no room for the full meaning. */ keynote: string; }; /** * Age in whole years at which this ten-year period begins. */ startAge: number; /** * Age in whole years at which this period ends and the next one begins. */ endAge: number; /** * Gregorian year this period begins, the birth year plus startAge. */ startYear: number; /** * Gregorian year this period ends. */ endYear: number; }>; /** * Year-by-year overlay, present only when annualFromYear was sent. Each year names the luck pillar it falls inside. */ annualPillars?: Array<{ /** * Gregorian year. */ year: number; /** * Annual pillar identifier for that year, under the year boundary applied. */ id: string; /** * Position of the annual pillar in the sexagenary cycle, 1 to 60. */ number: number; /** * Relation the annual pillar STEM holds to the natal Day Master. */ tenGod: { /** * Ten God identifier. One of friend, rob-wealth, eating-god, hurting-officer, indirect-wealth, direct-wealth, seven-killings, direct-officer, indirect-resource, direct-resource, plus day-master in the day-stem position. Always English, whatever the lang parameter says. */ id: string; /** * Display name of the relation. Always English, whatever the lang parameter says. Use nameLocalized for anything a reader sees. */ name: string; /** * Ten God name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ nameLocalized?: string; /** * The relation in traditional hanzi. Identical under every lang. */ chinese: string; /** * Tone-marked pinyin for the relation. Identical under every lang. */ pinyin: string; /** * Which of the five cycle relations this belongs to. peer is the same element as the Day Master, output is what the Day Master generates, wealth is what it controls, influence is what controls it, resource is what generates it, and self marks the Day Master itself. Always English, whatever the lang parameter says. */ category: string; /** * One-line summary of what this relation contributes, for a compact rendering that has no room for the full meaning. */ keynote: string; }; /** * Which returned luck pillar this year falls inside, by its index. 0 means the year falls before the first luck pillar begins, in the stretch still governed by the natal chart alone. */ luckPillarIndex: number; }>; /** * One-paragraph reading of the sequence direction and its start. */ summary: string; }; }; export type CalculateLuckPillarsResponse = CalculateLuckPillarsResponses[keyof CalculateLuckPillarsResponses]; export type CalculateDayMasterStrengthData = { body?: { /** * Birth date in YYYY-MM-DD format. Sets the year, month and day pillars. The year pillar turns at Beginning of Spring rather than on 1 January, and the month pillar turns at each of the twelve minor solar terms rather than at a calendar month boundary. */ date: string; /** * Birth time in 24-hour HH:MM:SS format. Sets the hour pillar, which is one of the four and carries the whole picture of later life and offspring. Each Earthly Branch covers two hours, so a birth within a few minutes of an odd hour can land in either. All four pillars are read in the local clock of the birth, and the day boundary is applied in that same clock; only the lunisolar calendar date itself is a world constant, fixed at UTC plus 8 so one instant has one Chinese date everywhere. */ time: string; /** * IANA name (e.g. "America/New_York", "Europe/London", "UTC"), decimal hours (e.g. -5 for EST, 1 for CET), or a fixed UTC offset (e.g. "-05:00", "+01:00"). Prefer the IANA name: it is resolved to the offset in force at the birth date and time, historical daylight-saving rules included, while a fixed offset or decimal is taken literally and will be wrong if it does not match the daylight-saving state at that moment. On a transition day a time in the repeated hour is read as its first occurrence and a time in the skipped hour is moved forward past the gap. Invalid timezones return 400 with a validation error. */ timezone: number | string; /** * Birth latitude in decimal degrees. Accepted for consistency with the other birth-data endpoints and does not affect any part of a BaZi chart. Defaults to 0. */ latitude?: number; /** * Birth longitude in decimal degrees. Positive is East, negative is West. Required when hourClock is "local-mean" or "solar", which shift the hour branch to the sun over the birth place; omitting it in either case returns 400. Ignored when hourClock is "clock". */ longitude?: number; /** * Which instant starts the sexagenary DAY, which only matters for a birth between 23:00 and 23:59. "midnight" is the classical position of the Ming compendium San Ming Tong Hui: the day turns at 00:00 and 23:00 to 23:59 is the late zi hour of the day that is ending, so the hour stem is taken from that day. "early-zi" turns the whole day at 23:00, the practice in Hong Kong, Taiwan and much of South East Asia. "split-zi" is the compromise most software implements and the default here: the day still turns at 00:00, but the hour stem is taken from the next day. The three give three different answers for a late-evening birth and identical answers for every other birth. */ dayBoundary?: 'split-zi' | 'midnight' | 'early-zi'; /** * Which instant starts the sexagenary YEAR. "li-chun" is Beginning of Spring, around 4 February, and is the classical rule every BaZi text uses, so it is the default on this endpoint. "lunar-new-year" is the folk rule people mean when they say which animal they are, and it falls between late January and late February. The two disagree for any birth in the weeks between them: 14 February 2026 is a Wood Snake year under lunar-new-year and a Fire Horse year under li-chun. */ yearBoundary?: 'li-chun' | 'lunar-new-year'; /** * Which clock the HOUR branch is read from. "clock" is civil time exactly as a birth certificate records it, which is what most calculators use and the default here. "local-mean" shifts to the mean sun over the birth longitude, a correction of up to 59 minutes at the edge of a wide time zone. "solar" adds the equation of time on top of that, up to a further 16 minutes. Both non-civil options need "longitude" in the request and return 400 without it. */ hourClock?: 'clock' | 'local-mean' | 'solar'; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/chinese-astrology/bazi/day-master'; }; export type CalculateDayMasterStrengthErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type CalculateDayMasterStrengthError = CalculateDayMasterStrengthErrors[keyof CalculateDayMasterStrengthErrors]; export type CalculateDayMasterStrengthResponses = { /** * Strength verdict, contributing factors, and favorable elements */ 200: { /** * Echo of the birth moment the chart was computed from. */ birthData: { /** * Birth date in YYYY-MM-DD format. Sets the year, month and day pillars. The year pillar turns at Beginning of Spring rather than on 1 January, and the month pillar turns at each of the twelve minor solar terms rather than at a calendar month boundary. */ date: string; /** * Birth time in 24-hour HH:MM:SS format. Sets the hour pillar, which is one of the four and carries the whole picture of later life and offspring. Each Earthly Branch covers two hours, so a birth within a few minutes of an odd hour can land in either. All four pillars are read in the local clock of the birth, and the day boundary is applied in that same clock; only the lunisolar calendar date itself is a world constant, fixed at UTC plus 8 so one instant has one Chinese date everywhere. */ time: string; /** * Decimal UTC offset the chart was computed with, resolved from whatever the request sent. An IANA name is resolved to the offset in force on the birth date, so this is the literal number applied and never the name. */ timezone: number; /** * Birth latitude in decimal degrees. Accepted for consistency with the other birth-data endpoints and does not affect any part of a BaZi chart. Defaults to 0. */ latitude?: number; /** * Birth longitude in decimal degrees. Positive is East, negative is West. Required when hourClock is "local-mean" or "solar", which shift the hour branch to the sun over the birth place; omitting it in either case returns 400. Ignored when hourClock is "clock". */ longitude?: number; }; /** * The three school conventions this result was computed under. Returned on every BaZi response so a chart is self-describing: two calculators can produce different pillars for one birth and both be correct, and this object says which reading you are holding. */ conventions: { /** * Day-boundary school actually applied. Echoes the request, or the default when it was omitted. Always English, whatever the lang parameter says, so it stays safe to compare against in code. */ dayBoundary: 'split-zi' | 'midnight' | 'early-zi'; /** * Year-boundary school actually applied. Echoes the request, or the default when it was omitted. */ yearBoundary: 'li-chun' | 'lunar-new-year'; /** * Hour clock actually applied. Echoes the request, or the default when omitted. */ hourClock: 'clock' | 'local-mean' | 'solar'; }; /** * The day stem whose strength is being assessed. */ dayMaster: { /** * Day stem identifier. Always English pinyin, whatever the lang parameter says. */ stem: string; /** * The Day Master stem in hanzi. */ chinese: string; /** * Tone-marked pinyin for the Day Master stem. */ pinyin: string; /** * Five-phase element of the Day Master, the element whose support is being weighed. Always English, whatever the lang parameter says. Use elementLocalized for anything a reader sees. */ element: string; /** * Element name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ elementLocalized?: string; /** * Polarity of the Day Master, yang or yin. */ polarity: string; /** * What this particular stem is like as a Day Master. */ nature: string; }; /** * Strength verdict. One of very-weak, weak, balanced, strong, very-strong, banded on the composite score below: under -3 is very-weak, -3 to under -1 is weak, -1 to under 1 is balanced, 1 to under 3 is strong, 3 and above is very-strong. Always English, whatever the lang parameter says. */ verdict: string; /** * Composite support score, negative for an under-supported Day Master and positive for a well-supported one. A RoxyAPI weighting of the three classical factors rather than a figure from any text, published so the verdict can be audited: the three factor contributions sum to exactly this number. */ score: number; /** * State of the Day Master element in the birth month, the strongest single input. One of prosperous, supported, resting, imprisoned, dead, which render the classical five wang xiang xiu qiu si. Always English, whatever the lang parameter says; the translated reading is seasonalStateMeaning. */ seasonalState: string; /** * The seasonal state in hanzi. Identical under every lang. */ seasonalStateChinese: string; /** * What this seasonal state means for the chart. */ seasonalStateMeaning: string; /** * How many of the four branches store a stem of the Day Master element. Zero means the day stem is rootless, which is the single most decisive finding a strength reading can return. */ rootCount: number; /** * The three classical factors behind the verdict, each with what it found and what it contributed. These are the citable part of the reading; the score is our arithmetic over them. */ factors: Array<{ /** * Which classical factor this is. month-command is de ling, whether the birth month season backs the Day Master element. rooting is de di, whether any branch stores a stem of that element. party is de shi, whether the other three stems help or spend it. Always English, whatever the lang parameter says. */ id: string; /** * Display name of the factor. Always English, whatever the lang parameter says. Use nameLocalized for anything a reader sees. */ name: string; /** * The factor named in hanzi. Identical under every lang. */ chinese: string; /** * Tone-marked pinyin for the factor. Identical under every lang. */ pinyin: string; /** * Points this factor contributed to the composite score, positive for support and negative for drain. The three contributions sum to score, so a caller who weights the factors differently can rebuild its own total from the same findings. */ contribution: number; /** * What the factor actually found in this chart, in one clause. */ detail: string; }>; /** * Elements that help this chart. A weak Day Master wants its own element and the one that generates it; a strong one wants the three that drain, spend, or restrain it. Empty when the verdict is balanced, because a centred chart has no categorically favourable element and the incoming luck pillar decides. Always English, whatever the lang parameter says. */ favorableElements: Array; /** * Elements that burden this chart, the complement of favorableElements. Also empty when the verdict is balanced. */ unfavorableElements: Array; /** * Element headcount across the eight characters, the plain distribution behind the weighted verdict. */ fiveElements: Array<{ /** * Five-phase element. Always English, whatever the lang parameter says. */ element: string; /** * Element name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ elementLocalized?: string; /** * How many of the eight chart characters carry this element, four stems and four branch elements at one point each. */ count: number; /** * How represented the element is. deficient is absent, excess is three or more, balanced is one or two. */ level: string; /** * What this level of representation means for the chart. */ reading: string; }>; /** * One-paragraph reading composed from the verdict, the seasonal state, and the rooting finding. */ summary: string; }; }; export type CalculateDayMasterStrengthResponse = CalculateDayMasterStrengthResponses[keyof CalculateDayMasterStrengthResponses]; export type CalculateBaziCompatibilityData = { body?: { /** * Birth moment of the first person. Each subject carries its own school switches, so two charts built under different conventions can still be compared. */ personA: { /** * Birth date in YYYY-MM-DD format. Sets the year, month and day pillars. The year pillar turns at Beginning of Spring rather than on 1 January, and the month pillar turns at each of the twelve minor solar terms rather than at a calendar month boundary. */ date: string; /** * Birth time in 24-hour HH:MM:SS format. Sets the hour pillar, which is one of the four and carries the whole picture of later life and offspring. Each Earthly Branch covers two hours, so a birth within a few minutes of an odd hour can land in either. All four pillars are read in the local clock of the birth, and the day boundary is applied in that same clock; only the lunisolar calendar date itself is a world constant, fixed at UTC plus 8 so one instant has one Chinese date everywhere. */ time: string; /** * IANA name (e.g. "America/New_York", "Europe/London", "UTC"), decimal hours (e.g. -5 for EST, 1 for CET), or a fixed UTC offset (e.g. "-05:00", "+01:00"). Prefer the IANA name: it is resolved to the offset in force at the birth date and time, historical daylight-saving rules included, while a fixed offset or decimal is taken literally and will be wrong if it does not match the daylight-saving state at that moment. On a transition day a time in the repeated hour is read as its first occurrence and a time in the skipped hour is moved forward past the gap. Invalid timezones return 400 with a validation error. */ timezone: number | string; /** * Birth latitude in decimal degrees. Accepted for consistency with the other birth-data endpoints and does not affect any part of a BaZi chart. Defaults to 0. */ latitude?: number; /** * Birth longitude in decimal degrees. Positive is East, negative is West. Required when hourClock is "local-mean" or "solar", which shift the hour branch to the sun over the birth place; omitting it in either case returns 400. Ignored when hourClock is "clock". */ longitude?: number; /** * Which instant starts the sexagenary DAY, which only matters for a birth between 23:00 and 23:59. "midnight" is the classical position of the Ming compendium San Ming Tong Hui: the day turns at 00:00 and 23:00 to 23:59 is the late zi hour of the day that is ending, so the hour stem is taken from that day. "early-zi" turns the whole day at 23:00, the practice in Hong Kong, Taiwan and much of South East Asia. "split-zi" is the compromise most software implements and the default here: the day still turns at 00:00, but the hour stem is taken from the next day. The three give three different answers for a late-evening birth and identical answers for every other birth. */ dayBoundary?: 'split-zi' | 'midnight' | 'early-zi'; /** * Which instant starts the sexagenary YEAR. "li-chun" is Beginning of Spring, around 4 February, and is the classical rule every BaZi text uses, so it is the default on this endpoint. "lunar-new-year" is the folk rule people mean when they say which animal they are, and it falls between late January and late February. The two disagree for any birth in the weeks between them: 14 February 2026 is a Wood Snake year under lunar-new-year and a Fire Horse year under li-chun. */ yearBoundary?: 'li-chun' | 'lunar-new-year'; /** * Which clock the HOUR branch is read from. "clock" is civil time exactly as a birth certificate records it, which is what most calculators use and the default here. "local-mean" shifts to the mean sun over the birth longitude, a correction of up to 59 minutes at the edge of a wide time zone. "solar" adds the equation of time on top of that, up to a further 16 minutes. Both non-civil options need "longitude" in the request and return 400 without it. */ hourClock?: 'clock' | 'local-mean' | 'solar'; }; /** * Birth moment of the second person. */ personB: { /** * Birth date in YYYY-MM-DD format. Sets the year, month and day pillars. The year pillar turns at Beginning of Spring rather than on 1 January, and the month pillar turns at each of the twelve minor solar terms rather than at a calendar month boundary. */ date: string; /** * Birth time in 24-hour HH:MM:SS format. Sets the hour pillar, which is one of the four and carries the whole picture of later life and offspring. Each Earthly Branch covers two hours, so a birth within a few minutes of an odd hour can land in either. All four pillars are read in the local clock of the birth, and the day boundary is applied in that same clock; only the lunisolar calendar date itself is a world constant, fixed at UTC plus 8 so one instant has one Chinese date everywhere. */ time: string; /** * IANA name (e.g. "America/New_York", "Europe/London", "UTC"), decimal hours (e.g. -5 for EST, 1 for CET), or a fixed UTC offset (e.g. "-05:00", "+01:00"). Prefer the IANA name: it is resolved to the offset in force at the birth date and time, historical daylight-saving rules included, while a fixed offset or decimal is taken literally and will be wrong if it does not match the daylight-saving state at that moment. On a transition day a time in the repeated hour is read as its first occurrence and a time in the skipped hour is moved forward past the gap. Invalid timezones return 400 with a validation error. */ timezone: number | string; /** * Birth latitude in decimal degrees. Accepted for consistency with the other birth-data endpoints and does not affect any part of a BaZi chart. Defaults to 0. */ latitude?: number; /** * Birth longitude in decimal degrees. Positive is East, negative is West. Required when hourClock is "local-mean" or "solar", which shift the hour branch to the sun over the birth place; omitting it in either case returns 400. Ignored when hourClock is "clock". */ longitude?: number; /** * Which instant starts the sexagenary DAY, which only matters for a birth between 23:00 and 23:59. "midnight" is the classical position of the Ming compendium San Ming Tong Hui: the day turns at 00:00 and 23:00 to 23:59 is the late zi hour of the day that is ending, so the hour stem is taken from that day. "early-zi" turns the whole day at 23:00, the practice in Hong Kong, Taiwan and much of South East Asia. "split-zi" is the compromise most software implements and the default here: the day still turns at 00:00, but the hour stem is taken from the next day. The three give three different answers for a late-evening birth and identical answers for every other birth. */ dayBoundary?: 'split-zi' | 'midnight' | 'early-zi'; /** * Which instant starts the sexagenary YEAR. "li-chun" is Beginning of Spring, around 4 February, and is the classical rule every BaZi text uses, so it is the default on this endpoint. "lunar-new-year" is the folk rule people mean when they say which animal they are, and it falls between late January and late February. The two disagree for any birth in the weeks between them: 14 February 2026 is a Wood Snake year under lunar-new-year and a Fire Horse year under li-chun. */ yearBoundary?: 'li-chun' | 'lunar-new-year'; /** * Which clock the HOUR branch is read from. "clock" is civil time exactly as a birth certificate records it, which is what most calculators use and the default here. "local-mean" shifts to the mean sun over the birth longitude, a correction of up to 59 minutes at the edge of a wide time zone. "solar" adds the equation of time on top of that, up to a further 16 minutes. Both non-civil options need "longitude" in the request and return 400 without it. */ hourClock?: 'clock' | 'local-mean' | 'solar'; }; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/chinese-astrology/bazi/compatibility'; }; export type CalculateBaziCompatibilityErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type CalculateBaziCompatibilityError = CalculateBaziCompatibilityErrors[keyof CalculateBaziCompatibilityErrors]; export type CalculateBaziCompatibilityResponses = { /** * Both charts, the cross-chart interactions, and the compatibility score */ 200: { /** * Resolved chart of the first person. */ personA: { /** * The four pillars of this person, year first. */ pillars: Array<{ /** * Which of the four pillars this is. One of year, month, day, hour. The year pillar reads ancestry and early life, the month career and parents, the day the self and the partner, the hour later life and children. */ position: string; /** * Pillar identifier, the stem id and the branch id joined by a hyphen. Always English pinyin, whatever the lang parameter says. */ id: string; /** * Position of this pillar in the sexagenary cycle, 1 to 60, where jia-zi is 1. The cycle runs stems and branches together, which is why only 60 of the 120 possible pairings occur. */ number: number; /** * The Heavenly Stem of this pillar. */ stem: { /** * Heavenly Stem identifier. One of jia, yi, bing, ding, wu, ji, geng, xin, ren, gui. Always English pinyin, whatever the lang parameter says, so it stays safe to compare against in code and to key a glyph table on. */ id: string; /** * The stem in hanzi. Data rather than display copy, so it is identical under every lang. */ chinese: string; /** * Tone-marked pinyin for the stem. Identical under every lang. */ pinyin: string; /** * Five-phase element of the stem. One of Wood, Fire, Earth, Metal, Water. Always English, whatever the lang parameter says. Use elementLocalized for anything a reader sees. */ element: string; /** * Element name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ elementLocalized?: string; /** * Polarity of the stem, yang or yin. The five odd stems are yang and the five even ones are yin, and this is half of what decides every Ten God relation in the chart. */ polarity: string; }; /** * The Earthly Branch of this pillar. */ branch: { /** * Earthly Branch identifier. One of zi, chou, yin, mao, chen, si, wu, wei, shen, you, xu, hai. Always English pinyin, whatever the lang parameter says. Note that "wu" is also a stem identifier: they never share a field, so a branch id is only ever read out of a branch position. */ id: string; /** * The branch in hanzi. Identical under every lang. */ chinese: string; /** * Tone-marked pinyin for the branch. Identical under every lang. */ pinyin: string; /** * Zodiac animal of the branch. One of rat, ox, tiger, rabbit, dragon, snake, horse, goat, monkey, rooster, dog, pig. Always English, whatever the lang parameter says. Use animalLocalized for anything a reader sees. */ animal: string; /** * Zodiac animal name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ animalLocalized?: string; /** * Five-phase element of the branch. Always English, whatever the lang parameter says. Use elementLocalized for anything a reader sees. */ element: string; /** * Element name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ elementLocalized?: string; /** * Polarity of the branch, yang or yin. */ polarity: string; }; /** * Relation the pillar STEM holds to the Day Master. The day pillar carries day-master instead, because the day stem is the reference point every other position is measured from rather than a relation to itself. */ tenGod: { /** * Ten God identifier. One of friend, rob-wealth, eating-god, hurting-officer, indirect-wealth, direct-wealth, seven-killings, direct-officer, indirect-resource, direct-resource, plus day-master in the day-stem position. Always English, whatever the lang parameter says. */ id: string; /** * Display name of the relation. Always English, whatever the lang parameter says. Use nameLocalized for anything a reader sees. */ name: string; /** * Ten God name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ nameLocalized?: string; /** * The relation in traditional hanzi. Identical under every lang. */ chinese: string; /** * Tone-marked pinyin for the relation. Identical under every lang. */ pinyin: string; /** * Which of the five cycle relations this belongs to. peer is the same element as the Day Master, output is what the Day Master generates, wealth is what it controls, influence is what controls it, resource is what generates it, and self marks the Day Master itself. Always English, whatever the lang parameter says. */ category: string; /** * One-line summary of what this relation contributes, for a compact rendering that has no room for the full meaning. */ keynote: string; }; /** * Stems stored inside the branch, principal first. These carry the qi a branch holds without showing it, and they are where a Day Master finds a root. */ hiddenStems: Array<{ /** * The stem stored in the branch. */ stem: { /** * Heavenly Stem identifier. One of jia, yi, bing, ding, wu, ji, geng, xin, ren, gui. Always English pinyin, whatever the lang parameter says, so it stays safe to compare against in code and to key a glyph table on. */ id: string; /** * The stem in hanzi. Data rather than display copy, so it is identical under every lang. */ chinese: string; /** * Tone-marked pinyin for the stem. Identical under every lang. */ pinyin: string; /** * Five-phase element of the stem. One of Wood, Fire, Earth, Metal, Water. Always English, whatever the lang parameter says. Use elementLocalized for anything a reader sees. */ element: string; /** * Element name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ elementLocalized?: string; /** * Polarity of the stem, yang or yin. The five odd stems are yang and the five even ones are yin, and this is half of what decides every Ten God relation in the chart. */ polarity: string; }; /** * Rank of this stem inside the branch, by the classical day-count that divides a thirty-day month 18, 9 and 3 days between the stems a branch holds. principal is the first-ranked stem and always matches the branch element; middle is the second-ranked; residual is the third. A branch holds one to three, always returned in rank order. What each rank CONTAINS depends on the branch family: on a storage branch the second-ranked stem is the seasonal carryover from the month before and the third is the stem that branch stores as the close of its trine, while on a growth branch the second-ranked stem is the one beginning its long-life phase there and the third is the carryover. Some schools name the same three positions by that function rather than by rank, which swaps the second and third labels on the four storage branches, so compare on rank rather than assuming a name. */ role: string; /** * Relation this hidden stem holds to the Day Master. */ tenGod: { /** * Ten God identifier. One of friend, rob-wealth, eating-god, hurting-officer, indirect-wealth, direct-wealth, seven-killings, direct-officer, indirect-resource, direct-resource, plus day-master in the day-stem position. Always English, whatever the lang parameter says. */ id: string; /** * Display name of the relation. Always English, whatever the lang parameter says. Use nameLocalized for anything a reader sees. */ name: string; /** * Ten God name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ nameLocalized?: string; /** * The relation in traditional hanzi. Identical under every lang. */ chinese: string; /** * Tone-marked pinyin for the relation. Identical under every lang. */ pinyin: string; /** * Which of the five cycle relations this belongs to. peer is the same element as the Day Master, output is what the Day Master generates, wealth is what it controls, influence is what controls it, resource is what generates it, and self marks the Day Master itself. Always English, whatever the lang parameter says. */ category: string; /** * One-line summary of what this relation contributes, for a compact rendering that has no room for the full meaning. */ keynote: string; }; }>; /** * Na Yin sound element of the pillar, an older elemental reading assigned to each of the 30 stem-and-branch pairs. The hanzi name sits beside it in naYinChinese. */ naYin: string; /** * The Na Yin name in hanzi. Identical under every lang. */ naYinChinese: string; /** * Element the Na Yin resolves to. Independent of the stem element and often different from it, which is why it is reported separately rather than folded in. */ naYinElement: string; }>; /** * The day stem of this person. */ dayMaster: { /** * Day stem identifier for this person. */ stem: string; /** * The Day Master stem in hanzi. */ chinese: string; /** * Tone-marked pinyin for the Day Master stem. */ pinyin: string; /** * Five-phase element of this Day Master. Always English, whatever the lang parameter says. */ element: string; /** * Display copy of the element in the requested language. Absent for English, so an English response is unchanged. */ elementLocalized?: string; /** * Polarity, yang or yin. */ polarity: string; /** * What this stem is like as a Day Master. */ nature: string; }; /** * Day Master strength verdict for this person, so a reader can see which of the two chart carries more capacity. One of very-weak, weak, balanced, strong, very-strong. */ strength: string; /** * The three school conventions this result was computed under. Returned on every BaZi response so a chart is self-describing: two calculators can produce different pillars for one birth and both be correct, and this object says which reading you are holding. */ conventions: { /** * Day-boundary school actually applied. Echoes the request, or the default when it was omitted. Always English, whatever the lang parameter says, so it stays safe to compare against in code. */ dayBoundary: 'split-zi' | 'midnight' | 'early-zi'; /** * Year-boundary school actually applied. Echoes the request, or the default when it was omitted. */ yearBoundary: 'li-chun' | 'lunar-new-year'; /** * Hour clock actually applied. Echoes the request, or the default when omitted. */ hourClock: 'clock' | 'local-mean' | 'solar'; }; }; /** * Resolved chart of the second person. */ personB: { /** * The four pillars of this person, year first. */ pillars: Array<{ /** * Which of the four pillars this is. One of year, month, day, hour. The year pillar reads ancestry and early life, the month career and parents, the day the self and the partner, the hour later life and children. */ position: string; /** * Pillar identifier, the stem id and the branch id joined by a hyphen. Always English pinyin, whatever the lang parameter says. */ id: string; /** * Position of this pillar in the sexagenary cycle, 1 to 60, where jia-zi is 1. The cycle runs stems and branches together, which is why only 60 of the 120 possible pairings occur. */ number: number; /** * The Heavenly Stem of this pillar. */ stem: { /** * Heavenly Stem identifier. One of jia, yi, bing, ding, wu, ji, geng, xin, ren, gui. Always English pinyin, whatever the lang parameter says, so it stays safe to compare against in code and to key a glyph table on. */ id: string; /** * The stem in hanzi. Data rather than display copy, so it is identical under every lang. */ chinese: string; /** * Tone-marked pinyin for the stem. Identical under every lang. */ pinyin: string; /** * Five-phase element of the stem. One of Wood, Fire, Earth, Metal, Water. Always English, whatever the lang parameter says. Use elementLocalized for anything a reader sees. */ element: string; /** * Element name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ elementLocalized?: string; /** * Polarity of the stem, yang or yin. The five odd stems are yang and the five even ones are yin, and this is half of what decides every Ten God relation in the chart. */ polarity: string; }; /** * The Earthly Branch of this pillar. */ branch: { /** * Earthly Branch identifier. One of zi, chou, yin, mao, chen, si, wu, wei, shen, you, xu, hai. Always English pinyin, whatever the lang parameter says. Note that "wu" is also a stem identifier: they never share a field, so a branch id is only ever read out of a branch position. */ id: string; /** * The branch in hanzi. Identical under every lang. */ chinese: string; /** * Tone-marked pinyin for the branch. Identical under every lang. */ pinyin: string; /** * Zodiac animal of the branch. One of rat, ox, tiger, rabbit, dragon, snake, horse, goat, monkey, rooster, dog, pig. Always English, whatever the lang parameter says. Use animalLocalized for anything a reader sees. */ animal: string; /** * Zodiac animal name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ animalLocalized?: string; /** * Five-phase element of the branch. Always English, whatever the lang parameter says. Use elementLocalized for anything a reader sees. */ element: string; /** * Element name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ elementLocalized?: string; /** * Polarity of the branch, yang or yin. */ polarity: string; }; /** * Relation the pillar STEM holds to the Day Master. The day pillar carries day-master instead, because the day stem is the reference point every other position is measured from rather than a relation to itself. */ tenGod: { /** * Ten God identifier. One of friend, rob-wealth, eating-god, hurting-officer, indirect-wealth, direct-wealth, seven-killings, direct-officer, indirect-resource, direct-resource, plus day-master in the day-stem position. Always English, whatever the lang parameter says. */ id: string; /** * Display name of the relation. Always English, whatever the lang parameter says. Use nameLocalized for anything a reader sees. */ name: string; /** * Ten God name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ nameLocalized?: string; /** * The relation in traditional hanzi. Identical under every lang. */ chinese: string; /** * Tone-marked pinyin for the relation. Identical under every lang. */ pinyin: string; /** * Which of the five cycle relations this belongs to. peer is the same element as the Day Master, output is what the Day Master generates, wealth is what it controls, influence is what controls it, resource is what generates it, and self marks the Day Master itself. Always English, whatever the lang parameter says. */ category: string; /** * One-line summary of what this relation contributes, for a compact rendering that has no room for the full meaning. */ keynote: string; }; /** * Stems stored inside the branch, principal first. These carry the qi a branch holds without showing it, and they are where a Day Master finds a root. */ hiddenStems: Array<{ /** * The stem stored in the branch. */ stem: { /** * Heavenly Stem identifier. One of jia, yi, bing, ding, wu, ji, geng, xin, ren, gui. Always English pinyin, whatever the lang parameter says, so it stays safe to compare against in code and to key a glyph table on. */ id: string; /** * The stem in hanzi. Data rather than display copy, so it is identical under every lang. */ chinese: string; /** * Tone-marked pinyin for the stem. Identical under every lang. */ pinyin: string; /** * Five-phase element of the stem. One of Wood, Fire, Earth, Metal, Water. Always English, whatever the lang parameter says. Use elementLocalized for anything a reader sees. */ element: string; /** * Element name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ elementLocalized?: string; /** * Polarity of the stem, yang or yin. The five odd stems are yang and the five even ones are yin, and this is half of what decides every Ten God relation in the chart. */ polarity: string; }; /** * Rank of this stem inside the branch, by the classical day-count that divides a thirty-day month 18, 9 and 3 days between the stems a branch holds. principal is the first-ranked stem and always matches the branch element; middle is the second-ranked; residual is the third. A branch holds one to three, always returned in rank order. What each rank CONTAINS depends on the branch family: on a storage branch the second-ranked stem is the seasonal carryover from the month before and the third is the stem that branch stores as the close of its trine, while on a growth branch the second-ranked stem is the one beginning its long-life phase there and the third is the carryover. Some schools name the same three positions by that function rather than by rank, which swaps the second and third labels on the four storage branches, so compare on rank rather than assuming a name. */ role: string; /** * Relation this hidden stem holds to the Day Master. */ tenGod: { /** * Ten God identifier. One of friend, rob-wealth, eating-god, hurting-officer, indirect-wealth, direct-wealth, seven-killings, direct-officer, indirect-resource, direct-resource, plus day-master in the day-stem position. Always English, whatever the lang parameter says. */ id: string; /** * Display name of the relation. Always English, whatever the lang parameter says. Use nameLocalized for anything a reader sees. */ name: string; /** * Ten God name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ nameLocalized?: string; /** * The relation in traditional hanzi. Identical under every lang. */ chinese: string; /** * Tone-marked pinyin for the relation. Identical under every lang. */ pinyin: string; /** * Which of the five cycle relations this belongs to. peer is the same element as the Day Master, output is what the Day Master generates, wealth is what it controls, influence is what controls it, resource is what generates it, and self marks the Day Master itself. Always English, whatever the lang parameter says. */ category: string; /** * One-line summary of what this relation contributes, for a compact rendering that has no room for the full meaning. */ keynote: string; }; }>; /** * Na Yin sound element of the pillar, an older elemental reading assigned to each of the 30 stem-and-branch pairs. The hanzi name sits beside it in naYinChinese. */ naYin: string; /** * The Na Yin name in hanzi. Identical under every lang. */ naYinChinese: string; /** * Element the Na Yin resolves to. Independent of the stem element and often different from it, which is why it is reported separately rather than folded in. */ naYinElement: string; }>; /** * The day stem of this person. */ dayMaster: { /** * Day stem identifier for this person. */ stem: string; /** * The Day Master stem in hanzi. */ chinese: string; /** * Tone-marked pinyin for the Day Master stem. */ pinyin: string; /** * Five-phase element of this Day Master. Always English, whatever the lang parameter says. */ element: string; /** * Display copy of the element in the requested language. Absent for English, so an English response is unchanged. */ elementLocalized?: string; /** * Polarity, yang or yin. */ polarity: string; /** * What this stem is like as a Day Master. */ nature: string; }; /** * Day Master strength verdict for this person, so a reader can see which of the two chart carries more capacity. One of very-weak, weak, balanced, strong, very-strong. */ strength: string; /** * The three school conventions this result was computed under. Returned on every BaZi response so a chart is self-describing: two calculators can produce different pillars for one birth and both be correct, and this object says which reading you are holding. */ conventions: { /** * Day-boundary school actually applied. Echoes the request, or the default when it was omitted. Always English, whatever the lang parameter says, so it stays safe to compare against in code. */ dayBoundary: 'split-zi' | 'midnight' | 'early-zi'; /** * Year-boundary school actually applied. Echoes the request, or the default when it was omitted. */ yearBoundary: 'li-chun' | 'lunar-new-year'; /** * Hour clock actually applied. Echoes the request, or the default when omitted. */ hourClock: 'clock' | 'local-mean' | 'solar'; }; }; /** * How the two Day Masters stand to each other by the five-phase cycle, read from person A. peer means the same element, output means A generates B, wealth means A controls B, influence means B controls A, resource means B generates A. Always English, whatever the lang parameter says. */ dayMasterRelation: string; /** * Every combination, clash, harm and punishment that crosses between the two charts, with each position prefixed by its subject. Only cross-chart pairs are searched: a three-branch formation assembled from two different people is not a formation either chart holds, so trines are not reported here. */ interactions: Array<{ /** * Kind of interaction. stem-combination and six-combination bind two positions, trine binds three, and clash, harm, punishment and stem-clash break them. Always English, whatever the lang parameter says. */ type: string; /** * Identifier of the pairing itself, the member ids joined by hyphens in canonical order. */ id: string; /** * The interaction named in hanzi. Identical under every lang. */ chinese: string; /** * Tone-marked pinyin for the interaction. Identical under every lang. */ pinyin: string; /** * Whether the interaction binds or breaks. harmonious for combinations and trines, challenging for clashes, harms and punishments. Always English, whatever the lang parameter says. */ quality: string; /** * The chart positions taking part, in the same order as members. On a two-person reading these are prefixed with the subject, for example personA.day. */ positions: Array; /** * The stem or branch ids taking part, in the same order as positions. */ members: Array; /** * Element the formation resolves to. Present on stem combinations and on complete trines, absent on everything else. Branch six combinations deliberately carry none: the classical sources assign transformed elements to the stem pairs and not to these, and one of the six is contested between schools. */ transformsTo?: string; /** * Class of a punishment, present on punishments only. ungrateful is the tiger, snake and monkey group, bullying the ox, dog and goat group, discourteous the rat and rabbit pair, and self a branch doubled against itself. */ variety?: string; /** * Punishments only. True when the third branch of the group is also present in the chart, which is what a complete three-punishment means. False marks the partial case, where only two of the three are in play. */ complete?: boolean; /** * What this kind of interaction does between the positions it joins. */ meaning: string; }>; /** * Compatibility score from 0 to 100. A RoxyAPI tally over the interactions listed above rather than a figure from any classical text: it starts at a neutral 50, adds for each binding interaction and subtracts for each breaking one. Recompute it yourself from the interactions array if you want a different weighting. */ score: number; /** * How many of the interactions bind the two charts together. */ harmoniousCount: number; /** * How many of the interactions break between them. */ challengingCount: number; /** * One-paragraph reading of the balance between binding and breaking interactions. */ summary: string; }; }; export type CalculateBaziCompatibilityResponse = CalculateBaziCompatibilityResponses[keyof CalculateBaziCompatibilityResponses]; export type CalculateAnnualForecastData = { body?: { /** * Birth date in YYYY-MM-DD format. Sets the year, month and day pillars. The year pillar turns at Beginning of Spring rather than on 1 January, and the month pillar turns at each of the twelve minor solar terms rather than at a calendar month boundary. */ date: string; /** * Birth time in 24-hour HH:MM:SS format. Sets the hour pillar, which is one of the four and carries the whole picture of later life and offspring. Each Earthly Branch covers two hours, so a birth within a few minutes of an odd hour can land in either. All four pillars are read in the local clock of the birth, and the day boundary is applied in that same clock; only the lunisolar calendar date itself is a world constant, fixed at UTC plus 8 so one instant has one Chinese date everywhere. */ time: string; /** * IANA name (e.g. "America/New_York", "Europe/London", "UTC"), decimal hours (e.g. -5 for EST, 1 for CET), or a fixed UTC offset (e.g. "-05:00", "+01:00"). Prefer the IANA name: it is resolved to the offset in force at the birth date and time, historical daylight-saving rules included, while a fixed offset or decimal is taken literally and will be wrong if it does not match the daylight-saving state at that moment. On a transition day a time in the repeated hour is read as its first occurrence and a time in the skipped hour is moved forward past the gap. Invalid timezones return 400 with a validation error. */ timezone: number | string; /** * Birth latitude in decimal degrees. Accepted for consistency with the other birth-data endpoints and does not affect any part of a BaZi chart. Defaults to 0. */ latitude?: number; /** * Birth longitude in decimal degrees. Positive is East, negative is West. Required when hourClock is "local-mean" or "solar", which shift the hour branch to the sun over the birth place; omitting it in either case returns 400. Ignored when hourClock is "clock". */ longitude?: number; /** * Which instant starts the sexagenary DAY, which only matters for a birth between 23:00 and 23:59. "midnight" is the classical position of the Ming compendium San Ming Tong Hui: the day turns at 00:00 and 23:00 to 23:59 is the late zi hour of the day that is ending, so the hour stem is taken from that day. "early-zi" turns the whole day at 23:00, the practice in Hong Kong, Taiwan and much of South East Asia. "split-zi" is the compromise most software implements and the default here: the day still turns at 00:00, but the hour stem is taken from the next day. The three give three different answers for a late-evening birth and identical answers for every other birth. */ dayBoundary?: 'split-zi' | 'midnight' | 'early-zi'; /** * Which instant starts the sexagenary YEAR. "li-chun" is Beginning of Spring, around 4 February, and is the classical rule every BaZi text uses, so it is the default on this endpoint. "lunar-new-year" is the folk rule people mean when they say which animal they are, and it falls between late January and late February. The two disagree for any birth in the weeks between them: 14 February 2026 is a Wood Snake year under lunar-new-year and a Fire Horse year under li-chun. */ yearBoundary?: 'li-chun' | 'lunar-new-year'; /** * Which clock the HOUR branch is read from. "clock" is civil time exactly as a birth certificate records it, which is what most calculators use and the default here. "local-mean" shifts to the mean sun over the birth longitude, a correction of up to 59 minutes at the edge of a wide time zone. "solar" adds the equation of time on top of that, up to a further 16 minutes. Both non-civil options need "longitude" in the request and return 400 without it. */ hourClock?: 'clock' | 'local-mean' | 'solar'; /** * Gregorian year to read against the natal chart. The annual pillar for that year is resolved under the same year boundary the request selected, so a li-chun reading and a lunar-new-year reading of the same calendar year can differ. */ year: number; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/chinese-astrology/bazi/annual-forecast'; }; export type CalculateAnnualForecastErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type CalculateAnnualForecastError = CalculateAnnualForecastErrors[keyof CalculateAnnualForecastErrors]; export type CalculateAnnualForecastResponses = { /** * Annual pillar, its relation to the Day Master, and the natal interactions */ 200: { /** * Echo of the birth moment the chart was computed from. */ birthData: { /** * Birth date in YYYY-MM-DD format. Sets the year, month and day pillars. The year pillar turns at Beginning of Spring rather than on 1 January, and the month pillar turns at each of the twelve minor solar terms rather than at a calendar month boundary. */ date: string; /** * Birth time in 24-hour HH:MM:SS format. Sets the hour pillar, which is one of the four and carries the whole picture of later life and offspring. Each Earthly Branch covers two hours, so a birth within a few minutes of an odd hour can land in either. All four pillars are read in the local clock of the birth, and the day boundary is applied in that same clock; only the lunisolar calendar date itself is a world constant, fixed at UTC plus 8 so one instant has one Chinese date everywhere. */ time: string; /** * Decimal UTC offset the chart was computed with, resolved from whatever the request sent. An IANA name is resolved to the offset in force on the birth date, so this is the literal number applied and never the name. */ timezone: number; /** * Birth latitude in decimal degrees. Accepted for consistency with the other birth-data endpoints and does not affect any part of a BaZi chart. Defaults to 0. */ latitude?: number; /** * Birth longitude in decimal degrees. Positive is East, negative is West. Required when hourClock is "local-mean" or "solar", which shift the hour branch to the sun over the birth place; omitting it in either case returns 400. Ignored when hourClock is "clock". */ longitude?: number; }; /** * The three school conventions this result was computed under. Returned on every BaZi response so a chart is self-describing: two calculators can produce different pillars for one birth and both be correct, and this object says which reading you are holding. */ conventions: { /** * Day-boundary school actually applied. Echoes the request, or the default when it was omitted. Always English, whatever the lang parameter says, so it stays safe to compare against in code. */ dayBoundary: 'split-zi' | 'midnight' | 'early-zi'; /** * Year-boundary school actually applied. Echoes the request, or the default when it was omitted. */ yearBoundary: 'li-chun' | 'lunar-new-year'; /** * Hour clock actually applied. Echoes the request, or the default when omitted. */ hourClock: 'clock' | 'local-mean' | 'solar'; }; /** * Echo of the year requested, which the annual pillar below was resolved for. */ year: number; /** * The sexagenary pillar of the year being read. */ annualPillar: { /** * Annual pillar identifier, the stem id and the branch id joined by a hyphen. */ id: string; /** * Position of the annual pillar in the sexagenary cycle, 1 to 60. */ number: number; /** * Heavenly Stem of the year. */ stem: { /** * Heavenly Stem identifier. One of jia, yi, bing, ding, wu, ji, geng, xin, ren, gui. Always English pinyin, whatever the lang parameter says, so it stays safe to compare against in code and to key a glyph table on. */ id: string; /** * The stem in hanzi. Data rather than display copy, so it is identical under every lang. */ chinese: string; /** * Tone-marked pinyin for the stem. Identical under every lang. */ pinyin: string; /** * Five-phase element of the stem. One of Wood, Fire, Earth, Metal, Water. Always English, whatever the lang parameter says. Use elementLocalized for anything a reader sees. */ element: string; /** * Element name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ elementLocalized?: string; /** * Polarity of the stem, yang or yin. The five odd stems are yang and the five even ones are yin, and this is half of what decides every Ten God relation in the chart. */ polarity: string; }; /** * Earthly Branch of the year. */ branch: { /** * Earthly Branch identifier. One of zi, chou, yin, mao, chen, si, wu, wei, shen, you, xu, hai. Always English pinyin, whatever the lang parameter says. Note that "wu" is also a stem identifier: they never share a field, so a branch id is only ever read out of a branch position. */ id: string; /** * The branch in hanzi. Identical under every lang. */ chinese: string; /** * Tone-marked pinyin for the branch. Identical under every lang. */ pinyin: string; /** * Zodiac animal of the branch. One of rat, ox, tiger, rabbit, dragon, snake, horse, goat, monkey, rooster, dog, pig. Always English, whatever the lang parameter says. Use animalLocalized for anything a reader sees. */ animal: string; /** * Zodiac animal name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ animalLocalized?: string; /** * Five-phase element of the branch. Always English, whatever the lang parameter says. Use elementLocalized for anything a reader sees. */ element: string; /** * Element name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ elementLocalized?: string; /** * Polarity of the branch, yang or yin. */ polarity: string; }; /** * Na Yin sound element of the annual pillar. */ naYin: string; /** * The Na Yin name in hanzi. Identical under every lang. */ naYinChinese: string; }; /** * Zodiac animal of the year branch. Always English, whatever the lang parameter says. Use animalLocalized for anything a reader sees. */ animal: string; /** * Display copy of the animal name in the requested language. Absent for English, so an English response is unchanged. */ animalLocalized?: string; /** * Relation the ANNUAL STEM holds to the natal Day Master. This is the single most useful line of an annual reading: it says what the year asks of the chart. */ tenGod: { /** * Ten God identifier. One of friend, rob-wealth, eating-god, hurting-officer, indirect-wealth, direct-wealth, seven-killings, direct-officer, indirect-resource, direct-resource, plus day-master in the day-stem position. Always English, whatever the lang parameter says. */ id: string; /** * Display name of the relation. Always English, whatever the lang parameter says. Use nameLocalized for anything a reader sees. */ name: string; /** * Ten God name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ nameLocalized?: string; /** * The relation in traditional hanzi. Identical under every lang. */ chinese: string; /** * Tone-marked pinyin for the relation. Identical under every lang. */ pinyin: string; /** * Which of the five cycle relations this belongs to. peer is the same element as the Day Master, output is what the Day Master generates, wealth is what it controls, influence is what controls it, resource is what generates it, and self marks the Day Master itself. Always English, whatever the lang parameter says. */ category: string; /** * One-line summary of what this relation contributes, for a compact rendering that has no room for the full meaning. */ keynote: string; }; /** * Relation the principal hidden stem of the annual branch holds to the natal Day Master, the slower half of the same reading. */ branchTenGod: { /** * Ten God identifier. One of friend, rob-wealth, eating-god, hurting-officer, indirect-wealth, direct-wealth, seven-killings, direct-officer, indirect-resource, direct-resource, plus day-master in the day-stem position. Always English, whatever the lang parameter says. */ id: string; /** * Display name of the relation. Always English, whatever the lang parameter says. Use nameLocalized for anything a reader sees. */ name: string; /** * Ten God name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ nameLocalized?: string; /** * The relation in traditional hanzi. Identical under every lang. */ chinese: string; /** * Tone-marked pinyin for the relation. Identical under every lang. */ pinyin: string; /** * Which of the five cycle relations this belongs to. peer is the same element as the Day Master, output is what the Day Master generates, wealth is what it controls, influence is what controls it, resource is what generates it, and self marks the Day Master itself. Always English, whatever the lang parameter says. */ category: string; /** * One-line summary of what this relation contributes, for a compact rendering that has no room for the full meaning. */ keynote: string; }; /** * How the annual branch stands to the NATAL YEAR branch. same is the twelve-yearly return of the birth animal, the year commonly called ben ming nian. clash, harm and punishment are the three breaking relations, and none means the two branches form no structural relation at all. Always English, whatever the lang parameter says. */ yearBranchRelation: string; /** * True when the year returns the birth animal, which is exactly the case where yearBranchRelation is same. Surfaced as its own boolean because it is the one relation most consumers render on its own. */ benMingNian: boolean; /** * What this relation between the annual branch and the natal year branch means. */ yearBranchRelationMeaning: string; /** * Every combination, clash, harm and punishment the annual pillar forms with each of the four natal pillars. Positions are named natal.year through natal.hour against annual. */ interactions: Array<{ /** * Kind of interaction. stem-combination and six-combination bind two positions, trine binds three, and clash, harm, punishment and stem-clash break them. Always English, whatever the lang parameter says. */ type: string; /** * Identifier of the pairing itself, the member ids joined by hyphens in canonical order. */ id: string; /** * The interaction named in hanzi. Identical under every lang. */ chinese: string; /** * Tone-marked pinyin for the interaction. Identical under every lang. */ pinyin: string; /** * Whether the interaction binds or breaks. harmonious for combinations and trines, challenging for clashes, harms and punishments. Always English, whatever the lang parameter says. */ quality: string; /** * The chart positions taking part, in the same order as members. On a two-person reading these are prefixed with the subject, for example personA.day. */ positions: Array; /** * The stem or branch ids taking part, in the same order as positions. */ members: Array; /** * Element the formation resolves to. Present on stem combinations and on complete trines, absent on everything else. Branch six combinations deliberately carry none: the classical sources assign transformed elements to the stem pairs and not to these, and one of the six is contested between schools. */ transformsTo?: string; /** * Class of a punishment, present on punishments only. ungrateful is the tiger, snake and monkey group, bullying the ox, dog and goat group, discourteous the rat and rabbit pair, and self a branch doubled against itself. */ variety?: string; /** * Punishments only. True when the third branch of the group is also present in the chart, which is what a complete three-punishment means. False marks the partial case, where only two of the three are in play. */ complete?: boolean; /** * What this kind of interaction does between the positions it joins. */ meaning: string; }>; /** * One-paragraph reading of what the year asks of this chart. */ summary: string; }; }; export type CalculateAnnualForecastResponse = CalculateAnnualForecastResponses[keyof CalculateAnnualForecastResponses]; export type ListZodiacAnimalsData = { body?: never; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; /** * Maximum items to return per page. Range: 1-12, default 12. */ limit?: number; /** * Number of items to skip for pagination. Default 0. */ offset?: number; }; url: '/chinese-astrology/zodiac/animals'; }; export type ListZodiacAnimalsErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type ListZodiacAnimalsError = ListZodiacAnimalsErrors[keyof ListZodiacAnimalsErrors]; export type ListZodiacAnimalsResponses = { /** * The zodiac animal catalogue. */ 200: { /** * Total animals in the cycle. Always 12; the zodiac is a closed set. */ total: number; /** * Maximum items returned for this page. */ limit: number; /** * Number of items skipped before this page. */ offset: number; /** * Animals for the current page, in cycle order. Use /zodiac/animals/{id} for the full record with strengths, weaknesses, element variants and relationship partners. */ animals: Array<{ /** * Stable machine identifier for the animal. Always English and lowercase, whatever the lang parameter says, so it stays safe to compare against in code. Use nameLocalized for anything a reader sees. The twelve ids are rat, ox, tiger, rabbit, dragon, snake, horse, goat, monkey, rooster, dog, pig. */ id: string; /** * Display name of the animal in English. Always English, whatever the lang parameter says, so it stays safe to compare against in code. Use nameLocalized for anything a reader sees. */ name: string; /** * Animal name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ nameLocalized?: string; /** * Traditional hanzi character for the animal itself, not for its Earthly Branch. Data rather than a translation, so it is identical under every lang. */ chinese: string; /** * Tone-marked Hanyu Pinyin for the animal name. Data rather than a translation, so it is identical under every lang. */ pinyin: string; /** * Earthly Branch this animal names, as its pinyin identifier. The twelve branches are zi, chou, yin, mao, chen, si, wu, wei, shen, you, xu, hai, and they run in the same order as the animals. Every animal element, polarity and double-hour is a property of this branch. */ branch: string; /** * Fixed Five Element (Wu Xing) phase of the animal own branch: Wood, Fire, Earth, Metal or Water. This never changes for a sign. It is NOT the year phase that makes a Metal Rat differ from a Water Rat, which comes from the year Heavenly Stem. Always English so it stays safe to compare against and to key colours off. */ element: string; /** * Five Element phase name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ elementLocalized?: string; /** * Yin or yang polarity of the branch. The twelve branches alternate, starting yang at zi, so the six odd-numbered animals are yang and the six even-numbered are yin. */ polarity: string; /** * Short trait keywords for the sign, lowercase in English. Built for tag clouds, sign cards and compatibility widgets that need a glanceable character sketch rather than a paragraph. */ traits: Array; }>; }; }; export type ListZodiacAnimalsResponse = ListZodiacAnimalsResponses[keyof ListZodiacAnimalsResponses]; export type GetZodiacAnimalData = { body?: never; path: { /** * Animal id, case-insensitive and punctuation-insensitive. One of rat, ox, tiger, rabbit, dragon, snake, horse, goat, monkey, rooster, dog, pig. The sheep and the ram are the same animal as the goat and resolve to goat. */ id: 'rat' | 'ox' | 'tiger' | 'rabbit' | 'dragon' | 'snake' | 'horse' | 'goat' | 'monkey' | 'rooster' | 'dog' | 'pig'; }; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/chinese-astrology/zodiac/animals/{id}'; }; export type GetZodiacAnimalErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetZodiacAnimalError = GetZodiacAnimalErrors[keyof GetZodiacAnimalErrors]; export type GetZodiacAnimalResponses = { /** * Full animal profile. */ 200: { /** * Stable machine identifier for the animal. Always English and lowercase, whatever the lang parameter says, so it stays safe to compare against in code. Use nameLocalized for anything a reader sees. The twelve ids are rat, ox, tiger, rabbit, dragon, snake, horse, goat, monkey, rooster, dog, pig. */ id: string; /** * Display name of the animal in English. Always English, whatever the lang parameter says, so it stays safe to compare against in code. Use nameLocalized for anything a reader sees. */ name: string; /** * Animal name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ nameLocalized?: string; /** * Traditional hanzi character for the animal itself, not for its Earthly Branch. Data rather than a translation, so it is identical under every lang. */ chinese: string; /** * Tone-marked Hanyu Pinyin for the animal name. Data rather than a translation, so it is identical under every lang. */ pinyin: string; /** * Earthly Branch this animal names, as its pinyin identifier. The twelve branches are zi, chou, yin, mao, chen, si, wu, wei, shen, you, xu, hai, and they run in the same order as the animals. Every animal element, polarity and double-hour is a property of this branch. */ branch: string; /** * Fixed Five Element (Wu Xing) phase of the animal own branch: Wood, Fire, Earth, Metal or Water. This never changes for a sign. It is NOT the year phase that makes a Metal Rat differ from a Water Rat, which comes from the year Heavenly Stem. Always English so it stays safe to compare against and to key colours off. */ element: string; /** * Five Element phase name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ elementLocalized?: string; /** * Yin or yang polarity of the branch. The twelve branches alternate, starting yang at zi, so the six odd-numbered animals are yang and the six even-numbered are yin. */ polarity: string; /** * Short trait keywords for the sign, lowercase in English. Built for tag clouds, sign cards and compatibility widgets that need a glanceable character sketch rather than a paragraph. */ traits: Array; /** * Character sketch of the sign, drawn from the season, the double-hour and the phase its branch occupies. */ summary: string; /** * What the sign does well, as full sentences rather than keywords. */ strengths: Array; /** * Where the same temperament costs the sign something. Each one is the shadow of a strength above rather than an unrelated flaw. */ weaknesses: Array; /** * How the sign behaves toward the other eleven in general. For a specific pair, call /zodiac/compatibility/{sign1}/{sign2}. */ compatibilitySummary: string; /** * The two-hour period of the day this animal branch governs. Used for the hour pillar in a Four Pillars chart, which is always read on local time. */ hours: { /** * First hour of the double-hour this branch governs, on a 24-hour local clock. The zi branch starts at 23, so the cycle begins the evening before midnight. */ start: number; /** * Hour the double-hour ends, exclusive, on a 24-hour local clock. Each branch governs exactly two hours. */ end: number; }; /** * The three-harmony group (San He) this animal belongs to. Every animal belongs to exactly one. */ trine: { /** * Machine id of the trine: first, second, third or fourth. Always English. */ id: string; /** * Position of the trine in the order the tradition lists them, 1 to 4. Not a ranking. */ number: number; /** * Fixed Five Element (Wu Xing) phase of the animal own branch: Wood, Fire, Earth, Metal or Water. This never changes for a sign. It is NOT the year phase that makes a Metal Rat differ from a Water Rat, which comes from the year Heavenly Stem. Always English so it stays safe to compare against and to key colours off. */ element: string; /** * Five Element phase name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ elementLocalized?: string; /** * The three Earthly Branches of the trine in classical notation, in the order the texts give them. */ chinese: string; /** * Tone-marked pinyin of the three branches. */ pinyin: string; /** * The three animal ids in this trine, including the one requested. Members sit four branches apart, so the four trines partition all twelve animals with none shared and none left over. */ members: Array; /** * What the alliance is traditionally said to produce. The three branches combine into the element above, which is not any one member own phase. */ theme: string; }; /** * The six-harmony partner (Liu He), traditionally called the secret friend because the support it gives arrives unasked. The element is the phase the two branches combine into, which is generally neither animal own phase. */ secretFriend: { /** * Stable machine identifier for the animal. Always English and lowercase, whatever the lang parameter says, so it stays safe to compare against in code. Use nameLocalized for anything a reader sees. The twelve ids are rat, ox, tiger, rabbit, dragon, snake, horse, goat, monkey, rooster, dog, pig. */ id: string; /** * Display name of the related animal in English. Always English; use nameLocalized for display. */ name: string; /** * Animal name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ nameLocalized?: string; /** * Traditional hanzi character for the related animal. */ chinese: string; /** * Tone-marked pinyin for the related animal. */ pinyin: string; /** * Fixed Five Element (Wu Xing) phase of the animal own branch: Wood, Fire, Earth, Metal or Water. This never changes for a sign. It is NOT the year phase that makes a Metal Rat differ from a Water Rat, which comes from the year Heavenly Stem. Always English so it stays safe to compare against and to key colours off. */ element: string; /** * Five Element phase name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ elementLocalized?: string; }; /** * The clashing animal (Liu Chong): the branch directly opposite, six positions away. The tradition reads this as the most charged pairing in the cycle and the least restful. */ clashPartner: { /** * Stable machine identifier for the animal. Always English and lowercase, whatever the lang parameter says, so it stays safe to compare against in code. Use nameLocalized for anything a reader sees. The twelve ids are rat, ox, tiger, rabbit, dragon, snake, horse, goat, monkey, rooster, dog, pig. */ id: string; /** * Display name of the related animal in English. Always English; use nameLocalized for display. */ name: string; /** * Animal name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ nameLocalized?: string; /** * Traditional hanzi character for the related animal. */ chinese: string; /** * Tone-marked pinyin for the related animal. */ pinyin: string; }; /** * The harming animal (Liu Hai). Treated as less violent than a clash and harder to spot, because it works through accumulation rather than confrontation. */ harmPartner: { /** * Stable machine identifier for the animal. Always English and lowercase, whatever the lang parameter says, so it stays safe to compare against in code. Use nameLocalized for anything a reader sees. The twelve ids are rat, ox, tiger, rabbit, dragon, snake, horse, goat, monkey, rooster, dog, pig. */ id: string; /** * Display name of the related animal in English. Always English; use nameLocalized for display. */ name: string; /** * Animal name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ nameLocalized?: string; /** * Traditional hanzi character for the related animal. */ chinese: string; /** * Tone-marked pinyin for the related animal. */ pinyin: string; }; /** * The five phase variants of this sign across the sixty-year cycle, listed over 1924 to 2043. Exactly five, always, because a branch pairs only with the five Heavenly Stems of its own polarity and those five carry one phase each. A year number here names the sexagenary year, not a calendar range: a birth in January or early February may still belong to the previous year, which is what /zodiac/sign resolves. */ elementVariants: Array<{ /** * Fixed Five Element (Wu Xing) phase of the animal own branch: Wood, Fire, Earth, Metal or Water. This never changes for a sign. It is NOT the year phase that makes a Metal Rat differ from a Water Rat, which comes from the year Heavenly Stem. Always English so it stays safe to compare against and to key colours off. */ element: string; /** * Five Element phase name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ elementLocalized?: string; /** * Yin or yang polarity of the branch. The twelve branches alternate, starting yang at zi, so the six odd-numbered animals are yang and the six even-numbered are yin. */ polarity: string; /** * Heavenly Stem of the year, as its pinyin identifier. The ten stems are jia, yi, bing, ding, wu, ji, geng, xin, ren, gui. */ stem: string; /** * Sexagenary pillar id for this variant, stem then branch. This pair returns once every sixty years. */ pillar: string; /** * Gregorian years in the published window that carry this variant. Two per variant, sixty years apart. */ years: Array; }>; }; }; export type GetZodiacAnimalResponse = GetZodiacAnimalResponses[keyof GetZodiacAnimalResponses]; export type CalculateZodiacAnimalData = { body: { /** * Birth date in YYYY-MM-DD format. Only the date is needed: the zodiac animal is a property of the year, so no time, timezone or place changes the answer. */ date: string; /** * Which instant starts the zodiac year. lunar-new-year is the folk rule and the default on this route, because it is the rule people mean when they say what animal they are: the sign turns on Chinese New Year, between late January and late February. li-chun is the classical rule every Four Pillars text uses, turning the year at the solar term Beginning of Spring around 4 February. The two agree for roughly eleven months of every year and disagree for the weeks between them, so a 14 February 2026 birth is a Snake under lunar-new-year and a Horse under li-chun. The BaZi routes default to li-chun instead, because a chart and a folk sign are answering different questions. */ yearBoundary?: 'lunar-new-year' | 'li-chun'; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/chinese-astrology/zodiac/sign'; }; export type CalculateZodiacAnimalErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type CalculateZodiacAnimalError = CalculateZodiacAnimalErrors[keyof CalculateZodiacAnimalErrors]; export type CalculateZodiacAnimalResponses = { /** * The zodiac animal for this birth date. */ 200: { /** * Echo of the birth date the answer was resolved from. */ date: string; /** * The zodiac animal for this date. The element on this block is the animal own fixed branch phase, which for a Horse is always Fire. The year phase is the sibling element field below. */ animal: { /** * Stable machine identifier for the animal. Always English and lowercase, whatever the lang parameter says, so it stays safe to compare against in code. Use nameLocalized for anything a reader sees. The twelve ids are rat, ox, tiger, rabbit, dragon, snake, horse, goat, monkey, rooster, dog, pig. */ id: string; /** * Display name of the animal in English. Always English, whatever the lang parameter says, so it stays safe to compare against in code. Use nameLocalized for anything a reader sees. */ name: string; /** * Animal name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ nameLocalized?: string; /** * Traditional hanzi character for the animal itself, not for its Earthly Branch. Data rather than a translation, so it is identical under every lang. */ chinese: string; /** * Tone-marked Hanyu Pinyin for the animal name. Data rather than a translation, so it is identical under every lang. */ pinyin: string; /** * Earthly Branch this animal names, as its pinyin identifier. The twelve branches are zi, chou, yin, mao, chen, si, wu, wei, shen, you, xu, hai, and they run in the same order as the animals. Every animal element, polarity and double-hour is a property of this branch. */ branch: string; /** * Fixed Five Element (Wu Xing) phase of the animal own branch: Wood, Fire, Earth, Metal or Water. This never changes for a sign. It is NOT the year phase that makes a Metal Rat differ from a Water Rat, which comes from the year Heavenly Stem. Always English so it stays safe to compare against and to key colours off. */ element: string; /** * Five Element phase name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ elementLocalized?: string; /** * Yin or yang polarity of the branch. The twelve branches alternate, starting yang at zi, so the six odd-numbered animals are yang and the six even-numbered are yin. */ polarity: string; }; /** * The sexagenary year the date falls in, under the resolved boundary. Stem and branch together repeat once every sixty years. */ yearPillar: { /** * Sexagenary year pillar id, Heavenly Stem then Earthly Branch. Always English pinyin. */ id: string; /** * Position of this pillar in the sixty-year sexagenary cycle, 1 to 60, where jia-zi is 1. */ number: number; /** * Heavenly Stem of the year, as its pinyin identifier. */ stem: string; /** * Earthly Branch of the year, as its pinyin identifier. This is the branch the animal names. */ branch: string; }; /** * Five Element phase of the year Heavenly Stem. This is what distinguishes a Metal Horse from a Fire Horse and it changes every two years. It is NOT the animal own fixed phase, which sits on the animal block above. Always English so it stays safe to compare against. */ element: string; /** * Five Element phase name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ elementLocalized?: string; /** * Yin or yang polarity of the branch. The twelve branches alternate, starting yang at zi, so the six odd-numbered animals are yang and the six even-numbered are yin. */ polarity: string; /** * Composed reading of the sign under its year phase. The sign contributes the temperament and the phase contributes the register. */ interpretation: string; /** * The school parameters this answer was computed under, echoed so the result is self-describing. */ conventions: { /** * The year boundary actually applied, whether it was requested or defaulted. Store this beside any sign you persist: the same date resolves to two different animals under the two schools, and a sign with no convention recorded cannot be reproduced. */ yearBoundary: string; }; }; }; export type CalculateZodiacAnimalResponse = CalculateZodiacAnimalResponses[keyof CalculateZodiacAnimalResponses]; export type GetZodiacCompatibilityData = { body?: never; path: { /** * First animal id, case-insensitive. One of rat, ox, tiger, rabbit, dragon, snake, horse, goat, monkey, rooster, dog, pig. */ sign1: 'rat' | 'ox' | 'tiger' | 'rabbit' | 'dragon' | 'snake' | 'horse' | 'goat' | 'monkey' | 'rooster' | 'dog' | 'pig'; /** * Second animal id, case-insensitive. The relation is symmetric, so swapping the two returns the same relationship and the same score, with the reading written from the first sign point of view. */ sign2: 'rat' | 'ox' | 'tiger' | 'rabbit' | 'dragon' | 'snake' | 'horse' | 'goat' | 'monkey' | 'rooster' | 'dog' | 'pig'; }; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/chinese-astrology/zodiac/compatibility/{sign1}/{sign2}'; }; export type GetZodiacCompatibilityErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetZodiacCompatibilityError = GetZodiacCompatibilityErrors[keyof GetZodiacCompatibilityErrors]; export type GetZodiacCompatibilityResponses = { /** * Compatibility between the two signs. */ 200: { /** * The two signs compared, in the order they were requested. Always one object, never an array. */ signs: { first: { /** * Stable machine identifier for the animal. Always English and lowercase, whatever the lang parameter says, so it stays safe to compare against in code. Use nameLocalized for anything a reader sees. The twelve ids are rat, ox, tiger, rabbit, dragon, snake, horse, goat, monkey, rooster, dog, pig. */ id: string; /** * Display name of the animal in English. Always English, whatever the lang parameter says, so it stays safe to compare against in code. Use nameLocalized for anything a reader sees. */ name: string; /** * Animal name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ nameLocalized?: string; /** * Traditional hanzi character for the animal itself, not for its Earthly Branch. Data rather than a translation, so it is identical under every lang. */ chinese: string; /** * Tone-marked Hanyu Pinyin for the animal name. Data rather than a translation, so it is identical under every lang. */ pinyin: string; /** * Earthly Branch this animal names, as its pinyin identifier. The twelve branches are zi, chou, yin, mao, chen, si, wu, wei, shen, you, xu, hai, and they run in the same order as the animals. Every animal element, polarity and double-hour is a property of this branch. */ branch: string; /** * Fixed Five Element (Wu Xing) phase of the animal own branch: Wood, Fire, Earth, Metal or Water. This never changes for a sign. It is NOT the year phase that makes a Metal Rat differ from a Water Rat, which comes from the year Heavenly Stem. Always English so it stays safe to compare against and to key colours off. */ element: string; /** * Five Element phase name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ elementLocalized?: string; /** * Yin or yang polarity of the branch. The twelve branches alternate, starting yang at zi, so the six odd-numbered animals are yang and the six even-numbered are yin. */ polarity: string; }; second: { /** * Stable machine identifier for the animal. Always English and lowercase, whatever the lang parameter says, so it stays safe to compare against in code. Use nameLocalized for anything a reader sees. The twelve ids are rat, ox, tiger, rabbit, dragon, snake, horse, goat, monkey, rooster, dog, pig. */ id: string; /** * Display name of the animal in English. Always English, whatever the lang parameter says, so it stays safe to compare against in code. Use nameLocalized for anything a reader sees. */ name: string; /** * Animal name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ nameLocalized?: string; /** * Traditional hanzi character for the animal itself, not for its Earthly Branch. Data rather than a translation, so it is identical under every lang. */ chinese: string; /** * Tone-marked Hanyu Pinyin for the animal name. Data rather than a translation, so it is identical under every lang. */ pinyin: string; /** * Earthly Branch this animal names, as its pinyin identifier. The twelve branches are zi, chou, yin, mao, chen, si, wu, wei, shen, you, xu, hai, and they run in the same order as the animals. Every animal element, polarity and double-hour is a property of this branch. */ branch: string; /** * Fixed Five Element (Wu Xing) phase of the animal own branch: Wood, Fire, Earth, Metal or Water. This never changes for a sign. It is NOT the year phase that makes a Metal Rat differ from a Water Rat, which comes from the year Heavenly Stem. Always English so it stays safe to compare against and to key colours off. */ element: string; /** * Five Element phase name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ elementLocalized?: string; /** * Yin or yang polarity of the branch. The twelve branches alternate, starting yang at zi, so the six odd-numbered animals are yang and the six even-numbered are yin. */ polarity: string; }; }; /** * Which of the six classical branch relations the pair stands in. One of secret-friend (Liu He, the six harmonies), trine (San He, the three harmonies), same (both signs share a branch), neutral (no formal relation), harm (Liu Hai) or clash (Liu Chong, branches six apart). Exactly one applies to any pair, because no two of the conditions can hold at once. Always English so it stays safe to switch on. */ relationship: string; /** * Display name of the relation in English. Always English; use relationshipNameLocalized for anything a reader sees. */ relationshipName: string; /** * Branch relation name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ relationshipNameLocalized?: string; /** * Classical name of the relation in traditional hanzi. Identical under every lang. */ relationshipChinese: string; /** * Tone-marked pinyin of the classical relation name. */ relationshipPinyin: string; /** * Compatibility score out of 100 for this relation. Fixed per relation rather than per pair, because the branch relation is what the tradition actually rates: 92 for a six-harmony pair, 85 for a trine, 65 for two of the same sign, 60 for no relation, 40 for a harm and 30 for a clash. */ score: number; /** * Coarse band the score falls in: excellent, strong, workable, challenging or difficult. Built for badges and filters that should not hard-code score thresholds. */ verdict: string; /** * The Five Element phase the two branches combine into. Present only for a trine or a six-harmony pair, which are the two relations that combine; absent otherwise. This is generally neither animal own phase, which is the point of the combination. */ sharedElement?: string; /** * Five Element phase name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ sharedElementLocalized?: string; /** * Composed reading of the pair. The branch relation supplies the shape and the two temperaments supply the substance, so the reading is specific to this pair without being authored for it. */ summary: string; /** * What the pair has going for it, drawn from what each sign does well. Favourable relations contribute from both signs; the rest from the first. */ strengths: Array; /** * Where the pair is most likely to grind, drawn from each sign own weaknesses. Difficult relations contribute from both signs; the rest from the first. */ frictions: Array; /** * The one thing worth doing differently, specific to this relation rather than generic relationship guidance. */ advice: string; }; }; export type GetZodiacCompatibilityResponse = GetZodiacCompatibilityResponses[keyof GetZodiacCompatibilityResponses]; export type GetDailyZodiacReadingData = { body?: never; path: { /** * Animal id, case-insensitive. One of rat, ox, tiger, rabbit, dragon, snake, horse, goat, monkey, rooster, dog, pig. */ id: 'rat' | 'ox' | 'tiger' | 'rabbit' | 'dragon' | 'snake' | 'horse' | 'goat' | 'monkey' | 'rooster' | 'dog' | 'pig'; }; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; /** * Reading date in YYYY-MM-DD format. Past and future dates are both supported, for editorial scheduling and backfill. Defaults to the current day in the timezone parameter. */ date?: string; /** * Selects which day counts as current when date is omitted. Defaults to UTC, so the reading rolls over at 00:00 UTC each day. Pass the timezone of the end user to roll over on their local clock instead. Ignored when date is set. Accepts an IANA name (e.g. "America/New_York"), decimal hours (e.g. 5.5 for IST), or a fixed UTC offset (e.g. "-05:00"). */ timezone?: string; }; url: '/chinese-astrology/zodiac/{id}/daily'; }; export type GetDailyZodiacReadingErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetDailyZodiacReadingError = GetDailyZodiacReadingErrors[keyof GetDailyZodiacReadingErrors]; export type GetDailyZodiacReadingResponses = { /** * The daily reading for this sign. */ 200: { /** * The sign this reading was requested for. */ animal: { /** * Machine identifier of the sign this reading is for. Always English and lowercase, so it stays safe to compare against in code. */ id: string; /** * Display name of the sign in English. Always English; use nameLocalized for anything a reader sees. */ name: string; /** * Animal name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ nameLocalized?: string; /** * Traditional hanzi character for the animal. Identical under every lang. */ chinese: string; /** * Tone-marked pinyin for the animal name. */ pinyin: string; /** * Earthly Branch this animal names, as its pinyin identifier. */ branch: string; /** * Fixed Five Element phase of the sign own branch. Always English so it stays safe to compare against. */ element: string; /** * Five Element phase name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ elementLocalized?: string; /** * Yin or yang polarity of the branch. */ polarity: string; }; /** * Date of this reading in YYYY-MM-DD format. Echoes the date requested, or the current day in the timezone parameter when it was omitted. */ date: string; /** * The sexagenary pillar of this calendar day, evaluated at the reference meridian for the Chinese calendar. */ dayPillar: { /** * Sexagenary day pillar id, Heavenly Stem then Earthly Branch. Always English pinyin. */ id: string; /** * Position of this pillar in the sixty-day sexagenary cycle, 1 to 60, where jia-zi is 1. The day cycle runs unbroken and is independent of the lunar and solar calendars. */ number: number; /** * Heavenly Stem of the day, as its pinyin identifier. */ stem: string; /** * Earthly Branch of the day, as its pinyin identifier. */ branch: string; /** * The animal the day branch carries, which the tradition calls the day animal. This is what the requested sign is being read against. */ animal: string; /** * Five Element phase of the day Heavenly Stem. Together with the sign own phase this sets the energy rating, through the classical generating and controlling cycles. */ element: string; }; /** * How the day branch stands to the sign branch. One of secret-friend, trine, same, neutral, harm or clash. Exactly one applies, because no two of the conditions can hold at once. Always English so it stays safe to switch on, and the same vocabulary /zodiac/compatibility returns. */ relationship: string; /** * Overall energy for this sign on this day, 1 to 10. Derived from the branch relation plus how the day phase treats the sign phase on the generating and controlling cycles, so a favourable relation in a draining phase lands lower than a favourable relation in a supporting one. Built for content widgets and visual indicators. */ energyRating: number; /** * What the day does to this sign, from the branch relation and the phase of the day stem. */ overview: string; /** * Relationship guidance for the day, specific to the branch relation. */ love: string; /** * Work guidance for the day. Clash and harm days carry the traditional cautions about signings and launches. */ career: string; /** * The one thing worth doing differently today, drawn from the relation and from this sign own habitual weak point. */ advice: string; /** * The sexagenary year this date falls in, resolved on the LUNAR NEW YEAR rule to match the folk zodiac this route family answers. The Four Pillars routes use the classical Li Chun rule and can name a different year for dates in early February. */ year: { /** * Sexagenary year pillar in force on this date, resolved on the lunar new year rule. */ pillar: string; /** * Animal of the year in force. Always English so it stays safe to compare against. */ animal: string; /** * Animal name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat its canonical partner field exactly. Never compare against this value, compare against the canonical field beside it. */ animalLocalized?: string; /** * How the year branch stands to the requested sign, from the same six-value vocabulary as the daily relationship. This is the slower background the day sits inside. */ relationship: string; /** * One line on the year relationship, or on the Ben Ming Nian year when the year animal matches the sign. */ note: string; }; /** * True when the year animal is the same as the requested sign, the return of your own branch that comes round every twelve years. The tradition treats a Ben Ming Nian as a year to be deliberate in rather than one to fear, because the sign own qualities run at full strength and that cuts both ways. */ benMingNian: boolean; }; }; export type GetDailyZodiacReadingResponse = GetDailyZodiacReadingResponses[keyof GetDailyZodiacReadingResponses]; export type ListSolarTermsData = { body?: never; path: { /** * Solar year, 1900 to 2100. The year opens at Li Chun rather than on 1 January, so its last two terms fall in the following January. */ year: number; }; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/chinese-astrology/calendar/solar-terms/{year}'; }; export type ListSolarTermsErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type ListSolarTermsError = ListSolarTermsErrors[keyof ListSolarTermsErrors]; export type ListSolarTermsResponses = { /** * The 24 solar terms of the year, in chronological order from Li Chun. */ 200: { /** * Echo of the solar year requested. */ year: number; /** * Decimal UTC offset of the reference meridian the local fields are given at. Fixed at 8 for the Chinese calendar. */ referenceOffset: number; /** * Number of terms returned, which is always 24. */ total: number; terms: Array<{ /** * Solar term identifier in kebab case pinyin. Always English pinyin, whatever the lang parameter says, because the English names are not standardised and would not be safe to compare against. */ id: string; /** * Display name of the term. Several English renderings are in circulation, so treat this as a label and the id as the value. */ name: string; /** * The term in Chinese. A data field, identical in every language. */ chinese: string; /** * Tone marked pinyin for the characters. */ pinyin: string; /** * Apparent solar longitude in degrees that defines the term. A multiple of 15, and the only thing about a term that is not a convention. */ longitude: number; /** * Either minor or major. The month pillar changes at the twelve MINOR terms, and a lunar month containing no MAJOR term is the leap month. */ type: string; /** * The instant the sun reaches the longitude, in UTC. */ instantUtc: string; /** * Calendar date of the instant at the reference meridian. This is the date printed in an almanac. */ localDate: string; /** * Time of day of the instant at the reference meridian. */ localTime: string; }>; }; }; export type ListSolarTermsResponse = ListSolarTermsResponses[keyof ListSolarTermsResponses]; export type CalculateLunarDateData = { /** * Send a Gregorian date to convert forward, or a lunar year, month and day to convert back. The two sides are exclusive, which is why the whole body carries one example rather than leaving the per field ones to be read together. */ body?: { /** * Gregorian date to convert to the lunisolar calendar. Send this OR the lunar fields, never both. */ date?: string; /** * Lunisolar year to convert back to a Gregorian date. Requires lunarMonth and lunarDay. */ lunarYear?: number; /** * Lunar month, 1 to 12. Requires lunarYear and lunarDay. */ lunarMonth?: number; /** * Day of the lunar month, 1 to 30. Requires lunarYear and lunarMonth. */ lunarDay?: number; /** * Set true to address the leap repetition of lunarMonth rather than the first pass. Requesting a leap month a year does not have returns 400. */ isLeapMonth?: boolean; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/chinese-astrology/calendar/lunar-date'; }; export type CalculateLunarDateErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type CalculateLunarDateError = CalculateLunarDateErrors[keyof CalculateLunarDateErrors]; export type CalculateLunarDateResponses = { /** * The converted date, in both calendars. */ 200: { /** * The Gregorian date, echoed when one was sent and computed when the lunar fields were. Echoes the request, or the current UTC date when neither side was supplied. */ gregorianDate: string; lunar: { /** * Lunisolar year. It advances on the first day of month 1, not at Li Chun, so it can lag the Gregorian year by up to seven weeks. */ year: number; /** * Lunar month, 1 to 12. A leap month repeats the number of the month it follows. */ month: number; /** * Day of the lunar month, 1 to 30. A lunar month never has 31 days. */ day: number; /** * True when this is the leap repetition of the month number rather than the first pass through it. */ isLeapMonth: boolean; /** * Days in this lunar month, 29 for a short month or 30 for a long one. It is the interval between two new moons, so it varies month to month. */ monthLength: number; /** * The Gregorian date this lunar day covers, evaluated at the reference meridian. */ date: string; }; /** * The month this lunisolar year repeats, when it has thirteen months. Absent in a twelve month year, so a caller can branch on presence rather than on a sentinel. */ leapMonthOfYear?: number; /** * Decimal UTC offset the calendar was evaluated at. Fixed at 8, which is what makes a Chinese lunar date a world constant. */ referenceOffset: number; }; }; export type CalculateLunarDateResponse = CalculateLunarDateResponses[keyof CalculateLunarDateResponses]; export type GetAlmanacDayData = { body?: never; path: { /** * Gregorian date in YYYY-MM-DD format, evaluated at the reference meridian. Years 1900 to 2100. */ date: string; }; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/chinese-astrology/calendar/day/{date}'; }; export type GetAlmanacDayErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * The date is outside the supported range. */ 404: { /** * Human-readable error message. The wording may change, so do not parse it programmatically. Switch on the stable code instead. */ error: string; /** * Machine-readable error code. Stable identifier for programmatic error handling. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself. The same URL in every environment, so it is safe to log, print in a CLI, or paste into a bug report. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetAlmanacDayError = GetAlmanacDayErrors[keyof GetAlmanacDayErrors]; export type GetAlmanacDayResponses = { /** * The almanac reading for the day. */ 200: { /** * The Gregorian date of the day, at the reference meridian. */ date: string; lunar: { /** * Lunisolar year. It advances on the first day of month 1, not at Li Chun, so it can lag the Gregorian year by up to seven weeks. */ year: number; /** * Lunar month, 1 to 12. A leap month repeats the number of the month it follows. */ month: number; /** * Day of the lunar month, 1 to 30. A lunar month never has 31 days. */ day: number; /** * True when this is the leap repetition of the month number rather than the first pass through it. */ isLeapMonth: boolean; /** * Days in this lunar month, 29 for a short month or 30 for a long one. It is the interval between two new moons, so it varies month to month. */ monthLength: number; /** * The Gregorian date this lunar day covers, evaluated at the reference meridian. */ date: string; }; /** * Sexagenary year pillar of the day. Attributed by whole days, so the day Li Chun falls on belongs to the new year for its whole length. A BaZi chart built from a birth TIME uses the term instant instead, so a birth in the hours before the term on that same day carries the previous year pillar. */ yearPillar: { /** * Pillar identifier as stem-branch, e.g. jia-zi. Always English pinyin, whatever the lang parameter says, so it stays safe to compare against in code. */ id: string; /** * Position in the sixty year cycle, 1 to 60. jia-zi is 1 and gui-hai is 60. */ number: number; /** * Heavenly Stem of the pillar, one of jia yi bing ding wu ji geng xin ren gui. */ stem: string; /** * Earthly Branch of the pillar, one of zi chou yin mao chen si wu wei shen you xu hai. */ branch: string; /** * The pillar in Chinese characters. A data field, identical in every language. */ chinese: string; /** * Na Yin sound element of the pillar. It is a property of the pair, not of the stem, so it often names a different phase from the stem itself. */ naYin: string; /** * Five phase the Na Yin resolves to. Always English, so it stays safe to compare against in code. */ naYinElement: string; }; /** * Sexagenary month pillar of the day, and the pillar the day officer is counted from. Attributed by whole days like the year pillar, so the day a minor solar term falls on belongs to the new month even when the term arrives late in the evening. This is what an almanac prints, and it is not the same as the month pillar of a birth moment inside that day. */ monthPillar: { /** * Pillar identifier as stem-branch, e.g. jia-zi. Always English pinyin, whatever the lang parameter says, so it stays safe to compare against in code. */ id: string; /** * Position in the sixty year cycle, 1 to 60. jia-zi is 1 and gui-hai is 60. */ number: number; /** * Heavenly Stem of the pillar, one of jia yi bing ding wu ji geng xin ren gui. */ stem: string; /** * Earthly Branch of the pillar, one of zi chou yin mao chen si wu wei shen you xu hai. */ branch: string; /** * The pillar in Chinese characters. A data field, identical in every language. */ chinese: string; /** * Na Yin sound element of the pillar. It is a property of the pair, not of the stem, so it often names a different phase from the stem itself. */ naYin: string; /** * Five phase the Na Yin resolves to. Always English, so it stays safe to compare against in code. */ naYinElement: string; }; dayPillar: { /** * Pillar identifier as stem-branch, e.g. jia-zi. Always English pinyin, whatever the lang parameter says, so it stays safe to compare against in code. */ id: string; /** * Position in the sixty year cycle, 1 to 60. jia-zi is 1 and gui-hai is 60. */ number: number; /** * Heavenly Stem of the pillar, one of jia yi bing ding wu ji geng xin ren gui. */ stem: string; /** * Earthly Branch of the pillar, one of zi chou yin mao chen si wu wei shen you xu hai. */ branch: string; /** * The pillar in Chinese characters. A data field, identical in every language. */ chinese: string; /** * Na Yin sound element of the pillar. It is a property of the pair, not of the stem, so it often names a different phase from the stem itself. */ naYin: string; /** * Five phase the Na Yin resolves to. Always English, so it stays safe to compare against in code. */ naYinElement: string; }; dayOfficer: { /** * Day officer identifier, one of jian chu man ping ding zhi po wei cheng shou kai bi. Always English pinyin, so it stays safe to compare against in code. */ id: string; /** * Display name of the officer in the requested language. Absent when lang is en, so an English response is unchanged. */ nameLocalized?: string; /** * English display name of the officer. Canonical, identical in every language, so it stays safe to compare against in code. The translation is in nameLocalized. */ name: string; /** * The officer in Chinese. A data field, identical in every language. */ chinese: string; /** * Tone marked pinyin for the character. */ pinyin: string; /** * Whether the officer falls on the auspicious or the inauspicious side of the coarse yellow and black split. Read favours and avoids for what the day actually rules on. */ quality: string; /** * What the officer means, in the terms a date choice uses it in. */ meaning: string; }; mansion: { /** * Mansion number, 1 to 28, counted from the Horn. This is the identifier: three mansions share the pinyin wei and two share bi, so there is no unique pinyin key. */ number: number; /** * English display name of the mansion. Canonical, identical in every language. The translation is in nameLocalized. Note the mansion has no string id: number is the stable 1 to 28 key, because five of the 28 share a pinyin spelling. */ name: string; /** * Display name of the mansion in the requested language. Absent when lang is en, and absent when a language has no entry for this mansion, so a caller falls back to name rather than rendering a blank. */ nameLocalized?: string; /** * The mansion in Chinese. A data field, identical in every language. */ chinese: string; /** * Tone marked pinyin for the character. */ pinyin: string; /** * One of the four palaces, seven mansions each: azure-dragon, black-tortoise, white-tiger, vermilion-bird. Always English, so it stays safe to compare against in code. */ palace: string; /** * The luminary the mansion belongs to, one of Wood Metal Earth Sun Moon Fire Water. Twenty eight mansions over seven luminaries is four weeks exactly, which is why a mansion always falls on the same weekday. */ planet: string; /** * Animal emblem of the mansion, the third character of its full Chinese name. English and canonical, identical in every language, matching how clashAnimal behaves on the same response. The translation is in animalLocalized. */ animal: string; /** * Animal emblem in the requested language. Absent when lang is en, and absent when a language has no entry, so a caller falls back to animal. */ animalLocalized?: string; }; /** * The zodiac animal the day clashes with, which is the animal six branches away from the day branch. Anyone born in that animal year traditionally avoids the day for anything important. */ clashAnimal: string; /** * Display name of the clashing animal in the requested language. Absent when lang is en, so an English response is unchanged. */ clashAnimalLocalized?: string; /** * Activity identifiers, always English kebab case so they stay safe to compare against in code. Use the /calendar/auspicious-days endpoint to search a date range for one of them. */ favours: Array; /** * Activity identifiers, always English kebab case so they stay safe to compare against in code. Use the /calendar/auspicious-days endpoint to search a date range for one of them. */ avoids: Array; }; }; export type GetAlmanacDayResponse = GetAlmanacDayResponses[keyof GetAlmanacDayResponses]; export type GetMonthlyAlmanacData = { body?: never; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; /** * Gregorian year, 1900 to 2100. Defaults to the current UTC year when omitted, together with month. */ year?: number; /** * Gregorian month, 1 to 12. Defaults to the current UTC month when omitted, together with year. */ month?: number; }; url: '/chinese-astrology/calendar/monthly'; }; export type GetMonthlyAlmanacErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetMonthlyAlmanacError = GetMonthlyAlmanacErrors[keyof GetMonthlyAlmanacErrors]; export type GetMonthlyAlmanacResponses = { /** * Every day of the month, with the solar terms it contains. */ 200: { /** * Year of the month returned. Echoes the year requested, or the current UTC year when it was omitted. */ year: number; /** * Month returned, 1 to 12. Echoes the month requested, or the current UTC month when it was omitted. */ month: number; /** * Number of days in the month. */ total: number; solarTerms: Array<{ /** * Solar term identifier in kebab case pinyin. */ id: string; /** * Display name of the term. */ name: string; /** * Either minor or major. A minor term inside the month is where the month pillar changes and where the day officer repeats for a day. */ type: string; /** * Date the term falls on at the reference meridian. */ date: string; /** * The exact instant of the term, in UTC. */ instantUtc: string; }>; /** * Every day of the month, in order. */ days: Array<{ /** * The Gregorian date of the day, at the reference meridian. */ date: string; lunar: { /** * Lunisolar year. It advances on the first day of month 1, not at Li Chun, so it can lag the Gregorian year by up to seven weeks. */ year: number; /** * Lunar month, 1 to 12. A leap month repeats the number of the month it follows. */ month: number; /** * Day of the lunar month, 1 to 30. A lunar month never has 31 days. */ day: number; /** * True when this is the leap repetition of the month number rather than the first pass through it. */ isLeapMonth: boolean; /** * Days in this lunar month, 29 for a short month or 30 for a long one. It is the interval between two new moons, so it varies month to month. */ monthLength: number; /** * The Gregorian date this lunar day covers, evaluated at the reference meridian. */ date: string; }; /** * Sexagenary year pillar of the day. Attributed by whole days, so the day Li Chun falls on belongs to the new year for its whole length. A BaZi chart built from a birth TIME uses the term instant instead, so a birth in the hours before the term on that same day carries the previous year pillar. */ yearPillar: { /** * Pillar identifier as stem-branch, e.g. jia-zi. Always English pinyin, whatever the lang parameter says, so it stays safe to compare against in code. */ id: string; /** * Position in the sixty year cycle, 1 to 60. jia-zi is 1 and gui-hai is 60. */ number: number; /** * Heavenly Stem of the pillar, one of jia yi bing ding wu ji geng xin ren gui. */ stem: string; /** * Earthly Branch of the pillar, one of zi chou yin mao chen si wu wei shen you xu hai. */ branch: string; /** * The pillar in Chinese characters. A data field, identical in every language. */ chinese: string; /** * Na Yin sound element of the pillar. It is a property of the pair, not of the stem, so it often names a different phase from the stem itself. */ naYin: string; /** * Five phase the Na Yin resolves to. Always English, so it stays safe to compare against in code. */ naYinElement: string; }; /** * Sexagenary month pillar of the day, and the pillar the day officer is counted from. Attributed by whole days like the year pillar, so the day a minor solar term falls on belongs to the new month even when the term arrives late in the evening. This is what an almanac prints, and it is not the same as the month pillar of a birth moment inside that day. */ monthPillar: { /** * Pillar identifier as stem-branch, e.g. jia-zi. Always English pinyin, whatever the lang parameter says, so it stays safe to compare against in code. */ id: string; /** * Position in the sixty year cycle, 1 to 60. jia-zi is 1 and gui-hai is 60. */ number: number; /** * Heavenly Stem of the pillar, one of jia yi bing ding wu ji geng xin ren gui. */ stem: string; /** * Earthly Branch of the pillar, one of zi chou yin mao chen si wu wei shen you xu hai. */ branch: string; /** * The pillar in Chinese characters. A data field, identical in every language. */ chinese: string; /** * Na Yin sound element of the pillar. It is a property of the pair, not of the stem, so it often names a different phase from the stem itself. */ naYin: string; /** * Five phase the Na Yin resolves to. Always English, so it stays safe to compare against in code. */ naYinElement: string; }; dayPillar: { /** * Pillar identifier as stem-branch, e.g. jia-zi. Always English pinyin, whatever the lang parameter says, so it stays safe to compare against in code. */ id: string; /** * Position in the sixty year cycle, 1 to 60. jia-zi is 1 and gui-hai is 60. */ number: number; /** * Heavenly Stem of the pillar, one of jia yi bing ding wu ji geng xin ren gui. */ stem: string; /** * Earthly Branch of the pillar, one of zi chou yin mao chen si wu wei shen you xu hai. */ branch: string; /** * The pillar in Chinese characters. A data field, identical in every language. */ chinese: string; /** * Na Yin sound element of the pillar. It is a property of the pair, not of the stem, so it often names a different phase from the stem itself. */ naYin: string; /** * Five phase the Na Yin resolves to. Always English, so it stays safe to compare against in code. */ naYinElement: string; }; dayOfficer: { /** * Day officer identifier, one of jian chu man ping ding zhi po wei cheng shou kai bi. Always English pinyin, so it stays safe to compare against in code. */ id: string; /** * Display name of the officer in the requested language. Absent when lang is en, so an English response is unchanged. */ nameLocalized?: string; /** * English display name of the officer. Canonical, identical in every language, so it stays safe to compare against in code. The translation is in nameLocalized. */ name: string; /** * The officer in Chinese. A data field, identical in every language. */ chinese: string; /** * Tone marked pinyin for the character. */ pinyin: string; /** * Whether the officer falls on the auspicious or the inauspicious side of the coarse yellow and black split. Read favours and avoids for what the day actually rules on. */ quality: string; /** * What the officer means, in the terms a date choice uses it in. */ meaning: string; }; mansion: { /** * Mansion number, 1 to 28, counted from the Horn. This is the identifier: three mansions share the pinyin wei and two share bi, so there is no unique pinyin key. */ number: number; /** * English display name of the mansion. Canonical, identical in every language. The translation is in nameLocalized. Note the mansion has no string id: number is the stable 1 to 28 key, because five of the 28 share a pinyin spelling. */ name: string; /** * Display name of the mansion in the requested language. Absent when lang is en, and absent when a language has no entry for this mansion, so a caller falls back to name rather than rendering a blank. */ nameLocalized?: string; /** * The mansion in Chinese. A data field, identical in every language. */ chinese: string; /** * Tone marked pinyin for the character. */ pinyin: string; /** * One of the four palaces, seven mansions each: azure-dragon, black-tortoise, white-tiger, vermilion-bird. Always English, so it stays safe to compare against in code. */ palace: string; /** * The luminary the mansion belongs to, one of Wood Metal Earth Sun Moon Fire Water. Twenty eight mansions over seven luminaries is four weeks exactly, which is why a mansion always falls on the same weekday. */ planet: string; /** * Animal emblem of the mansion, the third character of its full Chinese name. English and canonical, identical in every language, matching how clashAnimal behaves on the same response. The translation is in animalLocalized. */ animal: string; /** * Animal emblem in the requested language. Absent when lang is en, and absent when a language has no entry, so a caller falls back to animal. */ animalLocalized?: string; }; /** * The zodiac animal the day clashes with, which is the animal six branches away from the day branch. Anyone born in that animal year traditionally avoids the day for anything important. */ clashAnimal: string; /** * Display name of the clashing animal in the requested language. Absent when lang is en, so an English response is unchanged. */ clashAnimalLocalized?: string; /** * Activity identifiers, always English kebab case so they stay safe to compare against in code. Use the /calendar/auspicious-days endpoint to search a date range for one of them. */ favours: Array; /** * Activity identifiers, always English kebab case so they stay safe to compare against in code. Use the /calendar/auspicious-days endpoint to search a date range for one of them. */ avoids: Array; }>; }; }; export type GetMonthlyAlmanacResponse = GetMonthlyAlmanacResponses[keyof GetMonthlyAlmanacResponses]; export type LookupAuspiciousDaysData = { body: { /** * Activity to choose a date for. One of wedding, travel, moving-house, opening-business, signing-contracts, construction, groundbreaking, burial, medical-treatment, praying. Matching folds case and punctuation, so moving-house and MOVING_HOUSE both resolve. */ activity: 'wedding' | 'travel' | 'moving-house' | 'opening-business' | 'signing-contracts' | 'construction' | 'groundbreaking' | 'burial' | 'medical-treatment' | 'praying'; /** * First date of the range to search, inclusive. */ startDate: string; /** * Last date of the range to search, inclusive. The range may not exceed 93 days. */ endDate: string; /** * Zodiac animal to protect. Days that clash with this animal are dropped from the results, which is how a date is chosen around the people attending rather than in the abstract. One of rat, ox, tiger, rabbit, dragon, snake, horse, goat, monkey, rooster, dog, pig. */ avoidAnimal?: 'rat' | 'ox' | 'tiger' | 'rabbit' | 'dragon' | 'snake' | 'horse' | 'goat' | 'monkey' | 'rooster' | 'dog' | 'pig'; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/chinese-astrology/calendar/auspicious-days'; }; export type LookupAuspiciousDaysErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type LookupAuspiciousDaysError = LookupAuspiciousDaysErrors[keyof LookupAuspiciousDaysErrors]; export type LookupAuspiciousDaysResponses = { /** * The favoured days inside the range. */ 200: { /** * Echo of the activity searched for, folded to its canonical identifier. */ activity: string; /** * Display label for the activity in the requested language. */ activityLabel: string; /** * Echo of the first date of the range. */ startDate: string; /** * Echo of the last date of the range. */ endDate: string; /** * Number of days in the range, counting both ends. */ daysSearched: number; /** * Echo of the animal protected. Absent when none was sent, rather than null. */ avoidAnimal?: string; /** * Display name of the protected animal in the requested language, beside the avoidAnimal identifier. Absent when no animal was sent and absent when lang is en, so an English response is unchanged. */ avoidAnimalLocalized?: string; /** * Number of favoured days found. This is the count after the clash filter, not the number of days searched. */ total: number; /** * The favoured days, in date order. */ days: Array<{ /** * The Gregorian date of the day, at the reference meridian. */ date: string; lunar: { /** * Lunisolar year. It advances on the first day of month 1, not at Li Chun, so it can lag the Gregorian year by up to seven weeks. */ year: number; /** * Lunar month, 1 to 12. A leap month repeats the number of the month it follows. */ month: number; /** * Day of the lunar month, 1 to 30. A lunar month never has 31 days. */ day: number; /** * True when this is the leap repetition of the month number rather than the first pass through it. */ isLeapMonth: boolean; /** * Days in this lunar month, 29 for a short month or 30 for a long one. It is the interval between two new moons, so it varies month to month. */ monthLength: number; /** * The Gregorian date this lunar day covers, evaluated at the reference meridian. */ date: string; }; /** * Sexagenary year pillar of the day. Attributed by whole days, so the day Li Chun falls on belongs to the new year for its whole length. A BaZi chart built from a birth TIME uses the term instant instead, so a birth in the hours before the term on that same day carries the previous year pillar. */ yearPillar: { /** * Pillar identifier as stem-branch, e.g. jia-zi. Always English pinyin, whatever the lang parameter says, so it stays safe to compare against in code. */ id: string; /** * Position in the sixty year cycle, 1 to 60. jia-zi is 1 and gui-hai is 60. */ number: number; /** * Heavenly Stem of the pillar, one of jia yi bing ding wu ji geng xin ren gui. */ stem: string; /** * Earthly Branch of the pillar, one of zi chou yin mao chen si wu wei shen you xu hai. */ branch: string; /** * The pillar in Chinese characters. A data field, identical in every language. */ chinese: string; /** * Na Yin sound element of the pillar. It is a property of the pair, not of the stem, so it often names a different phase from the stem itself. */ naYin: string; /** * Five phase the Na Yin resolves to. Always English, so it stays safe to compare against in code. */ naYinElement: string; }; /** * Sexagenary month pillar of the day, and the pillar the day officer is counted from. Attributed by whole days like the year pillar, so the day a minor solar term falls on belongs to the new month even when the term arrives late in the evening. This is what an almanac prints, and it is not the same as the month pillar of a birth moment inside that day. */ monthPillar: { /** * Pillar identifier as stem-branch, e.g. jia-zi. Always English pinyin, whatever the lang parameter says, so it stays safe to compare against in code. */ id: string; /** * Position in the sixty year cycle, 1 to 60. jia-zi is 1 and gui-hai is 60. */ number: number; /** * Heavenly Stem of the pillar, one of jia yi bing ding wu ji geng xin ren gui. */ stem: string; /** * Earthly Branch of the pillar, one of zi chou yin mao chen si wu wei shen you xu hai. */ branch: string; /** * The pillar in Chinese characters. A data field, identical in every language. */ chinese: string; /** * Na Yin sound element of the pillar. It is a property of the pair, not of the stem, so it often names a different phase from the stem itself. */ naYin: string; /** * Five phase the Na Yin resolves to. Always English, so it stays safe to compare against in code. */ naYinElement: string; }; dayPillar: { /** * Pillar identifier as stem-branch, e.g. jia-zi. Always English pinyin, whatever the lang parameter says, so it stays safe to compare against in code. */ id: string; /** * Position in the sixty year cycle, 1 to 60. jia-zi is 1 and gui-hai is 60. */ number: number; /** * Heavenly Stem of the pillar, one of jia yi bing ding wu ji geng xin ren gui. */ stem: string; /** * Earthly Branch of the pillar, one of zi chou yin mao chen si wu wei shen you xu hai. */ branch: string; /** * The pillar in Chinese characters. A data field, identical in every language. */ chinese: string; /** * Na Yin sound element of the pillar. It is a property of the pair, not of the stem, so it often names a different phase from the stem itself. */ naYin: string; /** * Five phase the Na Yin resolves to. Always English, so it stays safe to compare against in code. */ naYinElement: string; }; dayOfficer: { /** * Day officer identifier, one of jian chu man ping ding zhi po wei cheng shou kai bi. Always English pinyin, so it stays safe to compare against in code. */ id: string; /** * Display name of the officer in the requested language. Absent when lang is en, so an English response is unchanged. */ nameLocalized?: string; /** * English display name of the officer. Canonical, identical in every language, so it stays safe to compare against in code. The translation is in nameLocalized. */ name: string; /** * The officer in Chinese. A data field, identical in every language. */ chinese: string; /** * Tone marked pinyin for the character. */ pinyin: string; /** * Whether the officer falls on the auspicious or the inauspicious side of the coarse yellow and black split. Read favours and avoids for what the day actually rules on. */ quality: string; /** * What the officer means, in the terms a date choice uses it in. */ meaning: string; }; mansion: { /** * Mansion number, 1 to 28, counted from the Horn. This is the identifier: three mansions share the pinyin wei and two share bi, so there is no unique pinyin key. */ number: number; /** * English display name of the mansion. Canonical, identical in every language. The translation is in nameLocalized. Note the mansion has no string id: number is the stable 1 to 28 key, because five of the 28 share a pinyin spelling. */ name: string; /** * Display name of the mansion in the requested language. Absent when lang is en, and absent when a language has no entry for this mansion, so a caller falls back to name rather than rendering a blank. */ nameLocalized?: string; /** * The mansion in Chinese. A data field, identical in every language. */ chinese: string; /** * Tone marked pinyin for the character. */ pinyin: string; /** * One of the four palaces, seven mansions each: azure-dragon, black-tortoise, white-tiger, vermilion-bird. Always English, so it stays safe to compare against in code. */ palace: string; /** * The luminary the mansion belongs to, one of Wood Metal Earth Sun Moon Fire Water. Twenty eight mansions over seven luminaries is four weeks exactly, which is why a mansion always falls on the same weekday. */ planet: string; /** * Animal emblem of the mansion, the third character of its full Chinese name. English and canonical, identical in every language, matching how clashAnimal behaves on the same response. The translation is in animalLocalized. */ animal: string; /** * Animal emblem in the requested language. Absent when lang is en, and absent when a language has no entry, so a caller falls back to animal. */ animalLocalized?: string; }; /** * The zodiac animal the day clashes with, which is the animal six branches away from the day branch. Anyone born in that animal year traditionally avoids the day for anything important. */ clashAnimal: string; /** * Display name of the clashing animal in the requested language. Absent when lang is en, so an English response is unchanged. */ clashAnimalLocalized?: string; /** * Activity identifiers, always English kebab case so they stay safe to compare against in code. Use the /calendar/auspicious-days endpoint to search a date range for one of them. */ favours: Array; /** * Activity identifiers, always English kebab case so they stay safe to compare against in code. Use the /calendar/auspicious-days endpoint to search a date range for one of them. */ avoids: Array; }>; }; }; export type LookupAuspiciousDaysResponse = LookupAuspiciousDaysResponses[keyof LookupAuspiciousDaysResponses]; export type ListFiveElementsData = { body?: never; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; /** * Maximum items to return per page. Range: 1-5, default 5. */ limit?: number; /** * Number of items to skip for pagination. Default 0. */ offset?: number; }; url: '/chinese-astrology/elements'; }; export type ListFiveElementsErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type ListFiveElementsError = ListFiveElementsErrors[keyof ListFiveElementsErrors]; export type ListFiveElementsResponses = { /** * The five phases with both cycles. */ 200: { /** * Total number of phases, which is always five. */ total: number; /** * Maximum phases returned in this page. */ limit: number; /** * Number of phases skipped before this page. */ offset: number; /** * The producing ring in order. Each phase generates the next and the last generates the first, so the list wraps. */ generatingCycle: Array; /** * The restraining ring in order. Each phase controls the next and the last controls the first, so this list wraps too. It is the same five phases walked two steps at a time. */ controllingCycle: Array; /** * The phases for this page, in generating cycle order. */ elements: Array<{ /** * Five phase identifier. Always English, whatever the lang parameter says, so it stays safe to compare against in code. The same five values appear on stems, branches, pillars, Na Yin and every feng shui star. */ id: string; /** * Display name of the phase in the requested language. Absent when lang is en, so an English response is unchanged. */ nameLocalized?: string; /** * Chinese character for the phase. A data field, identical in every language. */ chinese: string; /** * Tone marked pinyin for the character. A data field, identical in every language. */ pinyin: string; /** * Season the phase governs. Earth governs the transitions rather than a season of its own, and is reported as Late Summer. */ season: string; /** * Compass direction of the phase. Earth returns Center, because it sits at the middle of the arrangement rather than on the ring. */ direction: string; /** * The phase this one produces in the generating cycle. Wood feeds Fire, Fire makes Earth, Earth bears Metal, Metal condenses Water, Water grows Wood. */ generates: string; /** * The phase that produces this one. The inverse of the generates field. */ generatedBy: string; /** * The phase this one restrains in the controlling cycle. Wood breaks Earth, Earth dams Water, Water quenches Fire, Fire melts Metal, Metal cuts Wood. */ controls: string; /** * The phase that restrains this one. The inverse of the controls field. */ controlledBy: string; /** * The two Heavenly Stems that carry this phase, yang first. Every phase has exactly two, which is why ten stems cover five phases. */ stems: Array; /** * The Earthly Branches that carry this phase. Wood, Fire, Metal and Water take two each and Earth takes four, the branches that sit between the seasons. */ branches: Array; /** * What the phase is and how it behaves, in the terms a reading uses it in. Translated in place. */ meaning: string; }>; }; }; export type ListFiveElementsResponse = ListFiveElementsResponses[keyof ListFiveElementsResponses]; export type CalculateKuaNumberData = { body?: { /** * Birth date in YYYY-MM-DD format. Only the Chinese YEAR this date falls in enters the formula, so no birth time, latitude or longitude is needed. A January or early February birthday is the case that matters: it usually belongs to the PREVIOUS Chinese year and produces a different Kua. A date is read at the start of its day, and the boundary falls part-way through its own day, so a birth date landing exactly on the boundary day is placed in the outgoing year. */ date: string; /** * Selects the Kua formula variant. The two formulas are different arithmetic on the same year, and they also differ in where a raw result of 5 is reassigned. */ gender: 'male' | 'female'; /** * Which boundary starts the Chinese year. Defaults to li-chun, the astronomical start of spring in early February, which is the classical position and the one feng shui uses for periods, annual stars and afflictions alike. Send lunar-new-year to match popular zodiac tables, which start the year two to four weeks later. The two disagree for anyone born between the two dates. */ yearBoundary?: 'li-chun' | 'lunar-new-year'; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/feng-shui/kua'; }; export type CalculateKuaNumberErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type CalculateKuaNumberError = CalculateKuaNumberErrors[keyof CalculateKuaNumberErrors]; export type CalculateKuaNumberResponses = { /** * Kua number, life group, personal trigram and all eight classified sectors */ 200: { /** * Kua number, 1 to 9 excluding 5. This is the value every other feng shui calculation about a person keys on. */ kua: number; /** * The formula output before any reassignment. Equal to kua except when the formula produced 5, which has no trigram and no direction and must be moved. */ rawKua: number; /** * Whether the raw result was 5 and had to be moved onto a trigram, to 2 for a man and to 8 for a woman. */ reassigned: boolean; /** * Echo of the sex sent, which selected the formula variant. */ gender: string; /** * Life group, east or west. East group Kuas are 1, 3, 4 and 9 and share North, East, Southeast and South as their favourable sectors; west group Kuas are 2, 6, 7 and 8 and share Northeast, Southwest, West and Northwest. Always English, safe to compare against. */ group: string; /** * The Chinese year the birth date fell in under the boundary applied. This is the year the formula actually used, which is the previous calendar year for an early-in-the-year birthday. */ solarYear: number; /** * Calendar date of the boundary that decided the year, computed astronomically rather than assumed. Li Chun is commonly quoted as 4 February and lands on the 3rd or the 5th in roughly one year in four. */ boundaryDate: string; trigram: { /** * Trigram number, 1 to 8, the same identifier the I-Ching trigram endpoints use. It is a lookup key, not a ranking. */ number: number; /** * Chinese character for the trigram. Data, identical in every language. */ chinese: string; /** * English name of the trigram, byte identical to the English value the I-Ching trigram endpoints publish for this number. Always English here, whatever the lang parameter says, so it stays safe to compare against. Use nameLocalized for anything a reader sees. */ english: string; /** * Trigram name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat english exactly. Never compare against this value. */ nameLocalized?: string; /** * Tone-marked pinyin for the trigram. Data, identical in every language. */ pinyin: string; /** * Unicode trigram symbol, for rendering a Bagua diagram without an icon set. */ symbol: string; /** * Three lines bottom to top, 1 for yang and 0 for yin. The Eight Mansions classification of any sector is decided by which of these three lines differ from your own trigram. */ binary: string; /** * Five phase of this entry: Wood, Fire, Earth, Metal or Water. Always English so it stays safe to compare against and to key styling on. The full cycles live on the Chinese astrology elements endpoint. */ element: string; /** * Five phase name in the requested language, for display only. Present only when lang is set to a language other than English. Never compare against this value. */ elementLocalized?: string; /** * Compass sector, one of North, Northeast, East, Southeast, South, Southwest, West, Northwest. Always English, whatever the lang parameter says, so it stays safe to compare against in code and against the same value on the I-Ching trigram endpoints. */ direction: string; /** * Compass sector in the requested language, for display only, the same word the composed readings use. Present only when lang is set to a language other than English. Never compare against this value. */ directionLocalized?: string; /** * Family role of the trigram. Read alongside an affliction to know which member of the household a sector points at. Always English, and it carries no localized sibling: no vocabulary this package ships names the eight family roles. */ familyMember: string; }; /** * All eight sectors classified for this Kua, in compass order from North. Exactly four are auspicious and four are inauspicious, and the two sets partition the compass. Call the eight mansions endpoint for the same map with full readings and ranked placement guidance. */ sectors: Array<{ /** * Compass sector, one of North, Northeast, East, Southeast, South, Southwest, West, Northwest. Always English, whatever the lang parameter says, so it stays safe to compare against in code and against the same value on the I-Ching trigram endpoints. */ direction: string; /** * Eight Mansions star for this sector, one of sheng-chi, tian-yi, yan-nian, fu-wei, huo-hai, wu-gui, liu-sha, jue-ming. Always English, safe to compare against and to key styling on. */ star: string; /** * Display name of the star. Always English, whatever the lang parameter says. Use starNameLocalized for anything a reader sees. */ starName: string; /** * Star name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat starName exactly. Never compare against this value. */ starNameLocalized?: string; /** * Whether the sector helps or harms: auspicious or inauspicious. */ nature: string; /** * Order within its nature, 1 to 4. Among auspicious sectors 1 is the strongest; among inauspicious sectors 1 is the mildest and 4 the most serious, which is what tells you which affliction to accept when no favourable sector is reachable. */ rank: number; /** * The life domain this sector governs, in a few words, written in the requested language. */ domain: string; }>; conventions: { /** * Which boundary decided the Chinese year for this calculation. li-chun starts the year at the astronomical start of spring, in early February, and is the classical position that feng shui uses throughout. lunar-new-year starts it at the first day of the lunar year, which is usually two to four weeks later and is what most popular zodiac tables use. Echoes the resolved value, whether it was sent or defaulted. */ yearBoundary: string; }; }; }; export type CalculateKuaNumberResponse = CalculateKuaNumberResponses[keyof CalculateKuaNumberResponses]; export type GetKuaNumberData = { body?: never; path: { /** * Kua number, 1 to 9. */ number: number; }; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/feng-shui/kua/{number}'; }; export type GetKuaNumberErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * No Kua chart for that number */ 404: { /** * Human-readable error message. The wording may change, so do not parse it programmatically. Switch on the stable code instead. */ error: string; /** * Machine-readable error code. Stable identifier for programmatic error handling. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself. The same URL in every environment, so it is safe to log, print in a CLI, or paste into a bug report. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetKuaNumberError = GetKuaNumberErrors[keyof GetKuaNumberErrors]; export type GetKuaNumberResponses = { /** * Kua reference chart with trigram, life group and eight classified sectors */ 200: { /** * Kua number, 1 to 9. */ number: number; /** * Life group, east or west. Always English, safe to compare against and to key styling on. */ group: string; trigram: { /** * Trigram number, 1 to 8, the same identifier the I-Ching trigram endpoints use. It is a lookup key, not a ranking. */ number: number; /** * Chinese character for the trigram. Data, identical in every language. */ chinese: string; /** * English name of the trigram, byte identical to the English value the I-Ching trigram endpoints publish for this number. Always English here, whatever the lang parameter says, so it stays safe to compare against. Use nameLocalized for anything a reader sees. */ english: string; /** * Trigram name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat english exactly. Never compare against this value. */ nameLocalized?: string; /** * Tone-marked pinyin for the trigram. Data, identical in every language. */ pinyin: string; /** * Unicode trigram symbol, for rendering a Bagua diagram without an icon set. */ symbol: string; /** * Three lines bottom to top, 1 for yang and 0 for yin. The Eight Mansions classification of any sector is decided by which of these three lines differ from your own trigram. */ binary: string; /** * Five phase of this entry: Wood, Fire, Earth, Metal or Water. Always English so it stays safe to compare against and to key styling on. The full cycles live on the Chinese astrology elements endpoint. */ element: string; /** * Five phase name in the requested language, for display only. Present only when lang is set to a language other than English. Never compare against this value. */ elementLocalized?: string; /** * Compass sector, one of North, Northeast, East, Southeast, South, Southwest, West, Northwest. Always English, whatever the lang parameter says, so it stays safe to compare against in code and against the same value on the I-Ching trigram endpoints. */ direction: string; /** * Compass sector in the requested language, for display only, the same word the composed readings use. Present only when lang is set to a language other than English. Never compare against this value. */ directionLocalized?: string; /** * Family role of the trigram. Read alongside an affliction to know which member of the household a sector points at. Always English, and it carries no localized sibling: no vocabulary this package ships names the eight family roles. */ familyMember: string; }; /** * All eight sectors classified for this Kua, in compass order from North. */ sectors: Array<{ /** * Compass sector, one of North, Northeast, East, Southeast, South, Southwest, West, Northwest. Always English, whatever the lang parameter says, so it stays safe to compare against in code and against the same value on the I-Ching trigram endpoints. */ direction: string; /** * Eight Mansions star for this sector, one of sheng-chi, tian-yi, yan-nian, fu-wei, huo-hai, wu-gui, liu-sha, jue-ming. Always English, safe to compare against and to key styling on. */ star: string; /** * Display name of the star. Always English, whatever the lang parameter says. Use starNameLocalized for anything a reader sees. */ starName: string; /** * Star name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat starName exactly. Never compare against this value. */ starNameLocalized?: string; /** * Whether the sector helps or harms: auspicious or inauspicious. */ nature: string; /** * Order within its nature, 1 to 4. Among auspicious sectors 1 is the strongest; among inauspicious sectors 1 is the mildest and 4 the most serious, which is what tells you which affliction to accept when no favourable sector is reachable. */ rank: number; /** * The life domain this sector governs, in a few words, written in the requested language. */ domain: string; }>; }; }; export type GetKuaNumberResponse = GetKuaNumberResponses[keyof GetKuaNumberResponses]; export type GenerateEightMansionsData = { /** * Send either a kua number, or a date and gender to derive one. Sending neither is a 400. */ body?: { /** * Kua number to build the map for, if you already have one. Send this OR date and gender, not neither. A Kua of 5 is read as the Kua 2 chart, since 5 has no direction of its own. */ kua?: number; /** * Birth date in YYYY-MM-DD format, used to derive the Kua when no kua is sent. Requires gender alongside it. A date is read at the start of its day, so a birth date landing exactly on the year boundary is placed in the outgoing year. */ date?: string; /** * Selects the Kua formula variant. Required when the Kua is being derived from a birth date. */ gender?: 'male' | 'female'; /** * Which boundary starts the Chinese year when the Kua is derived from a birth date. Defaults to li-chun, the classical position. Ignored when a kua is sent directly, and echoed back either way. */ yearBoundary?: 'li-chun' | 'lunar-new-year'; /** * Optional compass sector the main door faces, one of North, Northeast, East, Southeast, South, Southwest, West, Northwest. When sent, the response names the star sitting on that sector so a caller can judge an entrance without scanning the whole map. */ facing?: 'North' | 'Northeast' | 'East' | 'Southeast' | 'South' | 'Southwest' | 'West' | 'Northwest'; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/feng-shui/eight-mansions'; }; export type GenerateEightMansionsErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GenerateEightMansionsError = GenerateEightMansionsErrors[keyof GenerateEightMansionsErrors]; export type GenerateEightMansionsResponses = { /** * Eight classified sectors ordered best to worst, with readings */ 200: { /** * The Kua number this map was built for. */ kua: number; /** * Life group, east or west. Always English, safe to compare against and to key styling on. */ group: string; trigram: { /** * Trigram number, 1 to 8, the same identifier the I-Ching trigram endpoints use. It is a lookup key, not a ranking. */ number: number; /** * Chinese character for the trigram. Data, identical in every language. */ chinese: string; /** * English name of the trigram, byte identical to the English value the I-Ching trigram endpoints publish for this number. Always English here, whatever the lang parameter says, so it stays safe to compare against. Use nameLocalized for anything a reader sees. */ english: string; /** * Trigram name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat english exactly. Never compare against this value. */ nameLocalized?: string; /** * Tone-marked pinyin for the trigram. Data, identical in every language. */ pinyin: string; /** * Unicode trigram symbol, for rendering a Bagua diagram without an icon set. */ symbol: string; /** * Three lines bottom to top, 1 for yang and 0 for yin. The Eight Mansions classification of any sector is decided by which of these three lines differ from your own trigram. */ binary: string; /** * Five phase of this entry: Wood, Fire, Earth, Metal or Water. Always English so it stays safe to compare against and to key styling on. The full cycles live on the Chinese astrology elements endpoint. */ element: string; /** * Five phase name in the requested language, for display only. Present only when lang is set to a language other than English. Never compare against this value. */ elementLocalized?: string; /** * Compass sector, one of North, Northeast, East, Southeast, South, Southwest, West, Northwest. Always English, whatever the lang parameter says, so it stays safe to compare against in code and against the same value on the I-Ching trigram endpoints. */ direction: string; /** * Compass sector in the requested language, for display only, the same word the composed readings use. Present only when lang is set to a language other than English. Never compare against this value. */ directionLocalized?: string; /** * Family role of the trigram. Read alongside an affliction to know which member of the household a sector points at. Always English, and it carries no localized sibling: no vocabulary this package ships names the eight family roles. */ familyMember: string; }; /** * All eight sectors, ordered best to worst rather than by compass, because the question this map answers is which sector to use next. Read down the list until you reach one the building actually has. */ sectors: Array<{ /** * Compass sector, one of North, Northeast, East, Southeast, South, Southwest, West, Northwest. Always English, whatever the lang parameter says, so it stays safe to compare against in code and against the same value on the I-Ching trigram endpoints. */ direction: string; /** * Eight Mansions star for this sector. Always English, safe to compare against and to key styling on. */ star: string; /** * Display name of the star. Always English, whatever the lang parameter says. Use starNameLocalized for anything a reader sees. */ starName: string; /** * Star name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat starName exactly. Never compare against this value. */ starNameLocalized?: string; /** * Chinese characters for the star. Data, identical in every language. */ chinese: string; /** * Tone-marked pinyin for the star. Data, identical in every language. */ pinyin: string; /** * Whether the sector helps or harms: auspicious or inauspicious. */ nature: string; /** * Order within its nature, 1 to 4. Among auspicious sectors 1 is the strongest; among inauspicious sectors 1 is the mildest and 4 the most serious. */ rank: number; /** * The life domain this sector governs, in a few words, written in the requested language. */ domain: string; trigram: { /** * Trigram number, 1 to 8, the same identifier the I-Ching trigram endpoints use. It is a lookup key, not a ranking. */ number: number; /** * Chinese character for the trigram. Data, identical in every language. */ chinese: string; /** * English name of the trigram, byte identical to the English value the I-Ching trigram endpoints publish for this number. Always English here, whatever the lang parameter says, so it stays safe to compare against. Use nameLocalized for anything a reader sees. */ english: string; /** * Trigram name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat english exactly. Never compare against this value. */ nameLocalized?: string; /** * Tone-marked pinyin for the trigram. Data, identical in every language. */ pinyin: string; /** * Unicode trigram symbol, for rendering a Bagua diagram without an icon set. */ symbol: string; /** * Three lines bottom to top, 1 for yang and 0 for yin. The Eight Mansions classification of any sector is decided by which of these three lines differ from your own trigram. */ binary: string; /** * Five phase of this entry: Wood, Fire, Earth, Metal or Water. Always English so it stays safe to compare against and to key styling on. The full cycles live on the Chinese astrology elements endpoint. */ element: string; /** * Five phase name in the requested language, for display only. Present only when lang is set to a language other than English. Never compare against this value. */ elementLocalized?: string; /** * Compass sector, one of North, Northeast, East, Southeast, South, Southwest, West, Northwest. Always English, whatever the lang parameter says, so it stays safe to compare against in code and against the same value on the I-Ching trigram endpoints. */ direction: string; /** * Compass sector in the requested language, for display only, the same word the composed readings use. Present only when lang is set to a language other than English. Never compare against this value. */ directionLocalized?: string; /** * Family role of the trigram. Read alongside an affliction to know which member of the household a sector points at. Always English, and it carries no localized sibling: no vocabulary this package ships names the eight family roles. */ familyMember: string; }; /** * Composed reading for this sector: which star it holds, where that star ranks for this Kua, and what the star means in practice. */ reading: string; }>; /** * Compass sector, one of North, Northeast, East, Southeast, South, Southwest, West, Northwest. Always English, whatever the lang parameter says, so it stays safe to compare against in code and against the same value on the I-Ching trigram endpoints. */ bestSector: string; /** * Compass sector, one of North, Northeast, East, Southeast, South, Southwest, West, Northwest. Always English, whatever the lang parameter says, so it stays safe to compare against in code and against the same value on the I-Ching trigram endpoints. */ worstSector: string; /** * The classification of the sector sent as facing. Absent when no facing was sent. */ facingSector?: { /** * Compass sector, one of North, Northeast, East, Southeast, South, Southwest, West, Northwest. Always English, whatever the lang parameter says, so it stays safe to compare against in code and against the same value on the I-Ching trigram endpoints. */ direction: string; /** * Eight Mansions star sitting on the facing sector. */ star: string; /** * Whether the facing sector helps or harms for this Kua. */ nature: string; }; conventions: { /** * Which boundary decided the Chinese year for this calculation. li-chun starts the year at the astronomical start of spring, in early February, and is the classical position that feng shui uses throughout. lunar-new-year starts it at the first day of the lunar year, which is usually two to four weeks later and is what most popular zodiac tables use. Echoes the resolved value, whether it was sent or defaulted. */ yearBoundary: string; }; }; }; export type GenerateEightMansionsResponse = GenerateEightMansionsResponses[keyof GenerateEightMansionsResponses]; export type GenerateFlyingStarChartData = { body?: { /** * Construction period of the building, 1 to 9. This is the twenty year cycle the building was completed in, or last renovated heavily enough to reset, and it is fixed for the life of the building. Periods change at Li Chun in early February, so a building finished in January 2024 is a Period 8 building. Defaults to the period in force now. */ period?: number; /** * The mountain the front of the building faces, by id or by compass label such as S2. Send this or facingDegrees, not neither. The facing side is the open, active, public side, which is not always the side with the front door. */ facing?: 'ren' | 'zi' | 'gui' | 'chou' | 'gen' | 'yin' | 'jia' | 'mao' | 'yi' | 'chen' | 'xun' | 'si' | 'bing' | 'wu' | 'ding' | 'wei' | 'kun' | 'shen' | 'geng' | 'you' | 'xin' | 'xu' | 'qian' | 'hai' | 'N1' | 'N2' | 'N3' | 'NE1' | 'NE2' | 'NE3' | 'E1' | 'E2' | 'E3' | 'SE1' | 'SE2' | 'SE3' | 'S1' | 'S2' | 'S3' | 'SW1' | 'SW2' | 'SW3' | 'W1' | 'W2' | 'W3' | 'NW1' | 'NW2' | 'NW3'; /** * The compass bearing the front of the building faces, 0 to 360 degrees, measured looking out from inside. Resolved to one of the 24 mountains. Send this or facing, not neither. */ facingDegrees?: number | null; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/feng-shui/flying-stars/natal'; }; export type GenerateFlyingStarChartErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GenerateFlyingStarChartError = GenerateFlyingStarChartErrors[keyof GenerateFlyingStarChartErrors]; export type GenerateFlyingStarChartResponses = { /** * Nine palaces with period, mountain and water stars, readings and structure */ 200: { /** * The period this chart was built for. Echoes the period requested, or the period in force now when it was omitted. */ period: number; facing: { /** * Mountain id, the pinyin of the stem, branch or trigram that names it. Always English pinyin, safe to compare against. */ id: string; /** * Compass label of the mountain, sector plus position 1 to 3 clockwise. The form a facing is usually quoted in. */ label: string; /** * Chinese character for the mountain. Data, identical in every language. */ chinese: string; /** * Tone-marked pinyin for the mountain. Data, identical in every language. */ pinyin: string; /** * Compass sector, one of North, Northeast, East, Southeast, South, Southwest, West, Northwest. Always English, whatever the lang parameter says, so it stays safe to compare against in code and against the same value on the I-Ching trigram endpoints. */ direction: string; /** * Which of the three dragons the mountain holds inside its sector: earth for the first mountain clockwise, heaven for the middle, human for the last. The heaven and human dragons share a polarity, which is why they share a chart. */ yuan: string; /** * San Yuan polarity of the mountain, yang or yin, which decides whether a plate entering the centre flies forward or in reverse. This is NOT the natural polarity of the stem or branch and the two differ on eight of the 24 mountains. */ polarity: string; /** * Start of the 15 degree span, in compass degrees. Wraps past 360 for the two northernmost mountains. */ startDegree: number; /** * End of the 15 degree span, in compass degrees. */ endDegree: number; }; sitting: { /** * Mountain id, the pinyin of the stem, branch or trigram that names it. Always English pinyin, safe to compare against. */ id: string; /** * Compass label of the mountain, sector plus position 1 to 3 clockwise. The form a facing is usually quoted in. */ label: string; /** * Chinese character for the mountain. Data, identical in every language. */ chinese: string; /** * Tone-marked pinyin for the mountain. Data, identical in every language. */ pinyin: string; /** * Compass sector, one of North, Northeast, East, Southeast, South, Southwest, West, Northwest. Always English, whatever the lang parameter says, so it stays safe to compare against in code and against the same value on the I-Ching trigram endpoints. */ direction: string; /** * Which of the three dragons the mountain holds inside its sector: earth for the first mountain clockwise, heaven for the middle, human for the last. The heaven and human dragons share a polarity, which is why they share a chart. */ yuan: string; /** * San Yuan polarity of the mountain, yang or yin, which decides whether a plate entering the centre flies forward or in reverse. This is NOT the natural polarity of the stem or branch and the two differ on eight of the 24 mountains. */ polarity: string; /** * Start of the 15 degree span, in compass degrees. Wraps past 360 for the two northernmost mountains. */ startDegree: number; /** * End of the 15 degree span, in compass degrees. */ endDegree: number; }; /** * Echo of the bearing sent, when one was sent. Absent when the facing was named as a mountain instead. */ facingDegrees?: number; /** * Whether the bearing fell in the outer 3 degrees of its mountain rather than the central 9. A bearing there calls for the substitute gua construction, which is a different chart; this chart is always the down gua one, so a true value means the result needs a specialist rather than this endpoint. Always false when the facing was named as a mountain, since naming a mountain expresses no bearing. */ straddling: boolean; /** * Flying star number, 1 to 9. The number IS the identifier of the star: 8 is always the Eight White Earth star whichever plate it appears on. */ mountainCenterStar: number; /** * Flying star number, 1 to 9. The number IS the identifier of the star: 8 is always the Eight White Earth star whichever plate it appears on. */ waterCenterStar: number; /** * Whether the mountain plate flew forward or in reverse, decided by the polarity of the mountain the centre star answers to. Published because it is the step that separates two charts that otherwise look alike. */ mountainFlight: string; /** * Whether the water plate flew forward or in reverse, decided the same way against the facing mountain. */ waterFlight: string; structure: { /** * The classical verdict on the chart: prosperous-mountain-prosperous-water, reversed, double-facing or double-sitting. Always English, safe to switch on. */ id: string; /** * Display name of the structure, TRANSLATED IN PLACE under the lang parameter. Switch on structure.id, which is the stable machine value in every language. Unlike the star and formation names beside it, this field has no nameLocalized sibling. */ name: string; /** * Chinese name of the structure. Data, identical in every language. */ chinese: string; /** * What the structure means and what the classical correction for it is. */ meaning: string; }; /** * All nine palaces, centre first and then along the Lo Shu flight path. Each of the nine stars appears exactly once on each plate, which is the property that makes a chart checkable. */ palaces: Array<{ /** * Palace of the Lo Shu grid: one of the eight compass sectors, or Center. Always English, safe to compare against and to key a grid cell on. */ palace: string; /** * Flying star number, 1 to 9. The number IS the identifier of the star: 8 is always the Eight White Earth star whichever plate it appears on. */ base: number; /** * Flying star number, 1 to 9. The number IS the identifier of the star: 8 is always the Eight White Earth star whichever plate it appears on. */ period: number; /** * Flying star number, 1 to 9. The number IS the identifier of the star: 8 is always the Eight White Earth star whichever plate it appears on. */ mountain: number; /** * Flying star number, 1 to 9. The number IS the identifier of the star: 8 is always the Eight White Earth star whichever plate it appears on. */ water: number; /** * The named classical formation for this mountain and water pair. Absent for the pairs the tradition does not name, where the composed reading carries the meaning instead. */ combination?: { /** * Canonical key for the pair, lower number first, so a palace holding mountain 9 and water 8 resolves to the same entry as one holding mountain 8 and water 9. */ id: string; /** * Name of the formation. Always English, whatever the lang parameter says. Use nameLocalized for anything a reader sees. */ name: string; /** * Formation name in the requested language, for display only. Present only when lang is set to a language other than English. */ nameLocalized?: string; /** * Chinese name of the formation. Data, identical in every language. */ chinese?: string; /** * Whether the formation helps or harms. */ nature: string; }; /** * What this palace means, composed from the two stars and the phase relation between them. Named formations return their own passage; the rest are built from the star pair. */ reading: string; }>; }; }; export type GenerateFlyingStarChartResponse = GenerateFlyingStarChartResponses[keyof GenerateFlyingStarChartResponses]; export type GetAnnualFlyingStarsData = { body?: never; path: { /** * Solar year, 1900 to 2100. The year runs from Li Chun to Li Chun, so a date in January belongs to the previous year here. */ year: number; }; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/feng-shui/flying-stars/annual/{year}'; }; export type GetAnnualFlyingStarsErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetAnnualFlyingStarsError = GetAnnualFlyingStarsErrors[keyof GetAnnualFlyingStarsErrors]; export type GetAnnualFlyingStarsResponses = { /** * The nine palaces of the annual plate with meanings and remedies */ 200: { /** * The solar year this plate is for. */ year: number; /** * Flying star number, 1 to 9. The number IS the identifier of the star: 8 is always the Eight White Earth star whichever plate it appears on. */ centerStar: number; /** * The date this plate takes effect, which is Li Chun and NOT Lunar New Year. Lunar New Year 2026 falls on 17 February, roughly two weeks later, and applying the new plate from that date is the most common error in annual feng shui. */ changeoverDate: string; /** * All nine palaces with the star that flew there, centre first and then along the Lo Shu path. The plate is universal: it is the same for every building on earth. */ palaces: Array<{ /** * Palace of the Lo Shu grid: one of the eight compass sectors, or Center. Always English, safe to compare against and to key a grid cell on. */ palace: string; /** * Flying star number, 1 to 9. The number IS the identifier of the star: 8 is always the Eight White Earth star whichever plate it appears on. */ star: number; /** * Display name of the star in this palace. Always English, whatever the lang parameter says. Use nameLocalized for anything a reader sees. */ name: string; /** * Star name in the requested language, for display only. Present only when lang is set to a language other than English. */ nameLocalized?: string; /** * Five phase of this entry: Wood, Fire, Earth, Metal or Water. Always English so it stays safe to compare against and to key styling on. The full cycles live on the Chinese astrology elements endpoint. */ element: string; /** * The untimely reading of the star, auspicious or inauspicious. */ nature: string; /** * Five phase of this entry: Wood, Fire, Earth, Metal or Water. Always English so it stays safe to compare against and to key styling on. The full cycles live on the Chinese astrology elements endpoint. */ enhancer: string; /** * Five phase of this entry: Wood, Fire, Earth, Metal or Water. Always English so it stays safe to compare against and to key styling on. The full cycles live on the Chinese astrology elements endpoint. */ remedy: string; /** * What the star does in the sector it has flown to this period. */ meaning: string; }>; }; }; export type GetAnnualFlyingStarsResponse = GetAnnualFlyingStarsResponses[keyof GetAnnualFlyingStarsResponses]; export type GetMonthlyFlyingStarsData = { body?: never; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; /** * Solar year, 1900 to 2100. Defaults to the solar year in progress, which changes at Li Chun rather than on 1 January. */ year?: number; /** * Solar month, 1 to 12, where 1 begins at Li Chun in early February. This is NOT the calendar month: solar month 1 covers roughly 4 February to 5 March. Defaults to the solar month in progress. */ month?: number; }; url: '/feng-shui/flying-stars/monthly'; }; export type GetMonthlyFlyingStarsErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetMonthlyFlyingStarsError = GetMonthlyFlyingStarsErrors[keyof GetMonthlyFlyingStarsErrors]; export type GetMonthlyFlyingStarsResponses = { /** * The nine palaces of the monthly plate with meanings and remedies */ 200: { /** * Solar year of the plate. Echoes the year requested, or the solar year in progress when it was omitted. */ year: number; /** * Solar month of the plate, 1 to 12, where 1 is the month that begins at Li Chun in early February. Echoes the month requested, or the solar month in progress when it was omitted. */ month: number; /** * Flying star number, 1 to 9. The number IS the identifier of the star: 8 is always the Eight White Earth star whichever plate it appears on. */ centerStar: number; /** * Earthly Branch of the solar year, which decides where the monthly sequence starts. Rat, Horse, Rabbit and Rooster years open on 8; Dragon, Dog, Ox and Goat years on 5; Tiger, Monkey, Snake and Pig years on 2. */ yearBranch: string; /** * All nine palaces of the monthly plate, centre first and then along the Lo Shu path. */ palaces: Array<{ /** * Palace of the Lo Shu grid: one of the eight compass sectors, or Center. Always English, safe to compare against and to key a grid cell on. */ palace: string; /** * Flying star number, 1 to 9. The number IS the identifier of the star: 8 is always the Eight White Earth star whichever plate it appears on. */ star: number; /** * Display name of the star in this palace. Always English, whatever the lang parameter says. Use nameLocalized for anything a reader sees. */ name: string; /** * Star name in the requested language, for display only. Present only when lang is set to a language other than English. */ nameLocalized?: string; /** * Five phase of this entry: Wood, Fire, Earth, Metal or Water. Always English so it stays safe to compare against and to key styling on. The full cycles live on the Chinese astrology elements endpoint. */ element: string; /** * The untimely reading of the star, auspicious or inauspicious. */ nature: string; /** * Five phase of this entry: Wood, Fire, Earth, Metal or Water. Always English so it stays safe to compare against and to key styling on. The full cycles live on the Chinese astrology elements endpoint. */ enhancer: string; /** * Five phase of this entry: Wood, Fire, Earth, Metal or Water. Always English so it stays safe to compare against and to key styling on. The full cycles live on the Chinese astrology elements endpoint. */ remedy: string; /** * What the star does in the sector it has flown to this period. */ meaning: string; }>; }; }; export type GetMonthlyFlyingStarsResponse = GetMonthlyFlyingStarsResponses[keyof GetMonthlyFlyingStarsResponses]; export type ListFlyingStarsData = { body?: never; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; /** * Maximum items to return per page. Range: 1-9, default 9. */ limit?: number; /** * Number of items to skip for pagination. Default 0. */ offset?: number; }; url: '/feng-shui/flying-stars/stars'; }; export type ListFlyingStarsErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type ListFlyingStarsError = ListFlyingStarsErrors[keyof ListFlyingStarsErrors]; export type ListFlyingStarsResponses = { /** * The nine flying stars with meanings, elements and remedies */ 200: { /** * Number of stars in the catalogue. */ total: number; /** * Page size applied. */ limit: number; /** * Number of entries skipped. */ offset: number; /** * The nine flying stars in Lo Shu order, 1 through 9. */ stars: Array<{ /** * Flying star number, 1 to 9. The number IS the identifier of the star: 8 is always the Eight White Earth star whichever plate it appears on. */ number: number; /** * Display name of the star. Always English, whatever the lang parameter says, so it stays safe to compare against in code. Use nameLocalized for anything a reader sees. */ name: string; /** * Star name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat name exactly. Never compare against this value. */ nameLocalized?: string; /** * Chinese characters for the star. Data, identical in every language. */ chinese: string; /** * Tone-marked pinyin for the star. Data, identical in every language. */ pinyin: string; /** * Five phase of this entry: Wood, Fire, Earth, Metal or Water. Always English so it stays safe to compare against and to key styling on. The full cycles live on the Chinese astrology elements endpoint. */ element: string; /** * The untimely reading of the star, auspicious or inauspicious. It is not the whole verdict: the ruling star of the period in force is prosperous whatever this says, and a star long past its period is the one that does damage. Only the 5 is harmful in every period. */ nature: string; /** * Themes the star governs, for tagging and for quick summaries. */ keywords: Array; /** * What the star does, how it reads when timely, and how it reads when it is not. */ meaning: string; /** * Five phase of this entry: Wood, Fire, Earth, Metal or Water. Always English so it stays safe to compare against and to key styling on. The full cycles live on the Chinese astrology elements endpoint. */ enhancer: string; /** * Five phase of this entry: Wood, Fire, Earth, Metal or Water. Always English so it stays safe to compare against and to key styling on. The full cycles live on the Chinese astrology elements endpoint. */ remedy: string; /** * Palace of the Lo Shu grid: one of the eight compass sectors, or Center. Always English, safe to compare against and to key a grid cell on. */ palace: string; /** * The twenty year period this star rules. A star is at its strongest during its own period and weakest long after it. */ period: number; /** * The trigram of the star palace. Absent for the 5, which owns the centre and has no trigram, which is also why the 5 is the one star with no direction of its own. */ trigram?: { /** * Trigram number, the same identifier the I-Ching trigram endpoints use. */ number: number; /** * English name of the trigram, byte identical to the I-Ching catalogue. */ english: string; /** * Chinese character for the trigram. Data, identical in every language. */ chinese: string; }; /** * Flying star number, 1 to 9. The number IS the identifier of the star: 8 is always the Eight White Earth star whichever plate it appears on. */ base: number; }>; }; }; export type ListFlyingStarsResponse = ListFlyingStarsResponses[keyof ListFlyingStarsResponses]; export type GetAnnualAfflictionsData = { body?: never; path: { /** * Solar year, 1900 to 2100. The year runs from Li Chun to Li Chun, so a date in January belongs to the previous year here. */ year: number; }; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/feng-shui/afflictions/{year}'; }; export type GetAnnualAfflictionsErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetAnnualAfflictionsError = GetAnnualAfflictionsErrors[keyof GetAnnualAfflictionsErrors]; export type GetAnnualAfflictionsResponses = { /** * The four annual afflictions with mountains, degree spans and meanings */ 200: { /** * The solar year these positions are for. */ year: number; /** * Earthly Branch of the solar year, in pinyin. Three of the four afflictions are derived from it. Always English pinyin, safe to compare against. */ yearBranch: string; /** * The date all four afflictions move, which is Li Chun and NOT Lunar New Year. In 2026 Lunar New Year falls on 17 February, roughly two weeks after the afflictions have already changed. */ changeoverDate: string; /** * The Grand Duke, occupying a single 15 degree mountain rather than a whole sector. Precision matters here more than anywhere else in the system, because the neighbouring mountains of the same sector are unaffected. */ taiSui: { /** * Stable machine key for the affliction: taiSui, suiPo, sanSha or fiveYellow. Always English, identical in every language, and the field to branch on. Use this rather than name, which is display copy and does translate. */ id: string; /** * Display name of the affliction, translated in place when lang is set (Tai Sui in English, 太岁 under zh-Hans). Display copy, never a comparison key: branch on id instead. */ name: string; /** * Chinese characters for the affliction. Data, identical in every language. */ chinese: string; /** * Tone-marked pinyin. Data, identical in every language. */ pinyin: string; /** * What the affliction does and the standing rule for handling it. */ meaning: string; mountain: { /** * Mountain id, the pinyin of the stem, branch or trigram that names it. Always English pinyin, safe to compare against. */ id: string; /** * Compass label of the mountain, sector plus position 1 to 3 clockwise. The form a facing is usually quoted in. */ label: string; /** * Chinese character for the mountain. Data, identical in every language. */ chinese: string; /** * Tone-marked pinyin for the mountain. Data, identical in every language. */ pinyin: string; /** * Compass sector, one of North, Northeast, East, Southeast, South, Southwest, West, Northwest. Always English, whatever the lang parameter says, so it stays safe to compare against in code and against the same value on the I-Ching trigram endpoints. */ direction: string; /** * Which of the three dragons the mountain holds inside its sector: earth for the first mountain clockwise, heaven for the middle, human for the last. The heaven and human dragons share a polarity, which is why they share a chart. */ yuan: string; /** * San Yuan polarity of the mountain, yang or yin, which decides whether a plate entering the centre flies forward or in reverse. This is NOT the natural polarity of the stem or branch and the two differ on eight of the 24 mountains. */ polarity: string; /** * Start of the 15 degree span, in compass degrees. Wraps past 360 for the two northernmost mountains. */ startDegree: number; /** * End of the 15 degree span, in compass degrees. */ endDegree: number; }; /** * Compass sector, one of North, Northeast, East, Southeast, South, Southwest, West, Northwest. Always English, safe to compare against and to key styling on. */ direction: string; /** * Zodiac animal of the year, which shares the sign Tai Sui occupies. Always English, safe to compare against. */ animal: string; /** * The animal directly opposite, which clashes with Tai Sui head on. People of this sign are the ones traditionally advised to take the most care during the year. */ clashingAnimal: string; }; /** * The Year Breaker, always the mountain directly opposite Tai Sui. */ suiPo: { /** * Stable machine key for the affliction: taiSui, suiPo, sanSha or fiveYellow. Always English, identical in every language, and the field to branch on. Use this rather than name, which is display copy and does translate. */ id: string; /** * Display name of the affliction, translated in place when lang is set (Tai Sui in English, 太岁 under zh-Hans). Display copy, never a comparison key: branch on id instead. */ name: string; /** * Chinese characters for the affliction. Data, identical in every language. */ chinese: string; /** * Tone-marked pinyin. Data, identical in every language. */ pinyin: string; /** * What the affliction does and the standing rule for handling it. */ meaning: string; mountain: { /** * Mountain id, the pinyin of the stem, branch or trigram that names it. Always English pinyin, safe to compare against. */ id: string; /** * Compass label of the mountain, sector plus position 1 to 3 clockwise. The form a facing is usually quoted in. */ label: string; /** * Chinese character for the mountain. Data, identical in every language. */ chinese: string; /** * Tone-marked pinyin for the mountain. Data, identical in every language. */ pinyin: string; /** * Compass sector, one of North, Northeast, East, Southeast, South, Southwest, West, Northwest. Always English, whatever the lang parameter says, so it stays safe to compare against in code and against the same value on the I-Ching trigram endpoints. */ direction: string; /** * Which of the three dragons the mountain holds inside its sector: earth for the first mountain clockwise, heaven for the middle, human for the last. The heaven and human dragons share a polarity, which is why they share a chart. */ yuan: string; /** * San Yuan polarity of the mountain, yang or yin, which decides whether a plate entering the centre flies forward or in reverse. This is NOT the natural polarity of the stem or branch and the two differ on eight of the 24 mountains. */ polarity: string; /** * Start of the 15 degree span, in compass degrees. Wraps past 360 for the two northernmost mountains. */ startDegree: number; /** * End of the 15 degree span, in compass degrees. */ endDegree: number; }; /** * Compass sector, one of North, Northeast, East, Southeast, South, Southwest, West, Northwest. Always English, safe to compare against and to key styling on. */ direction: string; }; /** * The Three Killings. Two readings of its extent are in circulation and both are given: the exact 75 degree branch span in startDegree and endDegree, and the 45 degree cardinal palace named in direction. */ sanSha: { /** * Stable machine key for the affliction: taiSui, suiPo, sanSha or fiveYellow. Always English, identical in every language, and the field to branch on. Use this rather than name, which is display copy and does translate. */ id: string; /** * Display name of the affliction, translated in place when lang is set (Tai Sui in English, 太岁 under zh-Hans). Display copy, never a comparison key: branch on id instead. */ name: string; /** * Chinese characters for the affliction. Data, identical in every language. */ chinese: string; /** * Tone-marked pinyin. Data, identical in every language. */ pinyin: string; /** * What the affliction does and the standing rule for handling it. */ meaning: string; /** * Compass sector, one of North, Northeast, East, Southeast, South, Southwest, West, Northwest. Always English, safe to compare against and to key styling on. */ direction: string; /** * The five phase the year branch forms with its trine. The Three Killings always sits in the cardinal direction opposite this frame. */ frameElement: string; /** * Compass sector, one of North, Northeast, East, Southeast, South, Southwest, West, Northwest. Always English, safe to compare against and to key styling on. */ frameDirection: string; /** * Start of the afflicted span in compass degrees. The span crosses 360 when the affliction is in the north. */ startDegree: number; /** * End of the afflicted span in compass degrees. */ endDegree: number; /** * The three mountains of the span, first to last in compass order. They are one affliction read in three parts, not three separate ones, and disturbing any part is taken to wake the whole. */ parts: Array<{ /** * Which of the three parts this is: jie-sha, zai-sha or sui-sha, in compass order. Always English, safe to compare against. */ id: string; /** * Display name of the part, translated in place when lang is set. Display copy, never a comparison key: branch on id instead. */ name: string; /** * Chinese characters for the part. Data, identical in every language. */ chinese: string; /** * Tone-marked pinyin. Data, identical in every language. */ pinyin: string; /** * What this part of the span brings. */ meaning: string; mountain: { /** * Mountain id, the pinyin of the stem, branch or trigram that names it. Always English pinyin, safe to compare against. */ id: string; /** * Compass label of the mountain, sector plus position 1 to 3 clockwise. The form a facing is usually quoted in. */ label: string; /** * Chinese character for the mountain. Data, identical in every language. */ chinese: string; /** * Tone-marked pinyin for the mountain. Data, identical in every language. */ pinyin: string; /** * Compass sector, one of North, Northeast, East, Southeast, South, Southwest, West, Northwest. Always English, whatever the lang parameter says, so it stays safe to compare against in code and against the same value on the I-Ching trigram endpoints. */ direction: string; /** * Which of the three dragons the mountain holds inside its sector: earth for the first mountain clockwise, heaven for the middle, human for the last. The heaven and human dragons share a polarity, which is why they share a chart. */ yuan: string; /** * San Yuan polarity of the mountain, yang or yin, which decides whether a plate entering the centre flies forward or in reverse. This is NOT the natural polarity of the stem or branch and the two differ on eight of the 24 mountains. */ polarity: string; /** * Start of the 15 degree span, in compass degrees. Wraps past 360 for the two northernmost mountains. */ startDegree: number; /** * End of the 15 degree span, in compass degrees. */ endDegree: number; }; }>; }; /** * The Five Yellow, read off the annual star plate rather than from the year branch, which is why it is the only one of the four that has nothing to do with the animal of the year. */ fiveYellow: { /** * Stable machine key for the affliction: taiSui, suiPo, sanSha or fiveYellow. Always English, identical in every language, and the field to branch on. Use this rather than name, which is display copy and does translate. */ id: string; /** * Display name of the affliction, translated in place when lang is set (Tai Sui in English, 太岁 under zh-Hans). Display copy, never a comparison key: branch on id instead. */ name: string; /** * Chinese characters for the affliction. Data, identical in every language. */ chinese: string; /** * Tone-marked pinyin. Data, identical in every language. */ pinyin: string; /** * What the affliction does and the standing rule for handling it. */ meaning: string; /** * Palace the 5 flew to this year, one of the eight sectors or Center. Always English, safe to compare against. */ palace: string; /** * Flying star number, 1 to 9. The number IS the identifier of the star: 8 is always the Eight White Earth star whichever plate it appears on. */ star: number; /** * The phase that drains the 5, which is what the 5 itself produces. Never treat it with Fire, which produces Earth and feeds it. */ remedy: string; }; }; }; export type GetAnnualAfflictionsResponse = GetAnnualAfflictionsResponses[keyof GetAnnualAfflictionsResponses]; export type ListBaguaSectorsData = { body?: never; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; /** * Maximum items to return per page. Range: 1-9, default 9. */ limit?: number; /** * Number of items to skip for pagination. Default 0. */ offset?: number; }; url: '/feng-shui/bagua'; }; export type ListBaguaSectorsErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type ListBaguaSectorsError = ListBaguaSectorsErrors[keyof ListBaguaSectorsErrors]; export type ListBaguaSectorsResponses = { /** * The nine Bagua palaces with life areas, elements, colours and trigrams */ 200: { /** * Number of palaces in the map. */ total: number; /** * Page size applied. */ limit: number; /** * Number of entries skipped. */ offset: number; /** * The nine palaces of the compass Bagua map, in Lo Shu palace order starting at North and ending with the centre. */ sectors: Array<{ /** * Life area id: career, knowledge, family, wealth, fame, love, children, helpful-people or health. Always English, whatever the lang parameter says, so it stays safe to compare against in code. Use nameLocalized for anything a reader sees. */ id: string; /** * Display name of the life area. Always English, whatever the lang parameter says. Use nameLocalized for anything a reader sees. */ name: string; /** * Life area name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat name exactly. Never compare against this value. */ nameLocalized?: string; /** * Lo Shu number of the palace, 1 to 9. This is the same number the flying stars use, so a chart palace and a Bagua sector line up by it. */ number: number; /** * Palace of the Lo Shu grid: one of the eight compass sectors, or Center for the ninth. Always English, safe to compare against. */ palace: string; /** * Compass sector of the palace, taken from the trigram that sits there. Absent on the centre palace, which has no direction. */ direction?: string; /** * Five phase of this entry: Wood, Fire, Earth, Metal or Water. Always English so it stays safe to compare against and to key styling on. The full cycles live on the Chinese astrology elements endpoint. */ element: string; /** * Colours of the phase this sector carries, for activating it. Derived from the element rather than assigned per sector, so they cannot disagree with the element beside them. */ colors: Array; /** * The Later Heaven trigram of the sector, which is the arrangement every compass reading and every flying star chart uses. Absent on the centre palace. */ trigram?: { /** * Trigram number, 1 to 8, the same identifier the I-Ching trigram endpoints use. It is a lookup key, not a ranking. */ number: number; /** * Chinese character for the trigram. Data, identical in every language. */ chinese: string; /** * English name of the trigram, byte identical to the English value the I-Ching trigram endpoints publish for this number. Always English here, whatever the lang parameter says, so it stays safe to compare against. Use nameLocalized for anything a reader sees. */ english: string; /** * Trigram name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat english exactly. Never compare against this value. */ nameLocalized?: string; /** * Tone-marked pinyin for the trigram. Data, identical in every language. */ pinyin: string; /** * Unicode trigram symbol, for rendering a Bagua diagram without an icon set. */ symbol: string; /** * Three lines bottom to top, 1 for yang and 0 for yin. The Eight Mansions classification of any sector is decided by which of these three lines differ from your own trigram. */ binary: string; /** * Five phase of this entry: Wood, Fire, Earth, Metal or Water. Always English so it stays safe to compare against and to key styling on. The full cycles live on the Chinese astrology elements endpoint. */ element: string; /** * Five phase name in the requested language, for display only. Present only when lang is set to a language other than English. Never compare against this value. */ elementLocalized?: string; /** * Compass sector, one of North, Northeast, East, Southeast, South, Southwest, West, Northwest. Always English, whatever the lang parameter says, so it stays safe to compare against in code and against the same value on the I-Ching trigram endpoints. */ direction: string; /** * Compass sector in the requested language, for display only, the same word the composed readings use. Present only when lang is set to a language other than English. Never compare against this value. */ directionLocalized?: string; /** * Family role of the trigram. Read alongside an affliction to know which member of the household a sector points at. Always English, and it carries no localized sibling: no vocabulary this package ships names the eight family roles. */ familyMember: string; }; /** * The trigram that sits in this direction under the Earlier Heaven arrangement, read for the symbolic relation between opposite sectors. A different question from the Later Heaven trigram, not a competing answer. Absent on the centre palace. */ earlierHeavenTrigram?: { /** * Trigram number, 1 to 8, the same identifier the I-Ching trigram endpoints use. It is a lookup key, not a ranking. */ number: number; /** * Chinese character for the trigram. Data, identical in every language. */ chinese: string; /** * English name of the trigram, byte identical to the English value the I-Ching trigram endpoints publish for this number. Always English here, whatever the lang parameter says, so it stays safe to compare against. Use nameLocalized for anything a reader sees. */ english: string; /** * Trigram name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat english exactly. Never compare against this value. */ nameLocalized?: string; /** * Tone-marked pinyin for the trigram. Data, identical in every language. */ pinyin: string; /** * Unicode trigram symbol, for rendering a Bagua diagram without an icon set. */ symbol: string; /** * Three lines bottom to top, 1 for yang and 0 for yin. The Eight Mansions classification of any sector is decided by which of these three lines differ from your own trigram. */ binary: string; /** * Five phase of this entry: Wood, Fire, Earth, Metal or Water. Always English so it stays safe to compare against and to key styling on. The full cycles live on the Chinese astrology elements endpoint. */ element: string; /** * Five phase name in the requested language, for display only. Present only when lang is set to a language other than English. Never compare against this value. */ elementLocalized?: string; /** * Compass sector, one of North, Northeast, East, Southeast, South, Southwest, West, Northwest. Always English, whatever the lang parameter says, so it stays safe to compare against in code and against the same value on the I-Ching trigram endpoints. */ direction: string; /** * Compass sector in the requested language, for display only, the same word the composed readings use. Present only when lang is set to a language other than English. Never compare against this value. */ directionLocalized?: string; /** * Family role of the trigram. Read alongside an affliction to know which member of the household a sector points at. Always English, and it carries no localized sibling: no vocabulary this package ships names the eight family roles. */ familyMember: string; }; /** * What this sector governs, in a few words. */ focus: string; /** * What the sector governs and how to work with it. */ meaning: string; }>; }; }; export type ListBaguaSectorsResponse = ListBaguaSectorsResponses[keyof ListBaguaSectorsResponses]; export type GetBaguaSectorData = { body?: never; path: { /** * Life area id. One of career, knowledge, family, wealth, fame, love, children, helpful-people, health. */ id: 'career' | 'knowledge' | 'family' | 'wealth' | 'fame' | 'love' | 'children' | 'helpful-people' | 'health'; }; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/feng-shui/bagua/{id}'; }; export type GetBaguaSectorErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * No Bagua sector with that life area id */ 404: { /** * Human-readable error message. The wording may change, so do not parse it programmatically. Switch on the stable code instead. */ error: string; /** * Machine-readable error code. Stable identifier for programmatic error handling. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself. The same URL in every environment, so it is safe to log, print in a CLI, or paste into a bug report. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetBaguaSectorError = GetBaguaSectorErrors[keyof GetBaguaSectorErrors]; export type GetBaguaSectorResponses = { /** * One Bagua palace with its life area, element, colours and trigrams */ 200: { /** * Life area id: career, knowledge, family, wealth, fame, love, children, helpful-people or health. Always English, whatever the lang parameter says, so it stays safe to compare against in code. Use nameLocalized for anything a reader sees. */ id: string; /** * Display name of the life area. Always English, whatever the lang parameter says. Use nameLocalized for anything a reader sees. */ name: string; /** * Life area name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat name exactly. Never compare against this value. */ nameLocalized?: string; /** * Lo Shu number of the palace, 1 to 9. This is the same number the flying stars use, so a chart palace and a Bagua sector line up by it. */ number: number; /** * Palace of the Lo Shu grid: one of the eight compass sectors, or Center for the ninth. Always English, safe to compare against. */ palace: string; /** * Compass sector of the palace, taken from the trigram that sits there. Absent on the centre palace, which has no direction. */ direction?: string; /** * Five phase of this entry: Wood, Fire, Earth, Metal or Water. Always English so it stays safe to compare against and to key styling on. The full cycles live on the Chinese astrology elements endpoint. */ element: string; /** * Colours of the phase this sector carries, for activating it. Derived from the element rather than assigned per sector, so they cannot disagree with the element beside them. */ colors: Array; /** * The Later Heaven trigram of the sector, which is the arrangement every compass reading and every flying star chart uses. Absent on the centre palace. */ trigram?: { /** * Trigram number, 1 to 8, the same identifier the I-Ching trigram endpoints use. It is a lookup key, not a ranking. */ number: number; /** * Chinese character for the trigram. Data, identical in every language. */ chinese: string; /** * English name of the trigram, byte identical to the English value the I-Ching trigram endpoints publish for this number. Always English here, whatever the lang parameter says, so it stays safe to compare against. Use nameLocalized for anything a reader sees. */ english: string; /** * Trigram name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat english exactly. Never compare against this value. */ nameLocalized?: string; /** * Tone-marked pinyin for the trigram. Data, identical in every language. */ pinyin: string; /** * Unicode trigram symbol, for rendering a Bagua diagram without an icon set. */ symbol: string; /** * Three lines bottom to top, 1 for yang and 0 for yin. The Eight Mansions classification of any sector is decided by which of these three lines differ from your own trigram. */ binary: string; /** * Five phase of this entry: Wood, Fire, Earth, Metal or Water. Always English so it stays safe to compare against and to key styling on. The full cycles live on the Chinese astrology elements endpoint. */ element: string; /** * Five phase name in the requested language, for display only. Present only when lang is set to a language other than English. Never compare against this value. */ elementLocalized?: string; /** * Compass sector, one of North, Northeast, East, Southeast, South, Southwest, West, Northwest. Always English, whatever the lang parameter says, so it stays safe to compare against in code and against the same value on the I-Ching trigram endpoints. */ direction: string; /** * Compass sector in the requested language, for display only, the same word the composed readings use. Present only when lang is set to a language other than English. Never compare against this value. */ directionLocalized?: string; /** * Family role of the trigram. Read alongside an affliction to know which member of the household a sector points at. Always English, and it carries no localized sibling: no vocabulary this package ships names the eight family roles. */ familyMember: string; }; /** * The trigram that sits in this direction under the Earlier Heaven arrangement, read for the symbolic relation between opposite sectors. A different question from the Later Heaven trigram, not a competing answer. Absent on the centre palace. */ earlierHeavenTrigram?: { /** * Trigram number, 1 to 8, the same identifier the I-Ching trigram endpoints use. It is a lookup key, not a ranking. */ number: number; /** * Chinese character for the trigram. Data, identical in every language. */ chinese: string; /** * English name of the trigram, byte identical to the English value the I-Ching trigram endpoints publish for this number. Always English here, whatever the lang parameter says, so it stays safe to compare against. Use nameLocalized for anything a reader sees. */ english: string; /** * Trigram name in the requested language, for display only. Present only when lang is set to a language other than English, since in English it would repeat english exactly. Never compare against this value. */ nameLocalized?: string; /** * Tone-marked pinyin for the trigram. Data, identical in every language. */ pinyin: string; /** * Unicode trigram symbol, for rendering a Bagua diagram without an icon set. */ symbol: string; /** * Three lines bottom to top, 1 for yang and 0 for yin. The Eight Mansions classification of any sector is decided by which of these three lines differ from your own trigram. */ binary: string; /** * Five phase of this entry: Wood, Fire, Earth, Metal or Water. Always English so it stays safe to compare against and to key styling on. The full cycles live on the Chinese astrology elements endpoint. */ element: string; /** * Five phase name in the requested language, for display only. Present only when lang is set to a language other than English. Never compare against this value. */ elementLocalized?: string; /** * Compass sector, one of North, Northeast, East, Southeast, South, Southwest, West, Northwest. Always English, whatever the lang parameter says, so it stays safe to compare against in code and against the same value on the I-Ching trigram endpoints. */ direction: string; /** * Compass sector in the requested language, for display only, the same word the composed readings use. Present only when lang is set to a language other than English. Never compare against this value. */ directionLocalized?: string; /** * Family role of the trigram. Read alongside an affliction to know which member of the household a sector points at. Always English, and it carries no localized sibling: no vocabulary this package ships names the eight family roles. */ familyMember: string; }; /** * What this sector governs, in a few words. */ focus: string; /** * What the sector governs and how to work with it. */ meaning: string; }; }; export type GetBaguaSectorResponse = GetBaguaSectorResponses[keyof GetBaguaSectorResponses]; export type ListNinePeriodsData = { body?: never; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; /** * Date to resolve the current period for, in YYYY-MM-DD format. Defaults to today in UTC. Useful for asking which period a building was completed in. */ date?: string; }; url: '/feng-shui/periods'; }; export type ListNinePeriodsErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type ListNinePeriodsError = ListNinePeriodsErrors[keyof ListNinePeriodsErrors]; export type ListNinePeriodsResponses = { /** * The nine periods with ruling stars and the period in force */ 200: { /** * Number of periods in the cycle. Always nine. */ total: number; /** * First solar year of the recorded 180 year cycle. */ cycleStartYear: number; /** * Last solar year of the recorded cycle. The cycle then repeats, so 2044 opens Period 1 again. */ cycleEndYear: number; /** * The date the current period was resolved for. Echoes the date requested, or the current UTC date when it was omitted. */ date: string; /** * The period in force on that date. Resolved at Li Chun, so a date in January belongs to the previous solar year and can fall in the previous period. */ currentPeriod: number; /** * All nine periods of the 180 year cycle in order, each with its ruling star, element, palace and exact opening date. */ periods: Array<{ /** * Period number, 1 to 9. A building takes the period it was completed in and keeps that period plate for its whole life, so this is the first input to every natal chart. */ number: number; /** * First solar year of the period. The period opens at Li Chun of this year, in early February, not on 1 January. */ startYear: number; /** * Last solar year of the period. The next period opens at Li Chun of the year after. */ endYear: number; /** * Exact date the period opened, computed astronomically. Li Chun is commonly quoted as 4 February and falls on the 3rd or the 5th in roughly one year in four, which is what decides whether a building finished in early February belongs to this period or the last. */ startDate: string; /** * Which sixty year era the period belongs to: upper, middle or lower, three periods each. Always English, safe to compare against. */ era: string; /** * Display name of the era. */ eraName: string; /** * Flying star number, 1 to 9. The number IS the identifier of the star: 8 is always the Eight White Earth star whichever plate it appears on. */ rulingStar: number; /** * Display name of the ruling star. Always English, whatever the lang parameter says. Use rulingStarNameLocalized for anything a reader sees. */ rulingStarName: string; /** * Ruling star name in the requested language, for display only. Present only when lang is set to a language other than English. */ rulingStarNameLocalized?: string; /** * Five phase of this entry: Wood, Fire, Earth, Metal or Water. Always English so it stays safe to compare against and to key styling on. The full cycles live on the Chinese astrology elements endpoint. */ element: string; /** * Palace the ruling star owns on the Lo Shu base plate. Always English, safe to compare against. */ palace: string; /** * Trigram of the ruling star palace. Absent for Period 5, whose star owns the centre and has no trigram. */ trigram?: { /** * Trigram number, the same identifier the I-Ching trigram endpoints use. */ number: number; /** * English name of the trigram, byte identical to the I-Ching catalogue. */ english: string; /** * Chinese character for the trigram. Data, identical in every language. */ chinese: string; }; /** * Flying star number, 1 to 9. The number IS the identifier of the star: 8 is always the Eight White Earth star whichever plate it appears on. */ base: number; }>; }; }; export type ListNinePeriodsResponse = ListNinePeriodsResponses[keyof ListNinePeriodsResponses]; export type CalculateTzolkinData = { body: { /** * Date in YYYY-MM-DD format, in the PROLEPTIC GREGORIAN calendar, extended backwards unchanged through the 1582 reform. Years 1 to 4000 are accepted. A reference converter that switches to the Julian calendar below the reform will disagree with a date before 15 October 1582 by ten or eleven days; that is a difference of input convention rather than of arithmetic, and passing the Julian equivalent to such a tool reproduces these values exactly. A single-digit month or day is accepted and zero padded. */ date: string; /** * Which correlation constant ties the day count to a civil date. This is the single choice that shifts every value in the response, so it is a parameter rather than a hidden default, and the resolved value comes back under conventions. "gmt-584283" is the commonly accepted constant and the default, and it is the one the major institutional converter runs on. "martinez-hernandez-584281" sits two days earlier, "astronomical-584285" two days later, and "martin-skidmore-584286" three days later, each shifting the Long Count by exactly its difference in days. Four of the eight published constants are offered: the other four sit tens of thousands of days away and are of historical interest only. The 584281 constant is the Martínez Hernández correlation, after Juan Martínez Hernández. */ correlation?: 'gmt-584283' | 'martinez-hernandez-584281' | 'astronomical-584285' | 'martin-skidmore-584286'; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/mesoamerican-astrology/mayan/tzolkin'; }; export type CalculateTzolkinErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type CalculateTzolkinError = CalculateTzolkinErrors[keyof CalculateTzolkinErrors]; export type CalculateTzolkinResponses = { /** * The Tzolkin day for this date. */ 200: { /** * Machine identifier of the Tzolkin day sign, always lowercase ASCII Yucatec whatever the lang parameter says, so it stays safe to compare against in code. The twenty ids run imix, ik, akbal, kan, chikchan, kimi, manik, lamat, muluk, ok, chuwen, eb, ben, ix, men, kib, kaban, etznab, kawak, ajaw. */ daySign: string; /** * Display name of the day sign in the standard Maya orthography, where the ejective is written with a modifier letter rather than a typewriter quote. A proper noun carried as data, so it is identical under every lang. */ daySignName: string; /** * The sixteenth century Yucatec spelling of the same sign, which is the form most printed reference tables and older sources use. Useful for matching a name a reader copied out of a book. */ daySignClassic: string; /** * The Kʼicheʼ name of the same day from the living highland daykeeping tradition, which is the vocabulary a nawal reading in Guatemala uses. A parallel naming tradition rather than a translation, so it is identical under every lang. */ daySignKiche: string; /** * The Tzolkin coefficient, 1 to 13. This is the classical day number that runs alongside the twenty signs; it is not a rank and a 13 is not better than a 1. Nine of the thirteen carry a recorded character, which is returned separately. */ number: number; /** * The thirteen day period this day belongs to. The trecena is the unit a daykeeper reads a run of days in, and the sign it opens on is what gives the whole period its character. */ trecena: { /** * Which of the twenty thirteen day periods this day falls in, 1 to 20. Trecena 1 opens on 1 Imix. */ number: number; /** * Position of this day inside its trecena, 1 to 13. Always equal to the coefficient, because a trecena is exactly one run of the coefficient. */ dayOfTrecena: number; /** * Machine identifier of the day sign the trecena opens on, which the tradition reads as colouring all thirteen of its days. */ rulingSign: string; /** * Display name of the sign the trecena opens on. A proper noun carried as data. */ rulingSignName: string; }; /** * Echo of the date the day was resolved from, in proleptic Gregorian. */ date: string; /** * The composed nawal reading for this day: the sign, what the coefficient contributes, and what the sign does well and badly. */ reading: { /** * The sign in one composed sentence: its name in both naming traditions, what it is about, and the glyph reading behind it. Composed per request from the sign components rather than stored whole, which is why it stays consistent with every other reading in the response. */ keynote: string; /** * What the coefficient contributes. Nine of the thirteen carry a recorded character, banded as gentle, indifferent or violent; the other four carry none and this field says so rather than inventing one. The band ids are the source vocabulary, so violent names the days reserved for strong ceremony and defence and is not a warning. */ numberReading: string; /** * Machine identifier of the recorded character of the coefficient: gentle, indifferent or violent. ABSENT for coefficients 4, 5, 6 and 10, which have no recorded character in any consulted source. Always English so it stays safe to switch on. */ numberBand?: string; /** * What the sign does well, as full sentences rather than keywords. */ strengths: Array; /** * Where the same temperament costs the sign something. Each one is the shadow of a strength above rather than an unrelated flaw. */ challenges: Array; /** * The one thing worth doing differently under this sign. */ guidance: string; }; /** * The conventions this answer was computed under, echoed so the result is self describing. Only the correlation is echoed here, because it is the only switch this route takes. */ conventions: { /** * The correlation constant actually applied, whether it was requested or defaulted. Store this beside any Maya date you persist: the same civil date resolves to a different Long Count under each constant, and a date with no correlation recorded cannot be reproduced. */ correlation: string; }; }; }; export type CalculateTzolkinResponse = CalculateTzolkinResponses[keyof CalculateTzolkinResponses]; export type GenerateMayanChartData = { body: { /** * Date in YYYY-MM-DD format, in the PROLEPTIC GREGORIAN calendar, extended backwards unchanged through the 1582 reform. Years 1 to 4000 are accepted. A reference converter that switches to the Julian calendar below the reform will disagree with a date before 15 October 1582 by ten or eleven days; that is a difference of input convention rather than of arithmetic, and passing the Julian equivalent to such a tool reproduces these values exactly. A single-digit month or day is accepted and zero padded. */ date: string; /** * Which correlation constant ties the day count to a civil date. This is the single choice that shifts every value in the response, so it is a parameter rather than a hidden default, and the resolved value comes back under conventions. "gmt-584283" is the commonly accepted constant and the default, and it is the one the major institutional converter runs on. "martinez-hernandez-584281" sits two days earlier, "astronomical-584285" two days later, and "martin-skidmore-584286" three days later, each shifting the Long Count by exactly its difference in days. Four of the eight published constants are offered: the other four sit tens of thousands of days away and are of historical interest only. The 584281 constant is the Martínez Hernández correlation, after Juan Martínez Hernández. */ correlation?: 'gmt-584283' | 'martinez-hernandez-584281' | 'astronomical-584285' | 'martin-skidmore-584286'; /** * Which Haab day is read as the start of the year when naming its Year Bearer. Only four of the twenty day signs can ever carry a year, and which four depends entirely on this choice, so the three schools never agree. "classic" reads the seating of Pop and is the default, because it is the set highland daykeepers still use; its four bearers are Ikʼ, Manikʼ, Ebʼ and Kabʼan. "campeche" reads 1 Pop and gives Akʼbʼal, Lamat, Bʼen and Etzʼnabʼ. "colonial-yucatec" reads 2 Pop and gives Kʼan, Muluk, Ix and Kawak. The three sets share no member, so a bearer alone tells you which school produced it. */ yearBearerSystem?: 'classic' | 'campeche' | 'colonial-yucatec'; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/mesoamerican-astrology/mayan/chart'; }; export type GenerateMayanChartErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GenerateMayanChartError = GenerateMayanChartErrors[keyof GenerateMayanChartErrors]; export type GenerateMayanChartResponses = { /** * The full Maya chart for this date. */ 200: { /** * Echo of the date the chart was computed from, in proleptic Gregorian. */ date: string; /** * The 260 day sacred round: the day sign, its coefficient and the trecena it falls in. This is the cycle a nawal reading is built on. */ tzolkin: { /** * Machine identifier of the Tzolkin day sign, always lowercase ASCII Yucatec whatever the lang parameter says, so it stays safe to compare against in code. The twenty ids run imix, ik, akbal, kan, chikchan, kimi, manik, lamat, muluk, ok, chuwen, eb, ben, ix, men, kib, kaban, etznab, kawak, ajaw. */ daySign: string; /** * Display name of the day sign in the standard Maya orthography, where the ejective is written with a modifier letter rather than a typewriter quote. A proper noun carried as data, so it is identical under every lang. */ daySignName: string; /** * The sixteenth century Yucatec spelling of the same sign, which is the form most printed reference tables and older sources use. Useful for matching a name a reader copied out of a book. */ daySignClassic: string; /** * The Kʼicheʼ name of the same day from the living highland daykeeping tradition, which is the vocabulary a nawal reading in Guatemala uses. A parallel naming tradition rather than a translation, so it is identical under every lang. */ daySignKiche: string; /** * The Tzolkin coefficient, 1 to 13. This is the classical day number that runs alongside the twenty signs; it is not a rank and a 13 is not better than a 1. Nine of the thirteen carry a recorded character, which is returned separately. */ number: number; /** * The thirteen day period this day belongs to. The trecena is the unit a daykeeper reads a run of days in, and the sign it opens on is what gives the whole period its character. */ trecena: { /** * Which of the twenty thirteen day periods this day falls in, 1 to 20. Trecena 1 opens on 1 Imix. */ number: number; /** * Position of this day inside its trecena, 1 to 13. Always equal to the coefficient, because a trecena is exactly one run of the coefficient. */ dayOfTrecena: number; /** * Machine identifier of the day sign the trecena opens on, which the tradition reads as colouring all thirteen of its days. */ rulingSign: string; /** * Display name of the sign the trecena opens on. A proper noun carried as data. */ rulingSignName: string; }; /** * The composed nawal reading for the Tzolkin day. */ reading: { /** * The sign in one composed sentence: its name in both naming traditions, what it is about, and the glyph reading behind it. Composed per request from the sign components rather than stored whole, which is why it stays consistent with every other reading in the response. */ keynote: string; /** * What the coefficient contributes. Nine of the thirteen carry a recorded character, banded as gentle, indifferent or violent; the other four carry none and this field says so rather than inventing one. The band ids are the source vocabulary, so violent names the days reserved for strong ceremony and defence and is not a warning. */ numberReading: string; /** * Machine identifier of the recorded character of the coefficient: gentle, indifferent or violent. ABSENT for coefficients 4, 5, 6 and 10, which have no recorded character in any consulted source. Always English so it stays safe to switch on. */ numberBand?: string; /** * What the sign does well, as full sentences rather than keywords. */ strengths: Array; /** * Where the same temperament costs the sign something. Each one is the shadow of a strength above rather than an unrelated flaw. */ challenges: Array; /** * The one thing worth doing differently under this sign. */ guidance: string; }; }; /** * The 365 day vague year: eighteen periods of twenty days plus the five days of Wayebʼ. This is the agricultural year the Tzolkin runs against. */ haab: { /** * Machine identifier of the Haab period, always lowercase ASCII. The nineteen ids run pop, wo, sip, sotz, sek, xul, yaxkin, mol, chen, yax, sak, keh, mak, kankin, muwan, pax, kayab, kumku, wayeb. */ month: string; /** * Display name of the Haab period in the standard orthography. A proper noun carried as data, so it is identical under every lang. */ monthName: string; /** * The sixteenth century Yucatec spelling of the same period, which is the form most printed tables use. */ monthClassic: string; /** * Day inside the period, 0 to 19, or 0 to 4 in Wayebʼ. Day 0 is a real date and is called the seating of the period, so a Haab month has no day 20. Numbering from 1 instead is the usual way to be one day wrong on every Haab date. */ day: number; /** * Day of the 365 day Haab year, 0 to 364. The Haab has no leap day at all, so it drifts against the solar year by about a day every four years and there is nothing to correct. */ dayOfYear: number; /** * Composed reading of the Haab date, which reads differently on the seating day of a period. */ reading: string; }; /** * The linear day count from the mythological start of the era, written in five positions. Unlike the two round calendars this one never repeats, which is what lets an inscription name an absolute date. */ longCount: { /** * The dotted Long Count, most significant position first. This is the spelling every reference converter and every inscription uses. */ formatted: string; /** * Baktun, the highest of the five positions. One baktun is 144,000 days. */ baktun: number; /** * Katun, 0 to 19. One katun is 7,200 days, roughly twenty years. */ katun: number; /** * Tun, 0 to 19. One tun is 360 days, which is why this position sits roughly a year apart. */ tun: number; /** * Winal, 0 to 17 and never 19. This is the one position that is not base twenty: eighteen winal make a tun, which is what keeps the tun near a solar year. */ winal: number; /** * Kin, 0 to 19. One kin is one day. */ kin: number; /** * The whole Long Count as a single integer count of days from the epoch. Subtracting two of these is the correct way to measure an interval, and it is the number the Tzolkin, the Haab and the night lord are all derived from. */ daysSinceEpoch: number; /** * Julian Day Number of the same day, which is the bridge between this count and any other calendar. Adding the correlation constant to daysSinceEpoch gives exactly this. */ julianDayNumber: number; }; /** * The Tzolkin and Haab dates written together, which is how a Classic inscription names a day. The pair repeats every 18,980 days, a little under 52 years, so a Calendar Round alone is ambiguous beyond one lifetime and the Long Count is what disambiguates it. */ calendarRound: string; /** * The nine day cycle that runs beside the other three. The nine are identified and the cycle is unambiguous, but no source records what the Maya called them, so this API publishes the labels rather than borrowing names from a neighbouring culture. */ lordOfNight: { /** * Which of the nine Lords of the Night governs this day, G1 to G9. The cycle steps forward one per day and closes every nine. */ label: string; /** * One line on the night lord, including why the nine carry labels rather than names. */ reading: string; }; /** * The Tzolkin day that names the Haab year this date falls in, under the requested school. */ yearBearer: { /** * Machine identifier of the day sign carrying the Haab year this date falls in. Only four of the twenty can ever carry a year, and which four depends on the school. */ daySign: string; /** * Display name of the bearing sign. A proper noun carried as data. */ daySignName: string; /** * Coefficient of the bearing day, 1 to 13. The coefficient advances by one each Haab year, which is what makes the bearer and the number together repeat only every 52 years. */ number: number; /** * One line on the year bearer that names the school it was read under, because the three schools name three different bearers for the same year. */ reading: string; }; /** * The Cruz Maya, the five point nawal cross, with source convention. This is a LIVING DAYKEEPER PRACTICE rather than an archaeological reconstruction: no academic source describes a five point cross, and the day offsets here were measured against two independent practitioner calculators that agree. It is published because practitioners use it, and it is labelled because that is what honesty about a source looks like. */ cross: Array<{ /** * Which point of the cross this is: center, conception, destiny, left or right. Always English so it stays safe to switch on. The arms are published as left and right and carry no gender, because the sources that agree on the SIGNS disagree on which arm is masculine and which feminine. */ position: string; /** * Days from the birth day to this arm. Negative is before the birth day. Conception is minus eight, destiny plus eight, the left arm plus six and the right arm minus six. */ offsetDays: number; /** * Machine identifier of the day sign standing at this point. */ daySign: string; /** * Display name of the sign at this point. A proper noun carried as data. */ daySignName: string; /** * Kʼicheʼ name of the same sign, which is the vocabulary a cross is normally read in. */ daySignKiche: string; /** * Coefficient of the day at this point, 1 to 13. */ number: number; /** * One line on what this point of the cross is read as. */ reading: string; }>; /** * One composed sentence placing the day in all three calendars, for a card headline or a chat reply. */ summary: string; /** * The conventions this chart was computed under, echoed so the result is self describing. Store both beside any chart you persist. */ conventions: { /** * The correlation constant actually applied, whether it was requested or defaulted. Store this beside any Maya date you persist: the same civil date resolves to a different Long Count under each constant, and a date with no correlation recorded cannot be reproduced. */ correlation: string; /** * The Year Bearer school actually applied. The three schools name three different bearers for the same Haab year, so a bearer stored without this value cannot be checked against anything. */ yearBearerSystem: string; }; }; }; export type GenerateMayanChartResponse = GenerateMayanChartResponses[keyof GenerateMayanChartResponses]; export type ConvertLongCountData = { /** * What to convert, and under which correlation. Exactly one of date and longCount is present, which is why the whole body carries one example rather than leaving the per field ones to be read together. */ body: { /** * Proleptic Gregorian date to convert INTO a Long Count. Supply this or longCount, never both and never neither. */ date?: string; /** * Dotted Long Count to convert INTO a date, written baktun.katun.tun.winal.kin. Each position is bounded by its own base, and the winal counts to 17 rather than to 19 because eighteen winal make a tun, so 9.12.11.18.0 is rejected as a date that does not exist. Supply this or date, never both and never neither. */ longCount?: string; /** * Which correlation constant ties the day count to a civil date. This is the single choice that shifts every value in the response, so it is a parameter rather than a hidden default, and the resolved value comes back under conventions. "gmt-584283" is the commonly accepted constant and the default, and it is the one the major institutional converter runs on. "martinez-hernandez-584281" sits two days earlier, "astronomical-584285" two days later, and "martin-skidmore-584286" three days later, each shifting the Long Count by exactly its difference in days. Four of the eight published constants are offered: the other four sit tens of thousands of days away and are of historical interest only. The 584281 constant is the Martínez Hernández correlation, after Juan Martínez Hernández. */ correlation?: 'gmt-584283' | 'martinez-hernandez-584281' | 'astronomical-584285' | 'martin-skidmore-584286'; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/mesoamerican-astrology/mayan/long-count/convert'; }; export type ConvertLongCountErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type ConvertLongCountError = ConvertLongCountErrors[keyof ConvertLongCountErrors]; export type ConvertLongCountResponses = { /** * The converted date. */ 200: { /** * The proleptic Gregorian date, echoed when it was the input and computed when the Long Count was. */ date: string; /** * The dotted Long Count, echoed when it was the input and computed when the date was. */ longCount: string; /** * The Long Count as one integer count of days from the epoch. Subtracting two of these is the correct way to measure an interval between two Maya dates. */ daysSinceEpoch: number; /** * Julian Day Number of the same day, which is the bridge to any other calendar. It is exactly daysSinceEpoch plus the correlation constant. */ julianDayNumber: number; /** * The Tzolkin and Haab dates written together, which is how an inscription names a day. The pair repeats every 18,980 days, so it is ambiguous beyond about 52 years and the Long Count is what fixes it. */ calendarRound: string; /** * Which of the nine Lords of the Night governs the day, G1 to G9. The nine carry glyph labels rather than names because no source records what the Maya called them. */ lordOfNight: string; /** * Present ONLY for a date before the Gregorian reform, where the input convention is the usual reason two converters disagree. Absent otherwise, so its presence is itself the signal. */ note?: string; /** * The conventions this conversion was computed under, echoed so the result is self describing. */ conventions: { /** * The correlation constant actually applied, whether it was requested or defaulted. Store this beside any Maya date you persist: the same civil date resolves to a different Long Count under each constant, and a date with no correlation recorded cannot be reproduced. */ correlation: string; }; }; }; export type ConvertLongCountResponse = ConvertLongCountResponses[keyof ConvertLongCountResponses]; export type GetDailyMayanReadingData = { body?: never; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; /** * Date in YYYY-MM-DD format, in the PROLEPTIC GREGORIAN calendar, extended backwards unchanged through the 1582 reform. Years 1 to 4000 are accepted. A reference converter that switches to the Julian calendar below the reform will disagree with a date before 15 October 1582 by ten or eleven days; that is a difference of input convention rather than of arithmetic, and passing the Julian equivalent to such a tool reproduces these values exactly. A single-digit month or day is accepted and zero padded. Defaults to the current day in UTC. */ date?: string; /** * Which correlation constant ties the day count to a civil date. This is the single choice that shifts every value in the response, so it is a parameter rather than a hidden default, and the resolved value comes back under conventions. "gmt-584283" is the commonly accepted constant and the default, and it is the one the major institutional converter runs on. "martinez-hernandez-584281" sits two days earlier, "astronomical-584285" two days later, and "martin-skidmore-584286" three days later, each shifting the Long Count by exactly its difference in days. Four of the eight published constants are offered: the other four sit tens of thousands of days away and are of historical interest only. The 584281 constant is the Martínez Hernández correlation, after Juan Martínez Hernández. */ correlation?: 'gmt-584283' | 'martinez-hernandez-584281' | 'astronomical-584285' | 'martin-skidmore-584286'; }; url: '/mesoamerican-astrology/mayan/daily'; }; export type GetDailyMayanReadingErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetDailyMayanReadingError = GetDailyMayanReadingErrors[keyof GetDailyMayanReadingErrors]; export type GetDailyMayanReadingResponses = { /** * The Tzolkin reading for this day. */ 200: { /** * Machine identifier of the Tzolkin day sign, always lowercase ASCII Yucatec whatever the lang parameter says, so it stays safe to compare against in code. The twenty ids run imix, ik, akbal, kan, chikchan, kimi, manik, lamat, muluk, ok, chuwen, eb, ben, ix, men, kib, kaban, etznab, kawak, ajaw. */ daySign: string; /** * Display name of the day sign in the standard Maya orthography, where the ejective is written with a modifier letter rather than a typewriter quote. A proper noun carried as data, so it is identical under every lang. */ daySignName: string; /** * The sixteenth century Yucatec spelling of the same sign, which is the form most printed reference tables and older sources use. Useful for matching a name a reader copied out of a book. */ daySignClassic: string; /** * The Kʼicheʼ name of the same day from the living highland daykeeping tradition, which is the vocabulary a nawal reading in Guatemala uses. A parallel naming tradition rather than a translation, so it is identical under every lang. */ daySignKiche: string; /** * The Tzolkin coefficient, 1 to 13. This is the classical day number that runs alongside the twenty signs; it is not a rank and a 13 is not better than a 1. Nine of the thirteen carry a recorded character, which is returned separately. */ number: number; /** * The thirteen day period this day belongs to. The trecena is the unit a daykeeper reads a run of days in, and the sign it opens on is what gives the whole period its character. */ trecena: { /** * Which of the twenty thirteen day periods this day falls in, 1 to 20. Trecena 1 opens on 1 Imix. */ number: number; /** * Position of this day inside its trecena, 1 to 13. Always equal to the coefficient, because a trecena is exactly one run of the coefficient. */ dayOfTrecena: number; /** * Machine identifier of the day sign the trecena opens on, which the tradition reads as colouring all thirteen of its days. */ rulingSign: string; /** * Display name of the sign the trecena opens on. A proper noun carried as data. */ rulingSignName: string; }; /** * Date of this reading. Echoes the date requested, or the current day in UTC when it was omitted. */ date: string; /** * What the day carries, placing it inside its trecena as well as naming it. Composed per request, so it stays consistent with the reading below rather than being a second opinion. */ overview: string; /** * The composed nawal reading for the day sign in force. */ reading: { /** * The sign in one composed sentence: its name in both naming traditions, what it is about, and the glyph reading behind it. Composed per request from the sign components rather than stored whole, which is why it stays consistent with every other reading in the response. */ keynote: string; /** * What the coefficient contributes. Nine of the thirteen carry a recorded character, banded as gentle, indifferent or violent; the other four carry none and this field says so rather than inventing one. The band ids are the source vocabulary, so violent names the days reserved for strong ceremony and defence and is not a warning. */ numberReading: string; /** * Machine identifier of the recorded character of the coefficient: gentle, indifferent or violent. ABSENT for coefficients 4, 5, 6 and 10, which have no recorded character in any consulted source. Always English so it stays safe to switch on. */ numberBand?: string; /** * What the sign does well, as full sentences rather than keywords. */ strengths: Array; /** * Where the same temperament costs the sign something. Each one is the shadow of a strength above rather than an unrelated flaw. */ challenges: Array; /** * The one thing worth doing differently under this sign. */ guidance: string; }; /** * The conventions this reading was computed under, echoed so the result is self describing. */ conventions: { /** * The correlation constant actually applied, whether it was requested or defaulted. Store this beside any Maya date you persist: the same civil date resolves to a different Long Count under each constant, and a date with no correlation recorded cannot be reproduced. */ correlation: string; }; }; }; export type GetDailyMayanReadingResponse = GetDailyMayanReadingResponses[keyof GetDailyMayanReadingResponses]; export type GetMonthlyTzolkinCalendarData = { body?: never; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; /** * Gregorian year of the grid, 1900 to 2100. Defaults to the current year in UTC. Wider historical ranges are available on the single date routes, which are not bounded to this window. */ year?: number; /** * Calendar month of the grid, 1 to 12. Defaults to the current month in UTC. */ month?: number; /** * Which correlation constant ties the day count to a civil date. This is the single choice that shifts every value in the response, so it is a parameter rather than a hidden default, and the resolved value comes back under conventions. "gmt-584283" is the commonly accepted constant and the default, and it is the one the major institutional converter runs on. "martinez-hernandez-584281" sits two days earlier, "astronomical-584285" two days later, and "martin-skidmore-584286" three days later, each shifting the Long Count by exactly its difference in days. Four of the eight published constants are offered: the other four sit tens of thousands of days away and are of historical interest only. The 584281 constant is the Martínez Hernández correlation, after Juan Martínez Hernández. */ correlation?: 'gmt-584283' | 'martinez-hernandez-584281' | 'astronomical-584285' | 'martin-skidmore-584286'; }; url: '/mesoamerican-astrology/mayan/calendar/monthly'; }; export type GetMonthlyTzolkinCalendarErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetMonthlyTzolkinCalendarError = GetMonthlyTzolkinCalendarErrors[keyof GetMonthlyTzolkinCalendarErrors]; export type GetMonthlyTzolkinCalendarResponses = { /** * Every day of the month with its Maya date. */ 200: { /** * Year of the grid, echoed or defaulted to the current year in UTC. */ year: number; /** * Month of the grid, echoed or defaulted to the current month in UTC. */ month: number; /** * Number of days in the grid, which is the length of the civil month. Every day of the month appears exactly once and none is repeated. */ total: number; /** * The days of the month in calendar order, one row per day. Every date in the month is present exactly once, which is what makes this safe to render straight into a grid. */ days: Array<{ /** * Calendar date of this row, in proleptic Gregorian. */ date: string; /** * Machine identifier of the Tzolkin day sign, always lowercase ASCII Yucatec, so it stays safe to compare against in code. */ daySign: string; /** * Display name of the day sign. A proper noun carried as data, identical under every lang. */ daySignName: string; /** * The Tzolkin coefficient for this day, 1 to 13. */ number: number; /** * Which of the twenty thirteen day periods this day falls in, 1 to 20. Consecutive rows share a trecena until the period turns. */ trecena: number; /** * The Haab date, written as the day inside its period followed by the period name. Day 0 is the seating of a period and is a real date. */ haab: string; /** * The dotted Long Count for this day. Consecutive rows differ by exactly one kin. */ longCount: string; }>; /** * The conventions this grid was computed under, echoed so the result is self describing. */ conventions: { /** * The correlation constant actually applied, whether it was requested or defaulted. Store this beside any Maya date you persist: the same civil date resolves to a different Long Count under each constant, and a date with no correlation recorded cannot be reproduced. */ correlation: string; }; }; }; export type GetMonthlyTzolkinCalendarResponse = GetMonthlyTzolkinCalendarResponses[keyof GetMonthlyTzolkinCalendarResponses]; export type CalculateMayanCompatibilityData = { body: { /** * The first person, by birth date. Only a date is needed: the Tzolkin is a day count, so no time, timezone or place changes the answer. */ personA: { /** * Date in YYYY-MM-DD format, in the PROLEPTIC GREGORIAN calendar, extended backwards unchanged through the 1582 reform. Years 1 to 4000 are accepted. A reference converter that switches to the Julian calendar below the reform will disagree with a date before 15 October 1582 by ten or eleven days; that is a difference of input convention rather than of arithmetic, and passing the Julian equivalent to such a tool reproduces these values exactly. A single-digit month or day is accepted and zero padded. */ date: string; }; /** * The second person, by birth date. The comparison is symmetric except for the cross tie, which is checked in both directions. */ personB: { /** * Date in YYYY-MM-DD format, in the PROLEPTIC GREGORIAN calendar, extended backwards unchanged through the 1582 reform. Years 1 to 4000 are accepted. A reference converter that switches to the Julian calendar below the reform will disagree with a date before 15 October 1582 by ten or eleven days; that is a difference of input convention rather than of arithmetic, and passing the Julian equivalent to such a tool reproduces these values exactly. A single-digit month or day is accepted and zero padded. */ date: string; }; /** * Which correlation constant ties the day count to a civil date. This is the single choice that shifts every value in the response, so it is a parameter rather than a hidden default, and the resolved value comes back under conventions. "gmt-584283" is the commonly accepted constant and the default, and it is the one the major institutional converter runs on. "martinez-hernandez-584281" sits two days earlier, "astronomical-584285" two days later, and "martin-skidmore-584286" three days later, each shifting the Long Count by exactly its difference in days. Four of the eight published constants are offered: the other four sit tens of thousands of days away and are of historical interest only. The 584281 constant is the Martínez Hernández correlation, after Juan Martínez Hernández. */ correlation?: 'gmt-584283' | 'martinez-hernandez-584281' | 'astronomical-584285' | 'martin-skidmore-584286'; /** * Which reading of the world direction and colour to serve for a day sign. The two published assignments differ by exactly one quarter turn on all twenty signs, so neither is a rounding of the other and a silent pick would be a school choice. "madrid-codex" is the codex reading and the default; "landa" is the sixteenth century assignment recorded beside it. */ directionScheme?: 'madrid-codex' | 'landa'; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/mesoamerican-astrology/mayan/compatibility'; }; export type CalculateMayanCompatibilityErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type CalculateMayanCompatibilityError = CalculateMayanCompatibilityErrors[keyof CalculateMayanCompatibilityErrors]; export type CalculateMayanCompatibilityResponses = { /** * The comparison of the two days. */ 200: { /** * The Tzolkin day the first person was born on. */ personA: { /** * Machine identifier of the Tzolkin day sign, always lowercase ASCII Yucatec whatever the lang parameter says, so it stays safe to compare against in code. The twenty ids run imix, ik, akbal, kan, chikchan, kimi, manik, lamat, muluk, ok, chuwen, eb, ben, ix, men, kib, kaban, etznab, kawak, ajaw. */ daySign: string; /** * Display name of the day sign in the standard Maya orthography, where the ejective is written with a modifier letter rather than a typewriter quote. A proper noun carried as data, so it is identical under every lang. */ daySignName: string; /** * The sixteenth century Yucatec spelling of the same sign, which is the form most printed reference tables and older sources use. Useful for matching a name a reader copied out of a book. */ daySignClassic: string; /** * The Kʼicheʼ name of the same day from the living highland daykeeping tradition, which is the vocabulary a nawal reading in Guatemala uses. A parallel naming tradition rather than a translation, so it is identical under every lang. */ daySignKiche: string; /** * The Tzolkin coefficient, 1 to 13. This is the classical day number that runs alongside the twenty signs; it is not a rank and a 13 is not better than a 1. Nine of the thirteen carry a recorded character, which is returned separately. */ number: number; /** * The thirteen day period this day belongs to. The trecena is the unit a daykeeper reads a run of days in, and the sign it opens on is what gives the whole period its character. */ trecena: { /** * Which of the twenty thirteen day periods this day falls in, 1 to 20. Trecena 1 opens on 1 Imix. */ number: number; /** * Position of this day inside its trecena, 1 to 13. Always equal to the coefficient, because a trecena is exactly one run of the coefficient. */ dayOfTrecena: number; /** * Machine identifier of the day sign the trecena opens on, which the tradition reads as colouring all thirteen of its days. */ rulingSign: string; /** * Display name of the sign the trecena opens on. A proper noun carried as data. */ rulingSignName: string; }; /** * Echo of the first birth date. */ date: string; }; /** * The Tzolkin day the second person was born on. */ personB: { /** * Machine identifier of the Tzolkin day sign, always lowercase ASCII Yucatec whatever the lang parameter says, so it stays safe to compare against in code. The twenty ids run imix, ik, akbal, kan, chikchan, kimi, manik, lamat, muluk, ok, chuwen, eb, ben, ix, men, kib, kaban, etznab, kawak, ajaw. */ daySign: string; /** * Display name of the day sign in the standard Maya orthography, where the ejective is written with a modifier letter rather than a typewriter quote. A proper noun carried as data, so it is identical under every lang. */ daySignName: string; /** * The sixteenth century Yucatec spelling of the same sign, which is the form most printed reference tables and older sources use. Useful for matching a name a reader copied out of a book. */ daySignClassic: string; /** * The Kʼicheʼ name of the same day from the living highland daykeeping tradition, which is the vocabulary a nawal reading in Guatemala uses. A parallel naming tradition rather than a translation, so it is identical under every lang. */ daySignKiche: string; /** * The Tzolkin coefficient, 1 to 13. This is the classical day number that runs alongside the twenty signs; it is not a rank and a 13 is not better than a 1. Nine of the thirteen carry a recorded character, which is returned separately. */ number: number; /** * The thirteen day period this day belongs to. The trecena is the unit a daykeeper reads a run of days in, and the sign it opens on is what gives the whole period its character. */ trecena: { /** * Which of the twenty thirteen day periods this day falls in, 1 to 20. Trecena 1 opens on 1 Imix. */ number: number; /** * Position of this day inside its trecena, 1 to 13. Always equal to the coefficient, because a trecena is exactly one run of the coefficient. */ dayOfTrecena: number; /** * Machine identifier of the day sign the trecena opens on, which the tradition reads as colouring all thirteen of its days. */ rulingSign: string; /** * Display name of the sign the trecena opens on. A proper noun carried as data. */ rulingSignName: string; }; /** * Echo of the second birth date. */ date: string; }; /** * How far apart the two days sit in the 260 day round, taken the short way round, so the value never exceeds 130. Two people on the same nawal are 0 apart. */ daysApart: number; /** * The five structural ties, in a fixed order, each either holding or not. Every one of them is a property of the count itself or of the measured daykeeper cross convention; what is ours is only the decision to weigh them together. */ components: Array<{ /** * Which tie this row reports: same-sign, same-trecena, same-number, cross-partner or shared-direction. Always English so it stays safe to switch on. */ id: string; /** * Whether this tie holds for the pair. Every component is returned whether it holds or not, so a caller can render the misses as well as the hits. */ holds: boolean; /** * Points this tie contributes to the score when it holds, and nothing when it does not. The weights are published rather than hidden precisely because the weighting is ours rather than traditional. */ weight: number; /** * One line on what this tie means. Present ONLY when the tie holds, so a caller can render the hits without filtering and a miss carries no sentence to explain away. */ reading?: string; }>; /** * A RoxyAPI COMPOSITE, not a traditional rating. No classical source rates a pair of Tzolkin days, so this number is a floor of 45 plus the weight of every tie that holds, capped at 100. The components above are what is sourced; this is what we built out of them, and it is labelled so that nobody cites it as tradition. */ score: number; /** * Coarse band the composite score falls in: excellent, strong, workable or reserved. Built for badges and filters that should not hard code a threshold against a number whose weighting may be tuned. */ verdict: string; /** * One composed sentence naming both nawals and the distance between them, for a headline above the component list. When no tie holds at all it says so, because that is the common case and a blank component list is not self explanatory. */ summary: string; /** * The conventions this comparison was computed under. The direction scheme is echoed because one of the five ties is read off the world directions, which the two schemes assign differently. */ conventions: { /** * The correlation constant actually applied, whether it was requested or defaulted. Store this beside any Maya date you persist: the same civil date resolves to a different Long Count under each constant, and a date with no correlation recorded cannot be reproduced. */ correlation: string; /** * The direction reading actually applied. The two readings sit one quarter turn apart, so a direction stored without this value is ambiguous. */ directionScheme: string; }; }; }; export type CalculateMayanCompatibilityResponse = CalculateMayanCompatibilityResponses[keyof CalculateMayanCompatibilityResponses]; export type ListMayanDaySignsData = { body?: never; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; /** * Which reading of the world direction and colour to serve for a day sign. The two published assignments differ by exactly one quarter turn on all twenty signs, so neither is a rounding of the other and a silent pick would be a school choice. "madrid-codex" is the codex reading and the default; "landa" is the sixteenth century assignment recorded beside it. */ directionScheme?: 'madrid-codex' | 'landa'; /** * Maximum items to return per page. Range: 1-20, default 20. */ limit?: number; /** * Number of items to skip for pagination. Default 0. */ offset?: number; }; url: '/mesoamerican-astrology/mayan/day-signs'; }; export type ListMayanDaySignsErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type ListMayanDaySignsError = ListMayanDaySignsErrors[keyof ListMayanDaySignsErrors]; export type ListMayanDaySignsResponses = { /** * The day sign catalogue. */ 200: { /** * Total signs in the cycle. Always 20; the Tzolkin sign set is closed. */ total: number; /** * Maximum items returned for this page. */ limit: number; /** * Number of items skipped before this page. */ offset: number; /** * Day signs for the current page, in sequence order. Use /mayan/day-signs/{id} for the full record with the composed reading, strengths, challenges and guidance. */ daySigns: Array<{ /** * Place in the twenty sign sequence, 1 to 20, counting Imix as 1. The sequence never varies and is what every other cycle in the domain is indexed against. */ position: number; /** * Machine identifier of the day sign, always lowercase ASCII Yucatec whatever the lang parameter says, so it stays safe to compare against in code and to use as a path parameter. The twenty ids run imix, ik, akbal, kan, chikchan, kimi, manik, lamat, muluk, ok, chuwen, eb, ben, ix, men, kib, kaban, etznab, kawak, ajaw. */ id: string; /** * Display name in the standard Maya orthography, where an ejective is written with a modifier letter rather than a typewriter quote. A proper noun carried as data, identical under every lang. */ nameYucatec: string; /** * The sixteenth century Yucatec spelling of the same sign, which is the form most printed reference tables and older books use. */ nameClassic: string; /** * The Kʼicheʼ name from the living highland daykeeping tradition, which is the vocabulary a nawal reading in Guatemala uses. A parallel naming tradition rather than a translation, so it is identical under every lang. */ nameKiche: string; /** * The short day-name association, translated in place because it is a common noun rather than a name. Two published readings of the twenty signs disagree on six of them, so the alternate reading ships beside this one rather than one being resolved away. */ gloss: string; /** * The glyph-table reading of the same sign, translated in place. On the six signs where the two readings disagree this is the one the composed prose follows, so a reading that seems to ignore the gloss above is doing so deliberately. */ glossAlternate: string; /** * World direction this sign belongs to under the requested scheme: east, north, west or south. The twenty signs divide evenly into four groups of five, so exactly five signs share each quarter. */ direction: string; /** * Colour paired with the direction: red for east, white for north, black for west, yellow for south. Always English so it stays safe to key a palette off. */ color: string; }>; /** * The conventions this listing was served under. Only the direction scheme applies here, because it is the only field on a catalogue row that a school split moves. */ conventions: { /** * The direction reading actually applied. The two readings sit one quarter turn apart, so a direction stored without this value is ambiguous. */ directionScheme: string; }; }; }; export type ListMayanDaySignsResponse = ListMayanDaySignsResponses[keyof ListMayanDaySignsResponses]; export type GetMayanDaySignData = { body?: never; path: { /** * Day sign id, case-insensitive and punctuation-insensitive. One of imix, ik, akbal, kan, chikchan, kimi, manik, lamat, muluk, ok, chuwen, eb, ben, ix, men, kib, kaban, etznab, kawak, ajaw. */ id: 'imix' | 'ik' | 'akbal' | 'kan' | 'chikchan' | 'kimi' | 'manik' | 'lamat' | 'muluk' | 'ok' | 'chuwen' | 'eb' | 'ben' | 'ix' | 'men' | 'kib' | 'kaban' | 'etznab' | 'kawak' | 'ajaw'; }; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; /** * Which reading of the world direction and colour to serve for a day sign. The two published assignments differ by exactly one quarter turn on all twenty signs, so neither is a rounding of the other and a silent pick would be a school choice. "madrid-codex" is the codex reading and the default; "landa" is the sixteenth century assignment recorded beside it. */ directionScheme?: 'madrid-codex' | 'landa'; }; url: '/mesoamerican-astrology/mayan/day-signs/{id}'; }; export type GetMayanDaySignErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetMayanDaySignError = GetMayanDaySignErrors[keyof GetMayanDaySignErrors]; export type GetMayanDaySignResponses = { /** * Full day sign profile. */ 200: { /** * Place in the twenty sign sequence, 1 to 20, counting Imix as 1. The sequence never varies and is what every other cycle in the domain is indexed against. */ position: number; /** * Machine identifier of the day sign, always lowercase ASCII Yucatec whatever the lang parameter says, so it stays safe to compare against in code and to use as a path parameter. The twenty ids run imix, ik, akbal, kan, chikchan, kimi, manik, lamat, muluk, ok, chuwen, eb, ben, ix, men, kib, kaban, etznab, kawak, ajaw. */ id: string; /** * Display name in the standard Maya orthography, where an ejective is written with a modifier letter rather than a typewriter quote. A proper noun carried as data, identical under every lang. */ nameYucatec: string; /** * The sixteenth century Yucatec spelling of the same sign, which is the form most printed reference tables and older books use. */ nameClassic: string; /** * The Kʼicheʼ name from the living highland daykeeping tradition, which is the vocabulary a nawal reading in Guatemala uses. A parallel naming tradition rather than a translation, so it is identical under every lang. */ nameKiche: string; /** * The short day-name association, translated in place because it is a common noun rather than a name. Two published readings of the twenty signs disagree on six of them, so the alternate reading ships beside this one rather than one being resolved away. */ gloss: string; /** * The glyph-table reading of the same sign, translated in place. On the six signs where the two readings disagree this is the one the composed prose follows, so a reading that seems to ignore the gloss above is doing so deliberately. */ glossAlternate: string; /** * World direction this sign belongs to under the requested scheme: east, north, west or south. The twenty signs divide evenly into four groups of five, so exactly five signs share each quarter. */ direction: string; /** * Colour paired with the direction: red for east, white for north, black for west, yellow for south. Always English so it stays safe to key a palette off. */ color: string; /** * The sign in one composed sentence: both names, what it is about and the glyph reading behind it. */ keynote: string; /** * The world direction in prose, followed by a line naming which of the two published readings produced it. The two sit one quarter turn apart on all twenty signs. */ directionReading: string; /** * What the sign is about, as a clause rather than a sentence, because it is spliced into composed prose elsewhere in the API. Translated in place. */ essence: string; /** * What the sign does well, as full sentences rather than keywords. */ strengths: Array; /** * Where the same temperament costs the sign something. Each one is the shadow of a strength above rather than an unrelated flaw. */ challenges: Array; /** * The one thing worth doing differently under this sign. */ guidance: string; /** * The thirteen day period this sign opens. Composed from the sign rather than stored, so the two can never disagree. */ trecena: { /** * The trecena this sign opens, 1 to 20. Every sign opens exactly one trecena, because 13 and 20 share no factor. */ number: number; /** * The composed reading of the thirteen day period this sign opens. */ reading: string; }; /** * The conventions this profile was served under. */ conventions: { /** * The direction reading actually applied. The two readings sit one quarter turn apart, so a direction stored without this value is ambiguous. */ directionScheme: string; }; }; }; export type GetMayanDaySignResponse = GetMayanDaySignResponses[keyof GetMayanDaySignResponses]; export type ListTrecenasData = { body?: never; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; /** * Maximum items to return per page. Range: 1-20, default 20. */ limit?: number; /** * Number of items to skip for pagination. Default 0. */ offset?: number; }; url: '/mesoamerican-astrology/mayan/trecenas'; }; export type ListTrecenasErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type ListTrecenasError = ListTrecenasErrors[keyof ListTrecenasErrors]; export type ListTrecenasResponses = { /** * The trecena catalogue. */ 200: { /** * Total trecenas in the round. Always 20, because 260 divided by 13 is exactly 20. */ total: number; /** * Maximum items returned for this page. */ limit: number; /** * Number of items skipped before this page. */ offset: number; /** * Trecenas for the current page, in order from the one that opens on 1 Imix. */ trecenas: Array<{ /** * Which of the twenty thirteen day periods this is, 1 to 20. Trecena 1 opens on 1 Imix and the openers step thirteen signs at a time from there. */ number: number; /** * Machine identifier of the day sign the period opens on, which the tradition reads as colouring all thirteen of its days. */ rulingSign: string; /** * Display name of the sign the period opens on. A proper noun carried as data. */ rulingSignName: string; /** * Kʼicheʼ name of the same sign, the vocabulary a highland reading uses. */ rulingSignKiche: string; /** * Days in the period. Always 13, which is what the word trecena means. */ length: number; /** * The composed reading of the period, built from the sign it opens on. Composed rather than stored, so it can never drift away from the day sign it is drawn from. */ reading: string; }>; }; }; export type ListTrecenasResponse = ListTrecenasResponses[keyof ListTrecenasResponses]; export type GetTrecenaData = { body?: never; path: { /** * Trecena number, 1 to 20. Trecena 1 opens on 1 Imix, trecena 2 on 1 Ix, and each subsequent period opens thirteen signs further round the twenty. */ number: number; }; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/mesoamerican-astrology/mayan/trecenas/{number}'; }; export type GetTrecenaErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetTrecenaError = GetTrecenaErrors[keyof GetTrecenaErrors]; export type GetTrecenaResponses = { /** * The trecena. */ 200: { /** * Which of the twenty thirteen day periods this is, 1 to 20. Trecena 1 opens on 1 Imix and the openers step thirteen signs at a time from there. */ number: number; /** * Machine identifier of the day sign the period opens on, which the tradition reads as colouring all thirteen of its days. */ rulingSign: string; /** * Display name of the sign the period opens on. A proper noun carried as data. */ rulingSignName: string; /** * Kʼicheʼ name of the same sign, the vocabulary a highland reading uses. */ rulingSignKiche: string; /** * Days in the period. Always 13, which is what the word trecena means. */ length: number; /** * The composed reading of the period, built from the sign it opens on. Composed rather than stored, so it can never drift away from the day sign it is drawn from. */ reading: string; }; }; export type GetTrecenaResponse = GetTrecenaResponses[keyof GetTrecenaResponses]; export type ListHaabMonthsData = { body?: never; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; /** * Maximum items to return per page. Range: 1-19, default 19. */ limit?: number; /** * Number of items to skip for pagination. Default 0. */ offset?: number; }; url: '/mesoamerican-astrology/mayan/haab-months'; }; export type ListHaabMonthsErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type ListHaabMonthsError = ListHaabMonthsErrors[keyof ListHaabMonthsErrors]; export type ListHaabMonthsResponses = { /** * The Haab period catalogue. */ 200: { /** * Total periods in the Haab year. Always 19: eighteen months plus Wayebʼ, which is a period of the year even though it is only five days. */ total: number; /** * Maximum items returned for this page. */ limit: number; /** * Number of items skipped before this page. */ offset: number; /** * Periods for the current page, in order from Pop. */ months: Array<{ /** * Place in the Haab year, 1 to 19. Pop is 1 and Wayebʼ is 19, so a position of 19 always means the five short days. */ position: number; /** * Machine identifier of the Haab period, always lowercase ASCII, so it stays safe to compare against and to use as a path parameter. The nineteen ids run pop, wo, sip, sotz, sek, xul, yaxkin, mol, chen, yax, sak, keh, mak, kankin, muwan, pax, kayab, kumku, wayeb. */ id: string; /** * Display name in the standard orthography. A proper noun carried as data, identical under every lang. */ nameYucatec: string; /** * The sixteenth century Yucatec spelling, which is the form most printed tables use. */ nameClassic: string; /** * Days in the period. Twenty for the eighteen months and five for Wayebʼ, which is never twenty. Days inside a period are numbered from 0, so a twenty day period runs 0 to 19. */ length: number; /** * What the period name means, translated in place because it is a common noun rather than a name. */ gloss: string; /** * The composed reading of the period, built from its position, its length and its gloss. */ reading: string; }>; }; }; export type ListHaabMonthsResponse = ListHaabMonthsResponses[keyof ListHaabMonthsResponses]; export type GetHaabMonthData = { body?: never; path: { /** * Haab period id, case-insensitive and punctuation-insensitive. One of pop, wo, sip, sotz, sek, xul, yaxkin, mol, chen, yax, sak, keh, mak, kankin, muwan, pax, kayab, kumku, wayeb. */ id: 'pop' | 'wo' | 'sip' | 'sotz' | 'sek' | 'xul' | 'yaxkin' | 'mol' | 'chen' | 'yax' | 'sak' | 'keh' | 'mak' | 'kankin' | 'muwan' | 'pax' | 'kayab' | 'kumku' | 'wayeb'; }; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/mesoamerican-astrology/mayan/haab-months/{id}'; }; export type GetHaabMonthErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetHaabMonthError = GetHaabMonthErrors[keyof GetHaabMonthErrors]; export type GetHaabMonthResponses = { /** * The Haab period. */ 200: { /** * Place in the Haab year, 1 to 19. Pop is 1 and Wayebʼ is 19, so a position of 19 always means the five short days. */ position: number; /** * Machine identifier of the Haab period, always lowercase ASCII, so it stays safe to compare against and to use as a path parameter. The nineteen ids run pop, wo, sip, sotz, sek, xul, yaxkin, mol, chen, yax, sak, keh, mak, kankin, muwan, pax, kayab, kumku, wayeb. */ id: string; /** * Display name in the standard orthography. A proper noun carried as data, identical under every lang. */ nameYucatec: string; /** * The sixteenth century Yucatec spelling, which is the form most printed tables use. */ nameClassic: string; /** * Days in the period. Twenty for the eighteen months and five for Wayebʼ, which is never twenty. Days inside a period are numbered from 0, so a twenty day period runs 0 to 19. */ length: number; /** * What the period name means, translated in place because it is a common noun rather than a name. */ gloss: string; /** * The composed reading of the period, built from its position, its length and its gloss. */ reading: string; }; }; export type GetHaabMonthResponse = GetHaabMonthResponses[keyof GetHaabMonthResponses]; export type CalculateTonalpohualliData = { body: { /** * Date in YYYY-MM-DD format, in the PROLEPTIC GREGORIAN calendar, extended backwards unchanged through the 1582 reform. Years 1 to 4000 are accepted. A reference converter that switches to the Julian calendar below the reform will disagree with a date before 15 October 1582 by ten or eleven days; that is a difference of input convention rather than of arithmetic, and passing the Julian equivalent to such a tool reproduces these values exactly. A single-digit month or day is accepted and zero padded. */ date: string; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/mesoamerican-astrology/aztec/tonalpohualli'; }; export type CalculateTonalpohualliErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type CalculateTonalpohualliError = CalculateTonalpohualliErrors[keyof CalculateTonalpohualliErrors]; export type CalculateTonalpohualliResponses = { /** * The tonalpohualli day for this date. */ 200: { /** * Machine identifier of the tonalpohualli day sign, always lowercase ASCII Nahuatl whatever the lang parameter says, so it stays safe to compare against in code. The twenty ids run cipactli, ehecatl, calli, cuetzpalin, coatl, miquiztli, mazatl, tochtli, atl, itzcuintli, ozomahtli, malinalli, acatl, ocelotl, cuauhtli, cozcacuauhtli, ollin, tecpatl, quiahuitl, xochitl. */ daySign: string; /** * Display name in Nahuatl with the vowel length marks the reference tables print. A proper noun carried as data, so it is identical under every lang. */ daySignName: string; /** * What the sign name means, translated in place because it is a common noun. Several English renderings are in circulation for some signs and all of them are given rather than one being picked. */ gloss: string; /** * World direction the sign belongs to: east, north, west or south. The twenty run through the four quarters in order, so the direction is a property of the position as much as of the sign. */ direction: string; /** * The tonalpohualli coefficient, 1 to 13. Structurally the same count as the Maya coefficient and read the same way: a rank it is not. */ number: number; /** * The thirteen day period this day belongs to, named by the sign it opens on. No patron deity is returned: the published patron column carries an unresolved disagreement on two of the twenty rows, and a column that is right for eighteen and guessed for two is worse than none. */ trecena: { /** * Which of the twenty thirteen day periods this day falls in, 1 to 20. */ number: number; /** * Position of this day inside its trecena, 1 to 13. Always equal to the coefficient. */ dayOfTrecena: number; /** * Machine identifier of the day sign the trecena opens on. */ startSign: string; /** * Display name of the sign the trecena opens on. A proper noun carried as data. */ startSignName: string; }; /** * The sign in one composed sentence. Composed per request from the sign components rather than stored whole. */ keynote: string; /** * The one thing worth doing differently under this sign. */ guidance: string; /** * A plain statement of what this family covers and what it deliberately leaves out. Present on every response so nobody has to guess whether a missing field is an outage or a decision. */ scope: string; /** * Echo of the date the day was resolved from, in proleptic Gregorian. */ date: string; /** * The conventions this answer was computed under, echoed so the result is self describing. */ conventions: { /** * The correlation this count runs on, anchored on the recorded day 1 Coatl at the fall of Tenochtitlan, 13 August 1521 in the Julian calendar and 23 August 1521 in the proleptic Gregorian calendar this API takes. It is echoed rather than requested because it is not a switch: the anchor is a civil date, so no correlation constant enters the arithmetic, and the published alternatives for this calendar move the solar year alignment rather than the day count. The count was verified to run in step with the Maya count under the default constant, on the anchor and on two modern dates. */ correlation: string; }; }; }; export type CalculateTonalpohualliResponse = CalculateTonalpohualliResponses[keyof CalculateTonalpohualliResponses]; export type GetDailyAztecReadingData = { body?: never; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; /** * Date in YYYY-MM-DD format, in the PROLEPTIC GREGORIAN calendar, extended backwards unchanged through the 1582 reform. Years 1 to 4000 are accepted. A reference converter that switches to the Julian calendar below the reform will disagree with a date before 15 October 1582 by ten or eleven days; that is a difference of input convention rather than of arithmetic, and passing the Julian equivalent to such a tool reproduces these values exactly. A single-digit month or day is accepted and zero padded. Defaults to the current day in UTC. */ date?: string; }; url: '/mesoamerican-astrology/aztec/daily'; }; export type GetDailyAztecReadingErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetDailyAztecReadingError = GetDailyAztecReadingErrors[keyof GetDailyAztecReadingErrors]; export type GetDailyAztecReadingResponses = { /** * The tonalpohualli reading for this day. */ 200: { /** * Machine identifier of the tonalpohualli day sign, always lowercase ASCII Nahuatl whatever the lang parameter says, so it stays safe to compare against in code. The twenty ids run cipactli, ehecatl, calli, cuetzpalin, coatl, miquiztli, mazatl, tochtli, atl, itzcuintli, ozomahtli, malinalli, acatl, ocelotl, cuauhtli, cozcacuauhtli, ollin, tecpatl, quiahuitl, xochitl. */ daySign: string; /** * Display name in Nahuatl with the vowel length marks the reference tables print. A proper noun carried as data, so it is identical under every lang. */ daySignName: string; /** * What the sign name means, translated in place because it is a common noun. Several English renderings are in circulation for some signs and all of them are given rather than one being picked. */ gloss: string; /** * World direction the sign belongs to: east, north, west or south. The twenty run through the four quarters in order, so the direction is a property of the position as much as of the sign. */ direction: string; /** * The tonalpohualli coefficient, 1 to 13. Structurally the same count as the Maya coefficient and read the same way: a rank it is not. */ number: number; /** * The thirteen day period this day belongs to, named by the sign it opens on. No patron deity is returned: the published patron column carries an unresolved disagreement on two of the twenty rows, and a column that is right for eighteen and guessed for two is worse than none. */ trecena: { /** * Which of the twenty thirteen day periods this day falls in, 1 to 20. */ number: number; /** * Position of this day inside its trecena, 1 to 13. Always equal to the coefficient. */ dayOfTrecena: number; /** * Machine identifier of the day sign the trecena opens on. */ startSign: string; /** * Display name of the sign the trecena opens on. A proper noun carried as data. */ startSignName: string; }; /** * The sign in one composed sentence. Composed per request from the sign components rather than stored whole. */ keynote: string; /** * The one thing worth doing differently under this sign. */ guidance: string; /** * A plain statement of what this family covers and what it deliberately leaves out. Present on every response so nobody has to guess whether a missing field is an outage or a decision. */ scope: string; /** * Date of this reading. Echoes the date requested, or the current day in UTC when it was omitted. */ date: string; /** * What the day carries, placing it inside its trecena as well as naming it. Composed per request, so it stays consistent with the keynote rather than being a second opinion. */ overview: string; /** * The conventions this reading was computed under, echoed so the result is self describing. */ conventions: { /** * The correlation this count runs on, anchored on the recorded day 1 Coatl at the fall of Tenochtitlan, 13 August 1521 in the Julian calendar and 23 August 1521 in the proleptic Gregorian calendar this API takes. It is echoed rather than requested because it is not a switch: the anchor is a civil date, so no correlation constant enters the arithmetic, and the published alternatives for this calendar move the solar year alignment rather than the day count. The count was verified to run in step with the Maya count under the default constant, on the anchor and on two modern dates. */ correlation: string; }; }; }; export type GetDailyAztecReadingResponse = GetDailyAztecReadingResponses[keyof GetDailyAztecReadingResponses]; export type ListAztecDaySignsData = { body?: never; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; /** * Maximum items to return per page. Range: 1-20, default 20. */ limit?: number; /** * Number of items to skip for pagination. Default 0. */ offset?: number; }; url: '/mesoamerican-astrology/aztec/day-signs'; }; export type ListAztecDaySignsErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type ListAztecDaySignsError = ListAztecDaySignsErrors[keyof ListAztecDaySignsErrors]; export type ListAztecDaySignsResponses = { /** * The tonalpohualli day sign catalogue. */ 200: { /** * Total signs in the cycle. Always 20; the sign set is closed. */ total: number; /** * Maximum items returned for this page. */ limit: number; /** * Number of items skipped before this page. */ offset: number; /** * Day signs for the current page, in sequence order. */ daySigns: Array<{ /** * Place in the twenty sign sequence, 1 to 20, counting Cipactli as 1. The sequence never varies and is what the trecenas are indexed against. */ position: number; /** * Machine identifier of the day sign, always lowercase ASCII Nahuatl whatever the lang parameter says, so it stays safe to compare against and to use as a path parameter. The twenty ids run cipactli, ehecatl, calli, cuetzpalin, coatl, miquiztli, mazatl, tochtli, atl, itzcuintli, ozomahtli, malinalli, acatl, ocelotl, cuauhtli, cozcacuauhtli, ollin, tecpatl, quiahuitl, xochitl. */ id: string; /** * Display name in Nahuatl with the vowel length marks the reference tables print. A proper noun carried as data, identical under every lang. */ nameNahuatl: string; /** * What the sign name means, translated in place because it is a common noun. Where several English renderings are in circulation all of them are given rather than one being picked. */ gloss: string; /** * World direction the sign belongs to: east, north, west or south. The twenty run through the four quarters in strict rotation, so every fourth sign shares a quarter. */ direction: string; /** * What the sign is about, as a clause rather than a sentence, because it is spliced into composed prose elsewhere in the API. Translated in place. */ essence: string; /** * The one thing worth doing differently under this sign. */ guidance: string; /** * The sign in one composed sentence, built from the components above. */ keynote: string; }>; }; }; export type ListAztecDaySignsResponse = ListAztecDaySignsResponses[keyof ListAztecDaySignsResponses]; export type GetAztecDaySignData = { body?: never; path: { /** * Day sign id, case-insensitive and punctuation-insensitive. One of cipactli, ehecatl, calli, cuetzpalin, coatl, miquiztli, mazatl, tochtli, atl, itzcuintli, ozomahtli, malinalli, acatl, ocelotl, cuauhtli, cozcacuauhtli, ollin, tecpatl, quiahuitl, xochitl. */ id: 'cipactli' | 'ehecatl' | 'calli' | 'cuetzpalin' | 'coatl' | 'miquiztli' | 'mazatl' | 'tochtli' | 'atl' | 'itzcuintli' | 'ozomahtli' | 'malinalli' | 'acatl' | 'ocelotl' | 'cuauhtli' | 'cozcacuauhtli' | 'ollin' | 'tecpatl' | 'quiahuitl' | 'xochitl'; }; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/mesoamerican-astrology/aztec/day-signs/{id}'; }; export type GetAztecDaySignErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetAztecDaySignError = GetAztecDaySignErrors[keyof GetAztecDaySignErrors]; export type GetAztecDaySignResponses = { /** * The tonalpohualli day sign. */ 200: { /** * Place in the twenty sign sequence, 1 to 20, counting Cipactli as 1. The sequence never varies and is what the trecenas are indexed against. */ position: number; /** * Machine identifier of the day sign, always lowercase ASCII Nahuatl whatever the lang parameter says, so it stays safe to compare against and to use as a path parameter. The twenty ids run cipactli, ehecatl, calli, cuetzpalin, coatl, miquiztli, mazatl, tochtli, atl, itzcuintli, ozomahtli, malinalli, acatl, ocelotl, cuauhtli, cozcacuauhtli, ollin, tecpatl, quiahuitl, xochitl. */ id: string; /** * Display name in Nahuatl with the vowel length marks the reference tables print. A proper noun carried as data, identical under every lang. */ nameNahuatl: string; /** * What the sign name means, translated in place because it is a common noun. Where several English renderings are in circulation all of them are given rather than one being picked. */ gloss: string; /** * World direction the sign belongs to: east, north, west or south. The twenty run through the four quarters in strict rotation, so every fourth sign shares a quarter. */ direction: string; /** * What the sign is about, as a clause rather than a sentence, because it is spliced into composed prose elsewhere in the API. Translated in place. */ essence: string; /** * The one thing worth doing differently under this sign. */ guidance: string; /** * The sign in one composed sentence, built from the components above. */ keynote: string; }; }; export type GetAztecDaySignResponse = GetAztecDaySignResponses[keyof GetAztecDaySignResponses]; export type ListAztecTrecenasData = { body?: never; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; /** * Maximum items to return per page. Range: 1-20, default 20. */ limit?: number; /** * Number of items to skip for pagination. Default 0. */ offset?: number; }; url: '/mesoamerican-astrology/aztec/trecenas'; }; export type ListAztecTrecenasErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type ListAztecTrecenasError = ListAztecTrecenasErrors[keyof ListAztecTrecenasErrors]; export type ListAztecTrecenasResponses = { /** * The tonalpohualli trecena catalogue. */ 200: { /** * Total trecenas in the count. Always 20, because 260 divided by 13 is exactly 20. */ total: number; /** * Maximum items returned for this page. */ limit: number; /** * Number of items skipped before this page. */ offset: number; /** * Trecenas for the current page, in order from the one that opens on 1 Cipactli. */ trecenas: Array<{ /** * Which of the twenty thirteen day periods this is, 1 to 20. Trecena 1 opens on 1 Cipactli and the openers step thirteen signs at a time from there. */ number: number; /** * Machine identifier of the day sign the period opens on. */ startSign: string; /** * Display name of the sign the period opens on. A proper noun carried as data. */ startSignName: string; /** * Days in the period. Always 13, which is what the word trecena means. */ length: number; /** * The composed reading of the period, built from the sign it opens on rather than stored, so the two can never drift apart. No patron deity is named, because two of the twenty published patrons are disputed and none ships rather than eighteen shipping beside two guesses. */ reading: string; }>; }; }; export type ListAztecTrecenasResponse = ListAztecTrecenasResponses[keyof ListAztecTrecenasResponses]; export type GetAztecTrecenaData = { body?: never; path: { /** * Trecena number, 1 to 20. Trecena 1 opens on 1 Cipactli, trecena 2 on 1 Ocelotl, and each subsequent period opens thirteen signs further round the twenty. */ number: number; }; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/mesoamerican-astrology/aztec/trecenas/{number}'; }; export type GetAztecTrecenaErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetAztecTrecenaError = GetAztecTrecenaErrors[keyof GetAztecTrecenaErrors]; export type GetAztecTrecenaResponses = { /** * The tonalpohualli trecena. */ 200: { /** * Which of the twenty thirteen day periods this is, 1 to 20. Trecena 1 opens on 1 Cipactli and the openers step thirteen signs at a time from there. */ number: number; /** * Machine identifier of the day sign the period opens on. */ startSign: string; /** * Display name of the sign the period opens on. A proper noun carried as data. */ startSignName: string; /** * Days in the period. Always 13, which is what the word trecena means. */ length: number; /** * The composed reading of the period, built from the sign it opens on rather than stored, so the two can never drift apart. No patron deity is named, because two of the twenty published patrons are disputed and none ships rather than eighteen shipping beside two guesses. */ reading: string; }; }; export type GetAztecTrecenaResponse = GetAztecTrecenaResponses[keyof GetAztecTrecenaResponses]; export type CalculateEntrancePadaData = { /** * Where the main door sits on the plot. Send facing or facingDegrees, never both, and locate the door with either door coordinates or doorPosition, never both. */ body?: { /** * The ground the mandala is projected over. Send width and depth for a compass-aligned rectangle, or polygon for anything else. The x axis runs east and the y axis north, and the mandala is aligned to the compass rather than to the building. */ plot: { /** * East-west extent of a rectangular plot, in the unit given. Send this with depth for a rectangle, or send polygon instead. */ width?: number; /** * North-south extent of a rectangular plot, in the unit given. Send this with width for a rectangle, or send polygon instead. */ depth?: number; /** * The plot outline as 3 to 16 vertices in plot coordinates, x east and y north, in either winding order. Use this instead of width and depth for a plot with a cut corner, an extension or an irregular boundary. */ polygon?: Array<{ /** * Distance east of the plot origin, in the same unit as the plot. The x axis runs east. */ x: number; /** * Distance north of the plot origin, in the same unit as the plot. The y axis runs north. */ y: number; }>; /** * Unit the plot dimensions are given in. Every distance the response returns is in this same unit. The mandala projection is scale free, so this affects the areas and the marma size and nothing else. */ unit?: 'feet' | 'metres'; }; /** * Direction the front of the house looks out toward, one of the eight compass sectors. Case and punctuation are folded, so north-east, northeast and NorthEast all resolve. Send this or facingDegrees, never both. */ facing?: 'North' | 'Northeast' | 'East' | 'Southeast' | 'South' | 'Southwest' | 'West' | 'Northwest'; /** * Direction the front of the house looks out toward, as a compass bearing in degrees clockwise from true north, measured looking OUT from the building. The same convention the feng shui facing endpoints use, so a bearing works unchanged across the two domains. Send this or facing, never both. */ facingDegrees?: number; /** * Where the main door sits, in plot coordinates. The point is snapped to the nearest boundary of the plot, so a coordinate read off a drawing that lands slightly inside or outside still resolves. Send this or doorPosition, never both. */ door?: { /** * Distance east of the plot origin, in the same unit as the plot. The x axis runs east. */ x: number; /** * Distance north of the plot origin, in the same unit as the plot. The y axis runs north. */ y: number; }; /** * Where the main door sits along the facing side, as a fraction from 0 to 1 measured from the corner the chapter starts that side at: the north-east for an east facing, the south-east for a south facing, the south-west for a west facing and the north-west for a north facing. The side carries 8 padas, so to aim at pada n of 8 send its midpoint, (n - 0.5) / 8: 0.0625 for the first pada, 0.4375 for the fourth, 0.9375 for the eighth. The response names the pada the fraction resolved to in ordinalOnSide. Requires a cardinal facing, since an intercardinal facing names no single side. Send this or door, never both. */ doorPosition?: number; /** * Which division of the ground to read: 81-pada is the Paramasayika of Brihat Samhita 53.42, the grid the chapter numbers and names every devata on, and 64-pada is the Manduka of 53.55, for which the chapter gives structure only and no devata names. Defaults to 81-pada. */ grid?: '81-pada' | '64-pada'; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/vastu/entrance'; }; export type CalculateEntrancePadaErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type CalculateEntrancePadaError = CalculateEntrancePadaErrors[keyof CalculateEntrancePadaErrors]; export type CalculateEntrancePadaResponses = { /** * Entrance pada, its devata, the classical effect and the favourable padas */ 200: { /** * Which of the 32 perimeter padas the main door falls on, numbered 1 to 32. Padas 1 to 8 run down the east side from the north-east corner, 9 to 16 along the south from the south-east, 17 to 24 up the west from the south-west and 25 to 32 along the north from the north-west. This index is the identifier every entrance verdict keys on. */ pada: number; /** * Which of the four sides the pada belongs to. A corner square belongs to exactly one side, decided by the verses rather than by geometry, so the south-east corner reads South even though it sits at the end of the east edge. */ side: string; /** * The corner the chapter counts this side from. The four start corners are stated in the verses themselves, which is what makes the effect to pada alignment a reading rather than an inference. */ startCorner: string; /** * Position of the pada along its own side, 1 to 8, counting from the start corner. Useful for drawing a door strip without recomputing the global index. */ ordinalOnSide: number; /** * The square of the 81 pada grid the door falls in, 1 to 81. It is always the 81 pada square, whichever grid you ask for, because that is the division the chapter numbers and the one the 32 padas are enumerated on. Squares run row-major over the printed plate, so the corners are 1 north-east, 9 south-east, 73 north-west and 81 south-west. */ square: number; /** * The square as a row and column, which is what you draw with. Row 1 is the northern edge and column 1 the western one. */ cell: { /** * Row of the grid the square sits in, 1 at the northern edge. */ rowFromNorth: number; /** * Column of the grid the square sits in, 1 at the western edge. */ columnFromWest: number; }; /** * The devata holding the entrance square. Present only on the 81 pada grid, because 53.55 to 56 gives the 64 pada division its structure and names no devata on it. The effects themselves apply to either division, which is why the pada and the effect are returned in both cases. */ devata?: { /** * Identifier of the devata holding that square. Always English transliteration, safe to compare against and to look up on the devatas endpoint. */ id: string; /** * Display name of the devata. A Sanskrit proper noun: romanised with the diacritics the transliteration carries in every language, and written in Devanagari as the Sanskrit text prints it when lang is hi. Compare on id, never on this. */ name: string; /** * How many of the 81 squares this devata holds: one for a padika, two for a dvipada, three for a tripada and nine for Brahma. */ padaCount: number; }; /** * What the chapter says follows from a main entrance on this pada. Original prose composed from the verse, translated in place when lang is set. */ effect: string; /** * How the stated effect reads: auspicious for a gain, inauspicious for a harm, mixed where the text names a gain and a loss together. A RoxyAPI classification of the verse effect rather than a word in the text, and always English so it is safe to key styling on. */ auspiciousness: string; /** * The verdict as a sentence, for a report or a chat answer. Composed from the pada, its side and its effect, and translated in place when lang is set. */ reading: string; /** * The padas on this same side whose stated effect is a gain, so a door can be moved to the nearest favourable position without re-reading the whole table. Empty on a side where the chapter names no gain at all, which is true of the south. */ recommendedPadas: Array; /** * Where a verdict comes from: a chapter and verse of a named public-domain edition, or the literal convention with the practice it rests on. Every verdict in this domain carries one. */ source: { /** * The primary text this verdict rests on, or the literal value convention where no verse states the rule. Always English, safe to compare against. */ text: string; /** * Chapter of the primary text. Absent on a convention, which has no chapter to cite. */ chapter?: number; /** * Verse or verse range inside the chapter. Absent on a convention. A range is written with a hyphen, as in 115-117. */ verse?: string; /** * Translator of the edition the verse was read in. Absent on a convention. */ translation?: string; /** * Publication year of that edition. Absent on a convention. */ year?: number; /** * Whether the cited edition is in the public domain. True on the 1884 Brihat Samhita edition, whose verses are quoted. False on the 1933 Manasara edition behind the Ayadi formulas, from which only the multipliers, divisors and names are taken, never a sentence. */ publicDomain?: boolean; /** * Why a convention rule says what it says. Present only when text is convention, and it names the tradition the rule comes from rather than a verse. */ basis?: string; }; /** * The switches this reading resolved, echoed so a stored response can be reproduced years later without knowing what the defaults were on the day it was made. */ conventions: { /** * Which division of the ground was read. Echoes the resolved value whether it was sent or defaulted. */ grid: string; /** * Unit every distance and area in the response is measured in, areas in its square. Echoes the resolved value whether it was sent or defaulted. */ unit: 'feet' | 'metres'; }; }; }; export type CalculateEntrancePadaResponse = CalculateEntrancePadaResponses[keyof CalculateEntrancePadaResponses]; export type GenerateMandalaData = { body?: { /** * The ground the mandala is projected over. Send width and depth for a compass-aligned rectangle, or polygon for anything else. The x axis runs east and the y axis north, and the mandala is aligned to the compass rather than to the building. */ plot: { /** * East-west extent of a rectangular plot, in the unit given. Send this with depth for a rectangle, or send polygon instead. */ width?: number; /** * North-south extent of a rectangular plot, in the unit given. Send this with width for a rectangle, or send polygon instead. */ depth?: number; /** * The plot outline as 3 to 16 vertices in plot coordinates, x east and y north, in either winding order. Use this instead of width and depth for a plot with a cut corner, an extension or an irregular boundary. */ polygon?: Array<{ /** * Distance east of the plot origin, in the same unit as the plot. The x axis runs east. */ x: number; /** * Distance north of the plot origin, in the same unit as the plot. The y axis runs north. */ y: number; }>; /** * Unit the plot dimensions are given in. Every distance the response returns is in this same unit. The mandala projection is scale free, so this affects the areas and the marma size and nothing else. */ unit?: 'feet' | 'metres'; }; /** * Which division of the ground to read: 81-pada is the Paramasayika of Brihat Samhita 53.42, the grid the chapter numbers and names every devata on, and 64-pada is the Manduka of 53.55, for which the chapter gives structure only and no devata names. Defaults to 81-pada. */ grid?: '81-pada' | '64-pada'; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/vastu/mandala'; }; export type GenerateMandalaErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GenerateMandalaError = GenerateMandalaErrors[keyof GenerateMandalaErrors]; export type GenerateMandalaResponses = { /** * Every cell of the projected mandala with its devata, brahmasthan and geometry */ 200: { /** * Which division was projected, echoing the resolved value. */ grid: string; /** * Every square of the projected mandala, row-major from the north-west. 81 entries on the Paramasayika and 64 on the Manduka. */ cells: Array<{ /** * Square number, 1 to 81 on the Paramasayika and 1 to 64 on the Manduka. Squares run row-major over the printed plate, which puts 1 in the north-east, 9 in the south-east, 73 in the north-west and 81 in the south-west on the 81 pada grid. */ square: number; /** * Row of the grid, 1 at the northern edge and 9 or 8 at the southern one. */ rowFromNorth: number; /** * Column of the grid, 1 at the western edge and 9 or 8 at the eastern one. */ columnFromWest: number; /** * Identifier of the devata holding this square. Always English transliteration, safe to compare against. Present only on the 81 pada grid, since the chapter names no devata on the 64 pada division. */ devata?: string; /** * Display name of that devata. A Sanskrit proper noun: romanised with the diacritics the transliteration carries in every language, and written in Devanagari as the Sanskrit text prints it when lang is hi. Present only on the 81 pada grid. */ devataName?: string; /** * Which ring of the mandala the devata belongs to: perimeter for the outer 32, innerRing for the eight around Brahma, innerCorner for the four on the inner diagonals, center for Brahma. Present only on the 81 pada grid. */ class?: 'perimeter' | 'innerRing' | 'innerCorner' | 'center'; /** * How many squares the devata holds under the classification of 53.49 to 50: padika for one, dvipada for two, tripada for three. Absent for Brahma, which those verses leave outside the scheme, and on the 64 pada grid. */ group?: string; /** * The structural role 53.55 to 56 gives this square of the 64 pada division: brahma, halved-inner-corner, halved-outer-corner, around-brahma, dvipada or outer. Present only on the 64 pada grid, which is the only thing that chapter states about it. */ role?: 'brahma' | 'halved-inner-corner' | 'halved-outer-corner' | 'around-brahma' | 'dvipada' | 'outer'; /** * Centre of the square in plot coordinates. This point is the marmasthala of the square, the vital spot 53.57 forbids raising a pillar on. */ center: { /** * Distance east of the plot origin, in the same unit as the plot. The x axis runs east. */ x: number; /** * Distance north of the plot origin, in the same unit as the plot. The y axis runs north. */ y: number; }; /** * Whether the centre of this square falls inside the plot outline. False where an irregular plot has a corner cut away, which is how a missing quarter of the mandala shows up as data rather than as a missing row. */ withinPlot: boolean; }>; /** * The central block of the mandala. Nine squares on the Paramasayika and four on the Manduka. */ brahmasthan: { /** * The squares Brahma holds: the nine central squares on the 81 pada grid, the four on the 64 pada grid. */ squares: Array; /** * The brahmasthan as four corners in plot coordinates, so it can be drawn straight onto a plan. It is the block a house is kept clear of, and the chapter destroys the family of a house whose gate faces it. */ polygon: Array<{ /** * Distance east of the plot origin, in the same unit as the plot. The x axis runs east. */ x: number; /** * Distance north of the plot origin, in the same unit as the plot. The y axis runs north. */ y: number; }>; /** * Area of the brahmasthan in the square of the plot unit, so a report can quote how much ground it covers. */ area: number; }; /** * The vital spots of the mandala. Present on the 81 pada grid, where 53.57 and 53.64 state the rule and its size. Absent on the 64 pada grid, for which the chapter states neither. */ marma?: { /** * The centre of every square, which 53.57 calls a marmasthala and forbids raising a pillar over. */ points: Array<{ /** * Distance east of the plot origin, in the same unit as the plot. The x axis runs east. */ x: number; /** * Distance north of the plot origin, in the same unit as the plot. The y axis runs north. */ y: number; }>; /** * Area of one marma spot in the square of the plot unit. 53.64 sets it at one eighth of the area of a square, so it scales with the plot. */ areaEach: number; }; /** * The six vamsa lines of 53.63, each named in the verse by the devatas at its two ends. Present only on the 81 pada grid: the 64 pada division is told to draw its main diagonals and nothing further is stated, so a six line geometry there would be borrowed from a different text. */ vamsa?: Array<{ /** * Square the line starts at, named in 53.63 by the devata holding it. */ fromSquare: number; /** * Identifier of the devata at that end. Always English transliteration, safe to compare against. */ fromDevata: string; /** * Square the line ends at, named in 53.63 by the devata holding it. */ toSquare: number; /** * Identifier of the devata at that end. */ toDevata: string; /** * Which way the line runs across the grid, northwest-southeast or northeast-southwest. Derived from the endpoint cells rather than stored, so it cannot disagree with the geometry. */ axis: string; /** * Whether this is one of the two corner to corner diagonals. The other four run parallel to them, two cells either side. */ isMainDiagonal: boolean; /** * Start of the line in plot coordinates, at the centre of its square. */ from: { /** * Distance east of the plot origin, in the same unit as the plot. The x axis runs east. */ x: number; /** * Distance north of the plot origin, in the same unit as the plot. The y axis runs north. */ y: number; }; /** * End of the line in plot coordinates, at the centre of its square. */ to: { /** * Distance east of the plot origin, in the same unit as the plot. The x axis runs east. */ x: number; /** * Distance north of the plot origin, in the same unit as the plot. The y axis runs north. */ y: number; }; }>; /** * The nine squares where the six vamsa lines cross. 53.63 asserts nine points and lists none, so these are computed by intersecting the lines rather than transcribed. They are the centre, the four corners of the Brahma block and the four cardinal squares of the second ring. Present only on the 81 pada grid. */ atimarma?: Array; /** * Every verse this projection rests on: the grid and its devatas, the 64 pada structure where that grid was asked for, and the marma and vamsa geometry where it applies. */ sources: Array<{ /** * The primary text this verdict rests on, or the literal value convention where no verse states the rule. Always English, safe to compare against. */ text: string; /** * Chapter of the primary text. Absent on a convention, which has no chapter to cite. */ chapter?: number; /** * Verse or verse range inside the chapter. Absent on a convention. A range is written with a hyphen, as in 115-117. */ verse?: string; /** * Translator of the edition the verse was read in. Absent on a convention. */ translation?: string; /** * Publication year of that edition. Absent on a convention. */ year?: number; /** * Whether the cited edition is in the public domain. True on the 1884 Brihat Samhita edition, whose verses are quoted. False on the 1933 Manasara edition behind the Ayadi formulas, from which only the multipliers, divisors and names are taken, never a sentence. */ publicDomain?: boolean; /** * Why a convention rule says what it says. Present only when text is convention, and it names the tradition the rule comes from rather than a verse. */ basis?: string; }>; /** * The switches this projection resolved, echoed so a stored response can be reproduced later. */ conventions: { /** * Which division of the ground was projected. Echoes the resolved value whether it was sent or defaulted. */ grid: string; /** * Unit every distance and area in the response is measured in, areas in its square. Echoes the resolved value whether it was sent or defaulted. */ unit: 'feet' | 'metres'; }; }; }; export type GenerateMandalaResponse = GenerateMandalaResponses[keyof GenerateMandalaResponses]; export type CalculatePlotAnalysisData = { /** * The site to read: the ground, which way the front looks, and whichever of the slope, road, extensions, cuts and water you know. Send facing or facingDegrees, never both, and the same for the two plot forms. */ body?: { /** * The ground the mandala is projected over. Send width and depth for a compass-aligned rectangle, or polygon for anything else. The x axis runs east and the y axis north, and the mandala is aligned to the compass rather than to the building. */ plot: { /** * East-west extent of a rectangular plot, in the unit given. Send this with depth for a rectangle, or send polygon instead. */ width?: number; /** * North-south extent of a rectangular plot, in the unit given. Send this with width for a rectangle, or send polygon instead. */ depth?: number; /** * The plot outline as 3 to 16 vertices in plot coordinates, x east and y north, in either winding order. Use this instead of width and depth for a plot with a cut corner, an extension or an irregular boundary. */ polygon?: Array<{ /** * Distance east of the plot origin, in the same unit as the plot. The x axis runs east. */ x: number; /** * Distance north of the plot origin, in the same unit as the plot. The y axis runs north. */ y: number; }>; /** * Unit the plot dimensions are given in. Every distance the response returns is in this same unit. The mandala projection is scale free, so this affects the areas and the marma size and nothing else. */ unit?: 'feet' | 'metres'; }; /** * Direction the front of the house looks out toward, one of the eight compass sectors. Case and punctuation are folded, so north-east, northeast and NorthEast all resolve. Send this or facingDegrees, never both. */ facing?: 'North' | 'Northeast' | 'East' | 'Southeast' | 'South' | 'Southwest' | 'West' | 'Northwest'; /** * Direction the front of the house looks out toward, as a compass bearing in degrees clockwise from true north, measured looking OUT from the building. The same convention the feng shui facing endpoints use, so a bearing works unchanged across the two domains. Send this or facing, never both. */ facingDegrees?: number; /** * Which quarter of the plot the ground falls toward, that is where the LOW point is. The chapter states its rules in terms of the side that stands HIGHER, so the opposite of this value is what the verses are read against, and both are returned. Omit it if the ground is level. */ slopeLowDirection?: 'North' | 'Northeast' | 'East' | 'Southeast' | 'South' | 'Southwest' | 'West' | 'Northwest'; /** * Which side a road runs along. The verdict is convention: the chapter states no rule for the side a road is on, only that an obstruction facing the gate brings misery unless it lies beyond twice the height of the house. */ road?: 'North' | 'Northeast' | 'East' | 'Southeast' | 'South' | 'Southwest' | 'West' | 'Northwest'; /** * Quarters where the plot bulges out beyond a rectangle. Every extension verdict is convention: the chapter states no rule for a named corner and the nearest verses speak of a figure with a limb wanting. */ extensions?: Array<'North' | 'Northeast' | 'East' | 'Southeast' | 'South' | 'Southwest' | 'West' | 'Northwest'>; /** * Quarters where a corner is missing from the rectangle. Every cut verdict is convention, for the same reason as the extensions. */ cuts?: Array<'North' | 'Northeast' | 'East' | 'Southeast' | 'South' | 'Southwest' | 'West' | 'Northwest'>; /** * Which quarter holds standing water, a well, a tank or a sump. This one IS sourced: 53.119 gives a distinct effect for each of the eight directions and calls only the north and the north-east favourable. */ water?: 'North' | 'Northeast' | 'East' | 'Southeast' | 'South' | 'Southwest' | 'West' | 'Northwest'; /** * Which reading of the ground level to lead with. brihat-samhita applies verses 115 to 117 as written, where a higher north-east is a loss, a higher east or north is permitted when level ground is unavoidable and still carries its stated cost, and a higher south or west carries its cost with no allowance. modern applies the widely taught rule that the north-east must be the lowest point, which agrees with verse 115 and contradicts the verse 116 allowance. Both readings are returned whichever you choose, so the disagreement is visible rather than hidden. Defaults to brihat-samhita. */ slopeSchool?: 'brihat-samhita' | 'modern'; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/vastu/plot'; }; export type CalculatePlotAnalysisErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type CalculatePlotAnalysisError = CalculatePlotAnalysisErrors[keyof CalculatePlotAnalysisErrors]; export type CalculatePlotAnalysisResponses = { /** * Shape, proportion, ground level under both schools, corners, road and water verdicts */ 200: { /** * Which way the building looks and which way it sits. Resolved through the same 24 mountain table the feng shui facing endpoints use, so a bearing lands in the same sector on both domains. */ orientation: { /** * Compass sector, one of North, Northeast, East, Southeast, South, Southwest, West, Northwest. Always English, whatever the lang parameter says, so it stays safe to compare against and against the same value on the feng shui and I Ching endpoints. */ facing: string; /** * The sector directly opposite the facing, which is the back of the building. Always English. */ sitting: string; /** * The bearing you sent, echoed. Absent when you named a sector instead of a bearing. */ facingDegrees?: number; /** * The 15 degree mountain the bearing fell in, in the compass label form the feng shui endpoints use. Absent when you named a sector instead of a bearing, since a sector spans three mountains. */ mountain?: string; }; /** * What the outline measures, in the unit you sent. */ dimensions: { /** * North-south extent of the plot, in the unit you sent. */ length: number; /** * East-west extent of the plot, in the unit you sent. */ breadth: number; /** * Area enclosed by the outline, in the square of your unit. Computed from the polygon, so a cut corner reduces it. */ area: number; /** * Length divided by breadth. The chapter has exactly one rank-independent ratio rule, twice the breadth for a house with an inner hall, and no band at all for anything else. */ ratio: number; }; /** * Whether the ground is a regular four sided figure, per 53.115, which gives the death of kinsmen for an irregular shape and barrenness for irregular sides. */ shape: { /** * How the reading lands. Always English, safe to compare against and to key styling on. */ verdict: string; /** * What the verdict means, as original prose. Translated in place when lang is set to a language other than English. */ effect: string; /** * Where a verdict comes from: a chapter and verse of a named public-domain edition, or the literal convention with the practice it rests on. Every verdict in this domain carries one. */ source: { /** * The primary text this verdict rests on, or the literal value convention where no verse states the rule. Always English, safe to compare against. */ text: string; /** * Chapter of the primary text. Absent on a convention, which has no chapter to cite. */ chapter?: number; /** * Verse or verse range inside the chapter. Absent on a convention. A range is written with a hyphen, as in 115-117. */ verse?: string; /** * Translator of the edition the verse was read in. Absent on a convention. */ translation?: string; /** * Publication year of that edition. Absent on a convention. */ year?: number; /** * Whether the cited edition is in the public domain. True on the 1884 Brihat Samhita edition, whose verses are quoted. False on the 1933 Manasara edition behind the Ayadi formulas, from which only the multipliers, divisors and names are taken, never a sentence. */ publicDomain?: boolean; /** * Why a convention rule says what it says. Present only when text is convention, and it names the tradition the rule comes from rather than a verse. */ basis?: string; }; }; /** * How the proportion reads. The one sourced verdict is the doubled length of 53.11; everything else is a modern band and is labelled convention, because no rank-independent ratio rule exists in the chapter at all. */ ratio: { /** * How the reading lands. Always English, safe to compare against and to key styling on. */ verdict: string; /** * What the verdict means, as original prose. Translated in place when lang is set to a language other than English. */ effect: string; /** * Where a verdict comes from: a chapter and verse of a named public-domain edition, or the literal convention with the practice it rests on. Every verdict in this domain carries one. */ source: { /** * The primary text this verdict rests on, or the literal value convention where no verse states the rule. Always English, safe to compare against. */ text: string; /** * Chapter of the primary text. Absent on a convention, which has no chapter to cite. */ chapter?: number; /** * Verse or verse range inside the chapter. Absent on a convention. A range is written with a hyphen, as in 115-117. */ verse?: string; /** * Translator of the edition the verse was read in. Absent on a convention. */ translation?: string; /** * Publication year of that edition. Absent on a convention. */ year?: number; /** * Whether the cited edition is in the public domain. True on the 1884 Brihat Samhita edition, whose verses are quoted. False on the 1933 Manasara edition behind the Ayadi formulas, from which only the multipliers, divisors and names are taken, never a sentence. */ publicDomain?: boolean; /** * Why a convention rule says what it says. Present only when text is convention, and it names the tradition the rule comes from rather than a verse. */ basis?: string; }; }; /** * The ground level under both schools. Absent when you sent no low direction, which is how you say the ground is level. */ slope?: { /** * The quarter you said the ground falls toward, echoed. */ lowDirection: string; /** * The quarter that therefore stands higher, which is what the verses are stated in terms of. */ highDirection: string; /** * The ground level as a sentence, for a report. Translated in place when lang is set. */ reading: string; /** * Both readings, always, whichever school you asked for. The two genuinely disagree where a slight rise on the east or the north is unavoidable: the chapter allows it and the modern rule does not, and publishing both is what lets a practitioner reconcile our verdict with their teacher. */ schools: Array<{ /** * Which reading this verdict follows. Always English, safe to compare against. */ school: string; /** * How that reading lands: auspicious, permitted where a slight rise is expressly allowed, inauspicious, or not-stated where the chapter gives no effect for a rise in that quarter. Always English. */ verdict: string; /** * The verse the reading rests on. Empty on the modern school, which rests on teaching practice rather than on a verse. */ verse: string; /** * What that reading says follows, as original prose. Translated in place when lang is set. */ effect: string; }>; /** * Which of the two readings you asked to lead with, echoed. */ chosen: string; }; /** * What the chapter says about standing water in the quarter you named. Only the north and the north-east are favourable, and each of the other six carries its own harm. Absent when you named no water. */ water?: { /** * Compass sector, one of North, Northeast, East, Southeast, South, Southwest, West, Northwest. Always English, whatever the lang parameter says, so it stays safe to compare against and against the same value on the feng shui and I Ching endpoints. */ direction: string; /** * What 53.119 gives for standing water in that quarter, as original prose. Translated in place when lang is set. */ effect: string; /** * How the stated effect reads: auspicious for a gain, inauspicious for a harm, mixed where the text names a gain and a loss together. A RoxyAPI classification of the verse effect rather than a word in the text, and always English so it is safe to key styling on. */ auspiciousness: string; /** * Where a verdict comes from: a chapter and verse of a named public-domain edition, or the literal convention with the practice it rests on. Every verdict in this domain carries one. */ source: { /** * The primary text this verdict rests on, or the literal value convention where no verse states the rule. Always English, safe to compare against. */ text: string; /** * Chapter of the primary text. Absent on a convention, which has no chapter to cite. */ chapter?: number; /** * Verse or verse range inside the chapter. Absent on a convention. A range is written with a hyphen, as in 115-117. */ verse?: string; /** * Translator of the edition the verse was read in. Absent on a convention. */ translation?: string; /** * Publication year of that edition. Absent on a convention. */ year?: number; /** * Whether the cited edition is in the public domain. True on the 1884 Brihat Samhita edition, whose verses are quoted. False on the 1933 Manasara edition behind the Ayadi formulas, from which only the multipliers, divisors and names are taken, never a sentence. */ publicDomain?: boolean; /** * Why a convention rule says what it says. Present only when text is convention, and it names the tradition the rule comes from rather than a verse. */ basis?: string; }; }; /** * A verdict per extended quarter, every one of them convention. Empty when you named none. */ extensions: Array<{ /** * Compass sector, one of North, Northeast, East, Southeast, South, Southwest, West, Northwest. Always English, whatever the lang parameter says, so it stays safe to compare against and against the same value on the feng shui and I Ching endpoints. */ direction: string; /** * How the stated effect reads: auspicious for a gain, inauspicious for a harm, mixed where the text names a gain and a loss together. A RoxyAPI classification of the verse effect rather than a word in the text, and always English so it is safe to key styling on. */ auspiciousness: string; /** * What the reading says, as original prose that names its own basis. */ effect: string; /** * Where a verdict comes from: a chapter and verse of a named public-domain edition, or the literal convention with the practice it rests on. Every verdict in this domain carries one. */ source: { /** * The primary text this verdict rests on, or the literal value convention where no verse states the rule. Always English, safe to compare against. */ text: string; /** * Chapter of the primary text. Absent on a convention, which has no chapter to cite. */ chapter?: number; /** * Verse or verse range inside the chapter. Absent on a convention. A range is written with a hyphen, as in 115-117. */ verse?: string; /** * Translator of the edition the verse was read in. Absent on a convention. */ translation?: string; /** * Publication year of that edition. Absent on a convention. */ year?: number; /** * Whether the cited edition is in the public domain. True on the 1884 Brihat Samhita edition, whose verses are quoted. False on the 1933 Manasara edition behind the Ayadi formulas, from which only the multipliers, divisors and names are taken, never a sentence. */ publicDomain?: boolean; /** * Why a convention rule says what it says. Present only when text is convention, and it names the tradition the rule comes from rather than a verse. */ basis?: string; }; }>; /** * A verdict per cut quarter, every one of them convention. */ cuts: Array<{ /** * Compass sector, one of North, Northeast, East, Southeast, South, Southwest, West, Northwest. Always English, whatever the lang parameter says, so it stays safe to compare against and against the same value on the feng shui and I Ching endpoints. */ direction: string; /** * How the stated effect reads: auspicious for a gain, inauspicious for a harm, mixed where the text names a gain and a loss together. A RoxyAPI classification of the verse effect rather than a word in the text, and always English so it is safe to key styling on. */ auspiciousness: string; /** * What the reading says, as original prose that names its own basis. */ effect: string; /** * Where a verdict comes from: a chapter and verse of a named public-domain edition, or the literal convention with the practice it rests on. Every verdict in this domain carries one. */ source: { /** * The primary text this verdict rests on, or the literal value convention where no verse states the rule. Always English, safe to compare against. */ text: string; /** * Chapter of the primary text. Absent on a convention, which has no chapter to cite. */ chapter?: number; /** * Verse or verse range inside the chapter. Absent on a convention. A range is written with a hyphen, as in 115-117. */ verse?: string; /** * Translator of the edition the verse was read in. Absent on a convention. */ translation?: string; /** * Publication year of that edition. Absent on a convention. */ year?: number; /** * Whether the cited edition is in the public domain. True on the 1884 Brihat Samhita edition, whose verses are quoted. False on the 1933 Manasara edition behind the Ayadi formulas, from which only the multipliers, divisors and names are taken, never a sentence. */ publicDomain?: boolean; /** * Why a convention rule says what it says. Present only when text is convention, and it names the tradition the rule comes from rather than a verse. */ basis?: string; }; }>; /** * The convention verdict on the side a road runs, with the sourced obstruction rule quoted in the sources list beside it. Absent when you named no road. */ road?: { /** * Compass sector, one of North, Northeast, East, Southeast, South, Southwest, West, Northwest. Always English, whatever the lang parameter says, so it stays safe to compare against and against the same value on the feng shui and I Ching endpoints. */ direction: string; /** * How the stated effect reads: auspicious for a gain, inauspicious for a harm, mixed where the text names a gain and a loss together. A RoxyAPI classification of the verse effect rather than a word in the text, and always English so it is safe to key styling on. */ auspiciousness: string; /** * What the reading says, as original prose that names its own basis. */ effect: string; /** * Where a verdict comes from: a chapter and verse of a named public-domain edition, or the literal convention with the practice it rests on. Every verdict in this domain carries one. */ source: { /** * The primary text this verdict rests on, or the literal value convention where no verse states the rule. Always English, safe to compare against. */ text: string; /** * Chapter of the primary text. Absent on a convention, which has no chapter to cite. */ chapter?: number; /** * Verse or verse range inside the chapter. Absent on a convention. A range is written with a hyphen, as in 115-117. */ verse?: string; /** * Translator of the edition the verse was read in. Absent on a convention. */ translation?: string; /** * Publication year of that edition. Absent on a convention. */ year?: number; /** * Whether the cited edition is in the public domain. True on the 1884 Brihat Samhita edition, whose verses are quoted. False on the 1933 Manasara edition behind the Ayadi formulas, from which only the multipliers, divisors and names are taken, never a sentence. */ publicDomain?: boolean; /** * Why a convention rule says what it says. Present only when text is convention, and it names the tradition the rule comes from rather than a verse. */ basis?: string; }; }; /** * Every verse and every convention this analysis rests on, so a report can print the citation beside each verdict. */ sources: Array<{ /** * The primary text this verdict rests on, or the literal value convention where no verse states the rule. Always English, safe to compare against. */ text: string; /** * Chapter of the primary text. Absent on a convention, which has no chapter to cite. */ chapter?: number; /** * Verse or verse range inside the chapter. Absent on a convention. A range is written with a hyphen, as in 115-117. */ verse?: string; /** * Translator of the edition the verse was read in. Absent on a convention. */ translation?: string; /** * Publication year of that edition. Absent on a convention. */ year?: number; /** * Whether the cited edition is in the public domain. True on the 1884 Brihat Samhita edition, whose verses are quoted. False on the 1933 Manasara edition behind the Ayadi formulas, from which only the multipliers, divisors and names are taken, never a sentence. */ publicDomain?: boolean; /** * Why a convention rule says what it says. Present only when text is convention, and it names the tradition the rule comes from rather than a verse. */ basis?: string; }>; /** * The switches this analysis resolved, echoed so it can be reproduced later. */ conventions: { /** * Which ground level reading was asked to lead. Echoes the resolved value whether it was sent or defaulted. */ slopeSchool: string; }; }; }; export type CalculatePlotAnalysisResponse = CalculatePlotAnalysisResponses[keyof CalculatePlotAnalysisResponses]; export type CalculateAyadiData = { body?: { /** * Length of the building or room, in the unit given. Under the Manasara family this is the measure the aya and rksha formulas multiply; under the perimeter family it only feeds the perimeter. */ length: number; /** * Breadth of the building or room, in the unit given. Under the Manasara family this is the measure the vyaya and yoni formulas multiply. */ breadth: number; /** * Perimeter of the plan, if it is not simply twice the length plus twice the breadth. The perimeter family runs every formula on this one measure, so it is the number that decides all six remainders there. */ perimeter?: number; /** * Circumference or height, if the Manasara vara and tithi formulas should read something other than the perimeter. Defaults to the perimeter, which is what a rectangular plan supplies. */ circumference?: number; /** * Unit the Ayadi dimensions are given in. Every remainder is unit sensitive, so this is an input and never assumed: the same building measured in cubits and in feet gives different remainders. hasta is the classical cubit and needs no conversion; feet and metres are converted using hastaInches and rounded to whole cubits, and the rounded figures are returned. Defaults to hasta. */ unit?: 'hasta' | 'feet' | 'metres'; /** * Length of one hasta, the classical cubit, in inches. Defaults to 18, which is 24 angula at three quarters of an inch each and is the value three independent sources agree on. Raise it if your lineage measures the cubit differently; the value used is echoed on the response so a stored reading can be reproduced years later. Only used when unit is feet or metres. */ hastaInches?: number; /** * Which family of Ayadi formulas to apply. manasara takes length, breadth and circumference separately and is double sourced. perimeter-texts runs every formula on the perimeter alone and is the family the usual worked example is printed for. utpala supplies a yoni formula from the length times the breadth and nothing else, so the other five vargas fall back to the perimeter family and the response says so. Defaults to manasara. */ ayadiText?: 'manasara' | 'perimeter-texts' | 'utpala'; /** * Which vyaya formula the perimeter family uses. The printed table gives two joined by the word or and states no rule for choosing. p9-10 multiplies by nine and divides by ten, which is the only divisor consistent with the ten member vyaya group, so its remainder can be placed in that group and it is the default. p3-14 multiplies by three and divides by fourteen, and its remainder maps to no group any source enumerates. Ignored when ayadiText is manasara, which has one vyaya formula. */ vyayaFormula?: 'p9-10' | 'p3-14'; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/vastu/ayadi'; }; export type CalculateAyadiErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type CalculateAyadiError = CalculateAyadiErrors[keyof CalculateAyadiErrors]; export type CalculateAyadiResponses = { /** * The six vargas with their arithmetic, the vayas quotient and the verdict */ 200: { /** * What was actually divided, in whole cubits. Every remainder is unit sensitive and the formulas are integer arithmetic, so a measure sent in feet or metres is converted and rounded and the rounded figure is published here rather than left for you to infer. */ measures: { /** * Length in whole hasta, after conversion and rounding. */ length: number; /** * Breadth in whole hasta, after conversion and rounding. */ breadth: number; /** * Perimeter in whole hasta, either as you sent it or as twice length plus twice breadth. */ perimeter: number; /** * Circumference in whole hasta, defaulting to the perimeter. */ circumference: number; /** * Length times breadth in whole hasta squared, which is the measure the Utpala yoni formula reads. */ area: number; }; /** * The six proportional formulas, each with its measure, multiplier, divisor, remainder and the member that remainder names. */ vargas: Array<{ /** * Which of the six proportional formulas this row is: aya, vyaya, yoni, rksha, tithi or vara. Always English, safe to compare against. */ varga: string; /** * Which measure the formula multiplied: length, breadth, circumference, perimeter or area. This is where the three text families differ most, since the Manasara reads three measures separately and the perimeter family reads one. */ operand: string; /** * The measure in whole hasta, after any conversion and rounding. This is the number actually multiplied, so a surprising remainder can be traced to it. */ operandValue: number; /** * What the measure was multiplied by, per the formula of the chosen text family. */ multiplier: number; /** * What the product was divided by, which is also the size of the group named. */ divisor: number; /** * The measure times the multiplier, shown so the arithmetic can be checked by hand. */ product: number; /** * What the division left. This is the Ayadi result: the remainder, not the quotient, names the member of the group. */ remainder: number; /** * How many members the group has. Aya is a group of twelve and vyaya a group of ten, which is stated in the text even though the names are not. */ groupSize: number; /** * The member the remainder names. Present for the four groups whose names are sourced: the eight yonis, the 27 nakshatras, the 30 tithis and the seven varas. Absent for aya and vyaya, whose names beyond the first are printed in no public-domain source and are never invented here. */ name?: string; /** * The first member of the group, for the two groups where that is all any source gives. Present on aya and on vyaya, and on nothing else. */ firstName?: string; /** * What the yoni name means in plain words. Present on the yoni row only, and translated in place when lang is set. */ gloss?: string; /** * Whether this remainder is favourable under the rule the text states for that group: the odd yonis, the odd nakshatras, and four of the seven varas. Absent where no source states a rule for the group. */ auspicious?: boolean; /** * Where a verdict comes from: a chapter and verse of a named public-domain edition, or the literal convention with the practice it rests on. Every verdict in this domain carries one. */ source: { /** * The primary text this verdict rests on, or the literal value convention where no verse states the rule. Always English, safe to compare against. */ text: string; /** * Chapter of the primary text. Absent on a convention, which has no chapter to cite. */ chapter?: number; /** * Verse or verse range inside the chapter. Absent on a convention. A range is written with a hyphen, as in 115-117. */ verse?: string; /** * Translator of the edition the verse was read in. Absent on a convention. */ translation?: string; /** * Publication year of that edition. Absent on a convention. */ year?: number; /** * Whether the cited edition is in the public domain. True on the 1884 Brihat Samhita edition, whose verses are quoted. False on the 1933 Manasara edition behind the Ayadi formulas, from which only the multipliers, divisors and names are taken, never a sentence. */ publicDomain?: boolean; /** * Why a convention rule says what it says. Present only when text is convention, and it names the tradition the rule comes from rather than a verse. */ basis?: string; }; }>; /** * The seventh formula of the perimeter family, which takes the QUOTIENT of the perimeter times eight over twenty seven where rksha takes the remainder. An age or span rather than a member of a named group, and not part of the Manasara six. */ vayas: number; /** * The two verdict rules the texts actually state: the yoni must be one of the four favourable members, and the aya remainder should exceed the vyaya remainder. */ verdict: { /** * Whether the yoni is one of the four favourable members. A remainder of zero is a reject rather than the eighth name, because a zero remainder would face the building north-east and the reference rule says the proportions must be altered instead. */ yoniAuspicious: boolean; /** * How the aya compares with the vyaya: aya-greater is conducive to prosperity, equal carries no defect, aya-lesser is defective, and zero-remainder means one of the two divided exactly, which the text calls auspicious in its own right. Always English, safe to compare against. */ ayaVyaya: string; /** * The verdict as a sentence, for a report. Composed from the yoni and the aya against vyaya rule, and translated in place when lang is set. */ reading: string; /** * Where a verdict comes from: a chapter and verse of a named public-domain edition, or the literal convention with the practice it rests on. Every verdict in this domain carries one. */ source: { /** * The primary text this verdict rests on, or the literal value convention where no verse states the rule. Always English, safe to compare against. */ text: string; /** * Chapter of the primary text. Absent on a convention, which has no chapter to cite. */ chapter?: number; /** * Verse or verse range inside the chapter. Absent on a convention. A range is written with a hyphen, as in 115-117. */ verse?: string; /** * Translator of the edition the verse was read in. Absent on a convention. */ translation?: string; /** * Publication year of that edition. Absent on a convention. */ year?: number; /** * Whether the cited edition is in the public domain. True on the 1884 Brihat Samhita edition, whose verses are quoted. False on the 1933 Manasara edition behind the Ayadi formulas, from which only the multipliers, divisors and names are taken, never a sentence. */ publicDomain?: boolean; /** * Why a convention rule says what it says. Present only when text is convention, and it names the tradition the rule comes from rather than a verse. */ basis?: string; }; }; /** * The switches this calculation resolved, echoed so it can be reproduced years later without knowing what the defaults were on the day it was made. */ conventions: { /** * Which family of formulas was applied. Echoes the resolved value. */ ayadiText: string; /** * Which of the two perimeter vyaya formulas was applied. Echoed even under the Manasara family, which has one vyaya formula and ignores it, so a stored response always says what was resolved. */ vyayaFormula: string; /** * Which unit the dimensions arrived in. Echoes the resolved value. */ unit: string; /** * How long one hasta was taken to be, in inches. Echoed because the remainders are unit sensitive and a stored reading cannot be reproduced without it. */ hastaInches: number; }; }; }; export type CalculateAyadiResponse = CalculateAyadiResponses[keyof CalculateAyadiResponses]; export type CalculateRoomComplianceData = { /** * The floor plan to check. Send facing or facingDegrees, never both, and give each room either its quarter or its outline, never both. */ body?: { /** * The ground the mandala is projected over. Send width and depth for a compass-aligned rectangle, or polygon for anything else. The x axis runs east and the y axis north, and the mandala is aligned to the compass rather than to the building. */ plot: { /** * East-west extent of a rectangular plot, in the unit given. Send this with depth for a rectangle, or send polygon instead. */ width?: number; /** * North-south extent of a rectangular plot, in the unit given. Send this with width for a rectangle, or send polygon instead. */ depth?: number; /** * The plot outline as 3 to 16 vertices in plot coordinates, x east and y north, in either winding order. Use this instead of width and depth for a plot with a cut corner, an extension or an irregular boundary. */ polygon?: Array<{ /** * Distance east of the plot origin, in the same unit as the plot. The x axis runs east. */ x: number; /** * Distance north of the plot origin, in the same unit as the plot. The y axis runs north. */ y: number; }>; /** * Unit the plot dimensions are given in. Every distance the response returns is in this same unit. The mandala projection is scale free, so this affects the areas and the marma size and nothing else. */ unit?: 'feet' | 'metres'; }; /** * Direction the front of the house looks out toward, one of the eight compass sectors. Case and punctuation are folded, so north-east, northeast and NorthEast all resolve. Send this or facingDegrees, never both. */ facing?: 'North' | 'Northeast' | 'East' | 'Southeast' | 'South' | 'Southwest' | 'West' | 'Northwest'; /** * Direction the front of the house looks out toward, as a compass bearing in degrees clockwise from true north, measured looking OUT from the building. The same convention the feng shui facing endpoints use, so a bearing works unchanged across the two domains. Send this or facing, never both. */ facingDegrees?: number; /** * The rooms to check, 1 to 24 of them. Each carries a type and either the quarter it sits in or its outline. */ rooms: Array<{ /** * What the room is, one of puja, kitchen, master-bedroom, bedroom, living, dining, study, toilet, store, staircase, water-storage, entrance. Case and punctuation are folded, so Master Bedroom and master_bedroom both resolve. Four of the twelve carry a verse and the rest carry convention, and the response says which. */ type: 'puja' | 'kitchen' | 'master-bedroom' | 'bedroom' | 'living' | 'dining' | 'study' | 'toilet' | 'store' | 'staircase' | 'water-storage' | 'entrance'; /** * Which quarter of the plot the room sits in, if you already know it. Send this or polygon, never both. */ direction?: 'North' | 'Northeast' | 'East' | 'Southeast' | 'South' | 'Southwest' | 'West' | 'Northwest'; /** * The room outline in plot coordinates, 3 to 16 vertices. The quarter is read from the area centroid against thirds of the plot, so an L-shaped room lands where its mass is rather than where its corners are. Send this or direction, never both. */ polygon?: Array<{ /** * Distance east of the plot origin, in the same unit as the plot. The x axis runs east. */ x: number; /** * Distance north of the plot origin, in the same unit as the plot. The y axis runs north. */ y: number; }>; }>; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/vastu/rooms'; }; export type CalculateRoomComplianceErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type CalculateRoomComplianceError = CalculateRoomComplianceErrors[keyof CalculateRoomComplianceErrors]; export type CalculateRoomComplianceResponses = { /** * A verdict per room, the composite score and the weights behind it */ 200: { /** * One reading per room sent, in the order you sent them. */ rooms: Array<{ /** * The room type, echoed in its canonical spelling. Always English, safe to compare against. */ type: string; /** * Which of the nine zones the room occupies: one of the eight compass sectors, or Center for the middle ninth, which is the brahmasthan. Always English. */ zone: string; /** * How the placement reads: ideal where the room sits where its rule puts it, avoid where it sits where the rule warns against, acceptable for everything between. Always English, safe to key styling on. */ verdict: string; /** * The quarters this room type belongs in under its rule. */ idealDirections: Array; /** * The quarters this room type should be kept out of under its rule. */ avoidDirections: Array; /** * The placement as a sentence, for a report. Translated in place when lang is set to a language other than English. */ reading: string; /** * What to do when the room is not where it belongs. Present when the verdict is acceptable or avoid, and absent on an ideal placement, which has nothing to fix. Original prose, translated in place when lang is set. */ remedy?: string; /** * Where a verdict comes from: a chapter and verse of a named public-domain edition, or the literal convention with the practice it rests on. Every verdict in this domain carries one. */ source: { /** * The primary text this verdict rests on, or the literal value convention where no verse states the rule. Always English, safe to compare against. */ text: string; /** * Chapter of the primary text. Absent on a convention, which has no chapter to cite. */ chapter?: number; /** * Verse or verse range inside the chapter. Absent on a convention. A range is written with a hyphen, as in 115-117. */ verse?: string; /** * Translator of the edition the verse was read in. Absent on a convention. */ translation?: string; /** * Publication year of that edition. Absent on a convention. */ year?: number; /** * Whether the cited edition is in the public domain. True on the 1884 Brihat Samhita edition, whose verses are quoted. False on the 1933 Manasara edition behind the Ayadi formulas, from which only the multipliers, divisors and names are taken, never a sentence. */ publicDomain?: boolean; /** * Why a convention rule says what it says. Present only when text is convention, and it names the tradition the rule comes from rather than a verse. */ basis?: string; }; }>; /** * A RoxyAPI composite from 0 to 100 over the rooms you sent, not a classical quantity and not a number any verse gives. A rule carrying a verse weighs twice one carrying convention; an ideal placement scores full, an acceptable one half and a placement to avoid nothing. The weights are published in the scoring field so you can recompute it or ignore it. */ score: number; /** * The weights behind the composite, published rather than hidden so the number is auditable. */ scoring: { /** * The weight a rule carrying a chapter and verse contributes. */ sourcedWeight: number; /** * The weight a rule carrying convention contributes. */ conventionWeight: number; /** * The points an ideal placement earns, out of one. */ idealPoints: number; /** * The points an acceptable placement earns, out of one. */ neutralPoints: number; /** * The points a placement to avoid earns, out of one. */ avoidPoints: number; }; /** * Which way the building faces, echoed. It does not move the zones: the mandala is aligned to the compass rather than to the building, so a room in the south-east is in the south-east whichever way the front door looks. */ facing: string; /** * Every rule this report rests on, so a printed report can carry the citation beside each room. */ sources: Array<{ /** * The primary text this verdict rests on, or the literal value convention where no verse states the rule. Always English, safe to compare against. */ text: string; /** * Chapter of the primary text. Absent on a convention, which has no chapter to cite. */ chapter?: number; /** * Verse or verse range inside the chapter. Absent on a convention. A range is written with a hyphen, as in 115-117. */ verse?: string; /** * Translator of the edition the verse was read in. Absent on a convention. */ translation?: string; /** * Publication year of that edition. Absent on a convention. */ year?: number; /** * Whether the cited edition is in the public domain. True on the 1884 Brihat Samhita edition, whose verses are quoted. False on the 1933 Manasara edition behind the Ayadi formulas, from which only the multipliers, divisors and names are taken, never a sentence. */ publicDomain?: boolean; /** * Why a convention rule says what it says. Present only when text is convention, and it names the tradition the rule comes from rather than a verse. */ basis?: string; }>; }; }; export type CalculateRoomComplianceResponse = CalculateRoomComplianceResponses[keyof CalculateRoomComplianceResponses]; export type FindGrihaPraveshDatesData = { body?: { /** * First day of the search window, in YYYY-MM-DD. Every limb is read at sunrise of the local day, because the Hindu day begins at sunrise rather than at midnight. */ startDate: string; /** * Last day of the search window, in YYYY-MM-DD, inclusive. The window is capped at 93 days, which is a full season and the same cap the Vedic auspicious day search carries. */ endDate: string; /** * Latitude of the house, in decimal degrees, positive north. Sunrise decides where one day ends and the next begins, so a nakshatra running out during the morning changes which day it counts for. */ latitude: number; /** * Longitude of the house, in decimal degrees, positive east. */ longitude: number; /** * IANA name (e.g. "America/New_York", "Europe/London", "UTC"), decimal hours (e.g. -5 for EST, 1 for CET), or a fixed UTC offset (e.g. "-05:00", "+01:00"). Prefer the IANA name: it is resolved to the offset in force at the birth date and time, historical daylight-saving rules included, while a fixed offset or decimal is taken literally and will be wrong if it does not match the daylight-saving state at that moment. On a transition day a time in the repeated hour is read as its first occurrence and a time in the skipped hour is moved forward past the gap. Invalid timezones return 400 with a validation error. */ timezone: number | string; /** * Which Muhurta text supplies the admissible nakshatras for entering a new house. muhurta-chintamani admits eight and kalaprakasika admits twelve; seven overlap and are the high confidence core, one is unique to the first and five to the second. The two texts are independent witnesses, which is what makes the overlap strong and the difference worth exposing. Defaults to muhurta-chintamani. */ muhurtaText?: 'muhurta-chintamani' | 'kalaprakasika'; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/vastu/timing/griha-pravesh'; }; export type FindGrihaPraveshDatesErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type FindGrihaPraveshDatesError = FindGrihaPraveshDatesErrors[keyof FindGrihaPraveshDatesErrors]; export type FindGrihaPraveshDatesResponses = { /** * Every admitted day with its panchang limbs, plus the rules and the rejections */ 200: { /** * The days in the window that clear every day-level rule, in date order. Only admitted days are listed; the rules that rejected the rest are tallied in rejectionsByRule. */ days: Array<{ /** * The admitted day, in YYYY-MM-DD. */ date: string; /** * Sunrise at the coordinates you sent, as a UTC instant. This is the moment every limb below was read at. Absent inside a polar night, where the Sun does not rise and the day was read from local midnight instead. */ sunrise?: string; /** * The nakshatra the Moon stood in at sunrise, which is the strongest of the rules. */ nakshatra: { /** * Nakshatra number 1 to 27, counting from Ashwini. Abhijit is not among them. */ number: number; /** * Identifier of the nakshatra, lower case with hyphens. Always English transliteration, safe to compare against and against the same value on the panchang endpoints. */ id: string; /** * Display name of the nakshatra, as the panchang endpoints spell it. */ name: string; }; /** * The tithi running at sunrise. */ tithi: { /** * Tithi number 1 to 30 across the lunar month, 1 to 15 bright then 16 to 30 dark. */ number: number; /** * Display name of the tithi, as the panchang endpoints spell it. */ name: string; /** * Which half of the lunar month: Shukla for the bright half and Krishna for the dark. Always English, safe to compare against. */ paksha: string; }; /** * The weekday, which begins at sunrise in this reckoning. */ vara: { /** * Weekday number, 0 for Sunday through 6 for Saturday. */ number: number; /** * Weekday name, counted from sunrise rather than from midnight. */ name: string; }; /** * Which half of the solar year: uttarayana is the northern course and is required, dakshinayana the southern. Always English, safe to compare against. */ ayana: string; /** * Sidereal longitude of the Sun at sunrise, in degrees. Published because two of the rules are solar and a caller can check them from it. */ solarLongitude: number; /** * The karana at sunrise. Vishti, also called Bhadra, is the one that bars a day. Always English transliteration. */ karana: string; /** * preferred where the tithi is one both texts single out and the weekday is not the neutral one, admissible otherwise. Always English, safe to compare against. */ quality: string; /** * The rule ids this day satisfied, in the order they were tested. Look each one up in the rules field for what it requires and where it comes from. */ admittedBy: Array; /** * The day as a sentence, for a report or a chat answer. Translated in place when lang is set to a language other than English. */ reading: string; }>; /** * How many days were admitted. */ total: number; /** * What was searched, echoed so a stored result is self describing. */ window: { /** * First day searched, echoed. */ startDate: string; /** * Last day searched, echoed. */ endDate: string; /** * How many days the window covered, inclusive of both ends. */ daysEvaluated: number; }; /** * A tally of which rule rejected how many days, keyed on the rule id. This is what makes an empty result actionable: a window inside the southern course fails every day on one rule and you can see that at a glance. */ rejectionsByRule: { [key: string]: number; }; /** * Every rule applied, with what it requires, how well attested it is, and where it comes from. */ rules: Array<{ /** * Identifier of the rule, which is what the day rows reference. */ id: string; /** * What the rule requires, as original prose. Translated in place when lang is set. */ requirement: string; /** * How well attested the rule is: high where two independent texts agree, medium where two dependent witnesses do or one text states it twice. Always English. */ confidence: string; /** * Where a verdict comes from: a chapter and verse of a named public-domain edition, or the literal convention with the practice it rests on. Every verdict in this domain carries one. */ source: { /** * The primary text this verdict rests on, or the literal value convention where no verse states the rule. Always English, safe to compare against. */ text: string; /** * Chapter of the primary text. Absent on a convention, which has no chapter to cite. */ chapter?: number; /** * Verse or verse range inside the chapter. Absent on a convention. A range is written with a hyphen, as in 115-117. */ verse?: string; /** * Translator of the edition the verse was read in. Absent on a convention. */ translation?: string; /** * Publication year of that edition. Absent on a convention. */ year?: number; /** * Whether the cited edition is in the public domain. True on the 1884 Brihat Samhita edition, whose verses are quoted. False on the 1933 Manasara edition behind the Ayadi formulas, from which only the multipliers, divisors and names are taken, never a sentence. */ publicDomain?: boolean; /** * Why a convention rule says what it says. Present only when text is convention, and it names the tradition the rule comes from rather than a verse. */ basis?: string; }; }>; /** * The rules a date search cannot settle, published rather than dropped. They are judgements about a MOMENT and about the owner, not about a day, and a caller who believes an admitted day is finished without them would be wrong. */ leftToTheAstrologer: Array; /** * The primary citations behind the whole search, including the one house entry rule the Brihat Samhita itself states, which is in its muhurta chapter and not in the architecture chapter. */ sources: Array<{ /** * The primary text this verdict rests on, or the literal value convention where no verse states the rule. Always English, safe to compare against. */ text: string; /** * Chapter of the primary text. Absent on a convention, which has no chapter to cite. */ chapter?: number; /** * Verse or verse range inside the chapter. Absent on a convention. A range is written with a hyphen, as in 115-117. */ verse?: string; /** * Translator of the edition the verse was read in. Absent on a convention. */ translation?: string; /** * Publication year of that edition. Absent on a convention. */ year?: number; /** * Whether the cited edition is in the public domain. True on the 1884 Brihat Samhita edition, whose verses are quoted. False on the 1933 Manasara edition behind the Ayadi formulas, from which only the multipliers, divisors and names are taken, never a sentence. */ publicDomain?: boolean; /** * Why a convention rule says what it says. Present only when text is convention, and it names the tradition the rule comes from rather than a verse. */ basis?: string; }>; /** * The switches this search resolved, echoed so it can be reproduced later. */ conventions: { /** * Which Muhurta text supplied the nakshatra list. Echoes the resolved value whether it was sent or defaulted. */ muhurtaText: string; /** * The UTC offset in hours the local day was resolved with, after any IANA name was resolved to a number. */ timezone: number; }; }; }; export type FindGrihaPraveshDatesResponse = FindGrihaPraveshDatesResponses[keyof FindGrihaPraveshDatesResponses]; export type ListDikpalaDirectionsData = { body?: never; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; /** * Maximum items to return per page. Range: 1-8, default 8. */ limit?: number; /** * Number of items to skip for pagination. Default 0. */ offset?: number; }; url: '/vastu/directions'; }; export type ListDikpalaDirectionsErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type ListDikpalaDirectionsError = ListDikpalaDirectionsErrors[keyof ListDikpalaDirectionsErrors]; export type ListDikpalaDirectionsResponses = { /** * The eight directions with their dikpalas, devatas and water effects */ 200: { /** * How many directions there are in all, which is always eight. */ total: number; /** * How many were requested per page. */ limit: number; /** * How many were skipped. */ offset: number; /** * The directions on this page, in compass order from North. */ directions: Array<{ /** * Compass sector, one of North, Northeast, East, Southeast, South, Southwest, West, Northwest. Always English, whatever the lang parameter says, so it stays safe to compare against and against the same value on the feng shui and I Ching endpoints. */ id: string; /** * The lord of this quarter of the horizon, per Brihat Samhita 54.3. A Sanskrit proper noun: romanised with the diacritics the transliteration carries in every language, and written in Devanagari as the Sanskrit text prints it when lang is hi. Compare on id, never on this. These are NOT the 45 mandala devatas and the two sets must not be merged: Agni is the north-east mandala square and the south-east dikpala. */ dikpala: string; /** * Whether this is one of the four cardinal directions or one of the four intercardinal quarters. Always English. */ kind: string; /** * The element conventionally assigned to this quarter: fire, earth, air or water. Present only on the four intercardinal quarters, because the cardinal ones carry none in this scheme, and it is labelled convention because the Brihat Samhita assigns no element to any direction at all. */ element?: string; /** * The squares of the 81 pada grid this direction covers. For a cardinal direction those are its eight perimeter squares in the order the verses enumerate them; for an intercardinal quarter they are the corner square and the four single pada squares gathered around it. */ squares: Array; /** * The devatas of the squares this direction covers, in the same order as the squares list. */ devatas: Array<{ /** * Square number in the 81 pada grid. */ square: number; /** * Identifier of the devata holding it. Always English transliteration, safe to compare against and to look up on the devatas endpoint. */ id: string; /** * Display name of the devata. A Sanskrit proper noun: romanised with the diacritics the transliteration carries in every language, and written in Devanagari as the Sanskrit text prints it when lang is hi. */ name: string; }>; /** * What Brihat Samhita 53.118 puts on this side, in the chapter own terms. Present on the four intercardinal quarters, which are the only ones that verse places anything on. */ places?: string; /** * What the chapter says about standing water here, which it gives for all eight directions. */ water: { /** * What 53.119 says follows from standing water in this quarter, as original prose. */ effect: string; /** * Whether that effect is a gain or a harm. Only the north and the north-east are gains. Always English. */ auspiciousness: string; }; /** * The verses behind each part of this entry, and the convention label on the element where no verse gives one. */ sources: Array<{ /** * The primary text this verdict rests on, or the literal value convention where no verse states the rule. Always English, safe to compare against. */ text: string; /** * Chapter of the primary text. Absent on a convention, which has no chapter to cite. */ chapter?: number; /** * Verse or verse range inside the chapter. Absent on a convention. A range is written with a hyphen, as in 115-117. */ verse?: string; /** * Translator of the edition the verse was read in. Absent on a convention. */ translation?: string; /** * Publication year of that edition. Absent on a convention. */ year?: number; /** * Whether the cited edition is in the public domain. True on the 1884 Brihat Samhita edition, whose verses are quoted. False on the 1933 Manasara edition behind the Ayadi formulas, from which only the multipliers, divisors and names are taken, never a sentence. */ publicDomain?: boolean; /** * Why a convention rule says what it says. Present only when text is convention, and it names the tradition the rule comes from rather than a verse. */ basis?: string; }>; }>; }; }; export type ListDikpalaDirectionsResponse = ListDikpalaDirectionsResponses[keyof ListDikpalaDirectionsResponses]; export type GetDikpalaDirectionData = { body?: never; path: { /** * Direction id, one of North, Northeast, East, Southeast, South, Southwest, West, Northwest. Case and punctuation are folded. */ id: 'North' | 'Northeast' | 'East' | 'Southeast' | 'South' | 'Southwest' | 'West' | 'Northwest'; }; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/vastu/directions/{id}'; }; export type GetDikpalaDirectionErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetDikpalaDirectionError = GetDikpalaDirectionErrors[keyof GetDikpalaDirectionErrors]; export type GetDikpalaDirectionResponses = { /** * One direction with its dikpala, devatas and water effect */ 200: { /** * Compass sector, one of North, Northeast, East, Southeast, South, Southwest, West, Northwest. Always English, whatever the lang parameter says, so it stays safe to compare against and against the same value on the feng shui and I Ching endpoints. */ id: string; /** * The lord of this quarter of the horizon, per Brihat Samhita 54.3. A Sanskrit proper noun: romanised with the diacritics the transliteration carries in every language, and written in Devanagari as the Sanskrit text prints it when lang is hi. Compare on id, never on this. These are NOT the 45 mandala devatas and the two sets must not be merged: Agni is the north-east mandala square and the south-east dikpala. */ dikpala: string; /** * Whether this is one of the four cardinal directions or one of the four intercardinal quarters. Always English. */ kind: string; /** * The element conventionally assigned to this quarter: fire, earth, air or water. Present only on the four intercardinal quarters, because the cardinal ones carry none in this scheme, and it is labelled convention because the Brihat Samhita assigns no element to any direction at all. */ element?: string; /** * The squares of the 81 pada grid this direction covers. For a cardinal direction those are its eight perimeter squares in the order the verses enumerate them; for an intercardinal quarter they are the corner square and the four single pada squares gathered around it. */ squares: Array; /** * The devatas of the squares this direction covers, in the same order as the squares list. */ devatas: Array<{ /** * Square number in the 81 pada grid. */ square: number; /** * Identifier of the devata holding it. Always English transliteration, safe to compare against and to look up on the devatas endpoint. */ id: string; /** * Display name of the devata. A Sanskrit proper noun: romanised with the diacritics the transliteration carries in every language, and written in Devanagari as the Sanskrit text prints it when lang is hi. */ name: string; }>; /** * What Brihat Samhita 53.118 puts on this side, in the chapter own terms. Present on the four intercardinal quarters, which are the only ones that verse places anything on. */ places?: string; /** * What the chapter says about standing water here, which it gives for all eight directions. */ water: { /** * What 53.119 says follows from standing water in this quarter, as original prose. */ effect: string; /** * Whether that effect is a gain or a harm. Only the north and the north-east are gains. Always English. */ auspiciousness: string; }; /** * The verses behind each part of this entry, and the convention label on the element where no verse gives one. */ sources: Array<{ /** * The primary text this verdict rests on, or the literal value convention where no verse states the rule. Always English, safe to compare against. */ text: string; /** * Chapter of the primary text. Absent on a convention, which has no chapter to cite. */ chapter?: number; /** * Verse or verse range inside the chapter. Absent on a convention. A range is written with a hyphen, as in 115-117. */ verse?: string; /** * Translator of the edition the verse was read in. Absent on a convention. */ translation?: string; /** * Publication year of that edition. Absent on a convention. */ year?: number; /** * Whether the cited edition is in the public domain. True on the 1884 Brihat Samhita edition, whose verses are quoted. False on the 1933 Manasara edition behind the Ayadi formulas, from which only the multipliers, divisors and names are taken, never a sentence. */ publicDomain?: boolean; /** * Why a convention rule says what it says. Present only when text is convention, and it names the tradition the rule comes from rather than a verse. */ basis?: string; }>; }; }; export type GetDikpalaDirectionResponse = GetDikpalaDirectionResponses[keyof GetDikpalaDirectionResponses]; export type ListDevatasData = { body?: never; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; /** * Maximum items to return per page. Range: 1-45, default 45. */ limit?: number; /** * Number of items to skip for pagination. Default 0. */ offset?: number; }; url: '/vastu/devatas'; }; export type ListDevatasErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type ListDevatasError = ListDevatasErrors[keyof ListDevatasErrors]; export type ListDevatasResponses = { /** * The devatas of the mandala with their squares, class and verses */ 200: { /** * How many devatas there are in all. Always 45 squares held, though the chapter prints only 44 distinct names because Indra appears twice. */ total: number; /** * How many were requested per page. */ limit: number; /** * How many were skipped. */ offset: number; /** * The devatas on this page, in the order the verses enumerate them: the east perimeter, then south, west and north, then inward to Brahma. */ devatas: Array<{ /** * Identifier of the devata, lower case transliteration. Always English, safe to compare against. Indra appears twice in the chapter, on the east perimeter and on the inner ring, so those two carry the ids indra-outer and indra-inner, which are ours: no source read for this package prints a distinguishing name for either. */ id: string; /** * Display name of the devata. A Sanskrit proper noun: romanised with the diacritics the transliteration carries in every language, and written in Devanagari as the Sanskrit text prints it when lang is hi. Compare on id, never on this. */ name: string; /** * Which ring of the mandala the devata belongs to: perimeter for the outer 32, innerRing for the eight around Brahma, innerCorner for the four on the inner diagonals, center for Brahma alone. 32 plus 8 plus 4 plus 1 is 45. Always English. */ class: 'perimeter' | 'innerRing' | 'innerCorner' | 'center'; /** * How many squares the devata holds under 53.49 to 50: padika for one, dvipada for two, tripada for three. Absent for Brahma, whom those verses leave outside the scheme while enumerating 44 devatas. */ group?: string; /** * Which side of the perimeter the devata sits on. Present only on the outer 32, which are the ones the verses enumerate side by side. */ side?: string; /** * Which quarter of the mandala the devata occupies, where it sits in one. Absent for a devata spread along a side rather than gathered in a corner. */ quadrant?: string; /** * Which of the 81 squares the devata holds. The verses name one square per devata and fix the pada count of each, and the remaining squares follow from that count: a dvipada takes its named square plus the one a step inward, a tripada the three cell cardinal run of the second ring. */ squares: Array; /** * The same squares as row and column pairs, which is what you draw with. The corners of the grid are 1 north-east, 9 south-east, 73 north-west and 81 south-west. */ cells: Array<{ /** * Row of the grid, 1 at the northern edge and 9 at the southern one. */ rowFromNorth: number; /** * Column of the grid, 1 at the western edge and 9 at the eastern one. */ columnFromWest: number; }>; /** * How many squares the devata holds: one, two or three for the 44 enumerated devatas, and nine for Brahma. */ padaCount: number; /** * The entrance pada this devata governs, 1 to 32. Present only on the outer 32, since only a perimeter square can hold a main door. */ entrancePada?: number; /** * What the devata holds, as a sentence composed from the sourced structure. There is deliberately no meaning field: no source read for this package gives a devata a meaning, and inventing one would be unsourced content on a route that sells a citation per verdict. Translated in place when lang is set. */ role: string; /** * Which verses of chapter 53 place this devata and fix its pada count, so a report can print the citation. */ verses: Array; /** * Where the sources disagree or contradict themselves about this row, and where Brahma sits outside the pada-count scheme. Present on the six rows that carry a recorded divergence: the two Indras, the north-east and south-east corner devatas where the Manasara differs from the Brihat Samhita, Prthvidhara, whom the chapter places on two different squares in two different verses, and Brahma. Original prose, translated in place when lang is set. */ note?: string; /** * Where a verdict comes from: a chapter and verse of a named public-domain edition, or the literal convention with the practice it rests on. Every verdict in this domain carries one. */ source: { /** * The primary text this verdict rests on, or the literal value convention where no verse states the rule. Always English, safe to compare against. */ text: string; /** * Chapter of the primary text. Absent on a convention, which has no chapter to cite. */ chapter?: number; /** * Verse or verse range inside the chapter. Absent on a convention. A range is written with a hyphen, as in 115-117. */ verse?: string; /** * Translator of the edition the verse was read in. Absent on a convention. */ translation?: string; /** * Publication year of that edition. Absent on a convention. */ year?: number; /** * Whether the cited edition is in the public domain. True on the 1884 Brihat Samhita edition, whose verses are quoted. False on the 1933 Manasara edition behind the Ayadi formulas, from which only the multipliers, divisors and names are taken, never a sentence. */ publicDomain?: boolean; /** * Why a convention rule says what it says. Present only when text is convention, and it names the tradition the rule comes from rather than a verse. */ basis?: string; }; }>; }; }; export type ListDevatasResponse = ListDevatasResponses[keyof ListDevatasResponses]; export type GetDevataData = { body?: never; path: { /** * Devata id, lower case transliteration. The two Indras are indra-outer for the east perimeter square and indra-inner for the inner ring one. Case and punctuation are folded. */ id: 'agni' | 'parjanya' | 'jayanta' | 'indra-outer' | 'surya' | 'satya' | 'bhrisa' | 'antariksha' | 'vayu' | 'pusha' | 'vitatha' | 'brihatkshata' | 'yama' | 'gandharva' | 'bhringaraja' | 'mriga' | 'pitri' | 'dauvarika' | 'sugriva' | 'kusumadanta' | 'varuna' | 'asura' | 'sosha' | 'papayakshma' | 'roga' | 'ahi' | 'mukhya' | 'bhallata' | 'soma' | 'bhujaga' | 'aditi' | 'diti' | 'aryaman' | 'savita' | 'vivasvan' | 'indra-inner' | 'mitra' | 'rajayakshma' | 'prthvidhara' | 'apavatsa' | 'apa' | 'savitra' | 'jaya' | 'rudra' | 'brahma'; }; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/vastu/devatas/{id}'; }; export type GetDevataErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetDevataError = GetDevataErrors[keyof GetDevataErrors]; export type GetDevataResponses = { /** * One devata with its squares, class, entrance pada and verses */ 200: { /** * Identifier of the devata, lower case transliteration. Always English, safe to compare against. Indra appears twice in the chapter, on the east perimeter and on the inner ring, so those two carry the ids indra-outer and indra-inner, which are ours: no source read for this package prints a distinguishing name for either. */ id: string; /** * Display name of the devata. A Sanskrit proper noun: romanised with the diacritics the transliteration carries in every language, and written in Devanagari as the Sanskrit text prints it when lang is hi. Compare on id, never on this. */ name: string; /** * Which ring of the mandala the devata belongs to: perimeter for the outer 32, innerRing for the eight around Brahma, innerCorner for the four on the inner diagonals, center for Brahma alone. 32 plus 8 plus 4 plus 1 is 45. Always English. */ class: 'perimeter' | 'innerRing' | 'innerCorner' | 'center'; /** * How many squares the devata holds under 53.49 to 50: padika for one, dvipada for two, tripada for three. Absent for Brahma, whom those verses leave outside the scheme while enumerating 44 devatas. */ group?: string; /** * Which side of the perimeter the devata sits on. Present only on the outer 32, which are the ones the verses enumerate side by side. */ side?: string; /** * Which quarter of the mandala the devata occupies, where it sits in one. Absent for a devata spread along a side rather than gathered in a corner. */ quadrant?: string; /** * Which of the 81 squares the devata holds. The verses name one square per devata and fix the pada count of each, and the remaining squares follow from that count: a dvipada takes its named square plus the one a step inward, a tripada the three cell cardinal run of the second ring. */ squares: Array; /** * The same squares as row and column pairs, which is what you draw with. The corners of the grid are 1 north-east, 9 south-east, 73 north-west and 81 south-west. */ cells: Array<{ /** * Row of the grid, 1 at the northern edge and 9 at the southern one. */ rowFromNorth: number; /** * Column of the grid, 1 at the western edge and 9 at the eastern one. */ columnFromWest: number; }>; /** * How many squares the devata holds: one, two or three for the 44 enumerated devatas, and nine for Brahma. */ padaCount: number; /** * The entrance pada this devata governs, 1 to 32. Present only on the outer 32, since only a perimeter square can hold a main door. */ entrancePada?: number; /** * What the devata holds, as a sentence composed from the sourced structure. There is deliberately no meaning field: no source read for this package gives a devata a meaning, and inventing one would be unsourced content on a route that sells a citation per verdict. Translated in place when lang is set. */ role: string; /** * Which verses of chapter 53 place this devata and fix its pada count, so a report can print the citation. */ verses: Array; /** * Where the sources disagree or contradict themselves about this row, and where Brahma sits outside the pada-count scheme. Present on the six rows that carry a recorded divergence: the two Indras, the north-east and south-east corner devatas where the Manasara differs from the Brihat Samhita, Prthvidhara, whom the chapter places on two different squares in two different verses, and Brahma. Original prose, translated in place when lang is set. */ note?: string; /** * Where a verdict comes from: a chapter and verse of a named public-domain edition, or the literal convention with the practice it rests on. Every verdict in this domain carries one. */ source: { /** * The primary text this verdict rests on, or the literal value convention where no verse states the rule. Always English, safe to compare against. */ text: string; /** * Chapter of the primary text. Absent on a convention, which has no chapter to cite. */ chapter?: number; /** * Verse or verse range inside the chapter. Absent on a convention. A range is written with a hyphen, as in 115-117. */ verse?: string; /** * Translator of the edition the verse was read in. Absent on a convention. */ translation?: string; /** * Publication year of that edition. Absent on a convention. */ year?: number; /** * Whether the cited edition is in the public domain. True on the 1884 Brihat Samhita edition, whose verses are quoted. False on the 1933 Manasara edition behind the Ayadi formulas, from which only the multipliers, divisors and names are taken, never a sentence. */ publicDomain?: boolean; /** * Why a convention rule says what it says. Present only when text is convention, and it names the tradition the rule comes from rather than a verse. */ basis?: string; }; }; }; export type GetDevataResponse = GetDevataResponses[keyof GetDevataResponses]; export type CalculateLifePathData = { body?: { /** * Birth year between 100 and 2100. Supports historical figures like Einstein (1879) and Shakespeare (1564). */ year: number; /** * Birth month (1-12) */ month: number; /** * Birth day (1-31) */ day: number; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/numerology/life-path'; }; export type CalculateLifePathErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type CalculateLifePathError = CalculateLifePathErrors[keyof CalculateLifePathErrors]; export type CalculateLifePathResponses = { /** * Successfully calculated Life Path number with detailed interpretation */ 200: { /** * Your Life Path number, the single most important number in Pythagorean numerology. Values range from 1 to 9 for single digits, or 11, 22, 33 for Master Numbers. */ number: number; /** * Full step-by-step breakdown of the 3-Cycle Pythagorean reduction. Shows how month, day, and year each reduce independently before combining into the final Life Path number. */ calculation: string; /** * Whether this is a standard single-digit number (1 to 9) or a Master Number (11, 22, 33). Master Numbers carry amplified spiritual significance and are never reduced further. */ type: 'single' | 'master'; /** * Indicates whether a Karmic Debt number (13, 14, 16, or 19) appeared during the reduction chain. Karmic Debt reveals past-life challenges carried into this lifetime. */ hasKarmicDebt: boolean; /** * The specific Karmic Debt number detected during reduction, if any. Each debt number (13, 14, 16, 19) represents a distinct past-life lesson requiring resolution. */ karmicDebtNumber?: number; /** * Detailed interpretation of the Karmic Debt number when present. Only returned when hasKarmicDebt is true. */ karmicDebtMeaning?: { /** * Title describing the karmic debt theme and core past-life pattern. */ description: string; /** * The specific challenge or pattern from past lives that must be confronted. */ challenge: string; /** * Practical guidance for resolving the karmic debt and transforming the challenge into growth. */ resolution: string; }; meaning: { /** * Numerology archetype name for this Life Path number. Encapsulates the core identity and energy in a single phrase, such as "The Leader" for 1 or "The Master Builder" for 22. */ title: string; /** * Ten defining personality traits and energetic themes associated with this number. Useful for quick personality snapshots, tag clouds, and compatibility matching. */ keywords: Array; /** * In-depth 300 to 500 word interpretation covering personality, purpose, and life themes. Written by numerology experts with decades of practice. Suitable for full-page readings and detailed reports. */ description: string; /** * Core strengths and positive qualities. Each entry includes a trait name followed by a detailed explanation of how it manifests in daily life. */ strengths: Array; /** * Growth areas and shadow qualities to be aware of. Each entry names the challenge and explains its root cause and how to work through it constructively. */ challenges: Array; /** * Tailored career guidance covering ideal industries, roles, and work environments. Includes specific job titles and explains why certain professional paths align with this number. */ career: string; /** * Love, friendship, and family dynamics. Covers romantic compatibility with other Life Path numbers, communication style, and the key relationship lessons for this number. */ relationships: string; /** * Spiritual path, soul lessons, and recommended practices. Explores the deeper purpose behind this number and offers guidance for personal growth and inner alignment. */ spirituality: string; }; }; }; export type CalculateLifePathResponse = CalculateLifePathResponses[keyof CalculateLifePathResponses]; export type CalculateExpressionData = { body?: { /** * Full birth name (first, middle, last) */ fullName: string; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/numerology/expression'; }; export type CalculateExpressionErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type CalculateExpressionError = CalculateExpressionErrors[keyof CalculateExpressionErrors]; export type CalculateExpressionResponses = { /** * Successfully calculated Expression number with detailed interpretation */ 200: { /** * Expression number (also called Destiny number) derived from all letters in the full birth name. Reveals natural talents, abilities, and the goals you are meant to achieve. Values: 1 to 9, 11, 22, or 33. */ number: number; /** * Full Pythagorean letter-to-number conversion showing every letter value in the birth name, grouped by word, then summed and reduced to the final Expression number. */ calculation: string; /** * Single-digit (1 to 9) or Master Number (11, 22, 33). Master Numbers in the Expression position indicate extraordinary innate talent that demands conscious development. */ type: 'single' | 'master'; /** * Whether a Karmic Debt number (13, 14, 16, 19) appeared during the name reduction. Indicates inherited challenges embedded in your given name. */ hasKarmicDebt: boolean; /** * Specific Karmic Debt number found during reduction. Each debt (13, 14, 16, 19) points to a distinct lesson woven into the talents your name bestows. */ karmicDebtNumber?: number; /** * Detailed interpretation of the Karmic Debt number when present. Includes the debt theme, the inherited challenge, and guidance for resolution. Only returned when hasKarmicDebt is true. */ karmicDebtMeaning?: { /** * Title describing the karmic debt theme. Identifies the core past-life pattern that this debt number carries forward. */ description: string; /** * The specific challenge or pattern from past lives that must be confronted. Explains the root cause of recurring obstacles. */ challenge: string; /** * Practical guidance for resolving the karmic debt. Actionable steps for transforming the inherited challenge into growth. */ resolution: string; }; meaning: { /** * Numerology archetype for this Expression number. Captures the essence of your natural abilities, such as "The Communicator" for 3 or "The Master Intuitive" for 11. */ title: string; /** * Defining traits and talent themes for this Expression number. Ideal for personality profiles, compatibility engines, and talent-matching features. */ keywords: Array; /** * Expert-written 300 to 500 word interpretation of the natural abilities, life mission, and destiny encoded in your birth name. Covers how these talents manifest across life stages. */ description: string; /** * Natural talents and innate gifts. Each strength includes a detailed explanation of how it shows up in work, relationships, and personal growth. */ strengths: Array; /** * Shadow side of your talents and areas requiring conscious effort. Each challenge explains its root cause and practical strategies for transformation. */ challenges: Array; /** * Professional guidance aligned with your natural Expression talents. Covers ideal industries, specific roles, and the work environments where you will thrive. */ career: string; /** * How your Expression number shapes love, friendship, and family bonds. Includes compatibility insights with other numbers and communication patterns. */ relationships: string; /** * The spiritual dimension of your Expression energy. Explores soul lessons, recommended practices, and the deeper purpose your talents are meant to serve. */ spirituality: string; }; }; }; export type CalculateExpressionResponse = CalculateExpressionResponses[keyof CalculateExpressionResponses]; export type CalculateBridgeNumbersData = { body?: { /** * Full legal birth name as it appears on the birth certificate. Used to calculate Expression, Soul Urge, and Personality numbers. Include first, middle, and last names separated by spaces. */ fullName: string; /** * Birth year between 100 and 2100. Used to calculate the Life Path number via Pythagorean reduction. */ year: number; /** * Birth month (1 to 12) */ month: number; /** * Birth day (1 to 31) */ day: number; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/numerology/bridge'; }; export type CalculateBridgeNumbersErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type CalculateBridgeNumbersError = CalculateBridgeNumbersErrors[keyof CalculateBridgeNumbersErrors]; export type CalculateBridgeNumbersResponses = { /** * Successfully calculated three Bridge Numbers with actionable harmony guidance */ 200: { /** * Bridge between Life Path and Expression numbers. Reveals the gap between your destined life purpose (from birth date) and your natural talents and abilities (from birth name). A high bridge here means your innate skills may not directly serve your life mission without conscious effort. */ lifePathExpression: { /** * Bridge number (0 to 8). The absolute difference between two core numerology numbers after reducing master numbers to single digits. 0 means the two aspects are already in natural harmony. Higher values indicate greater tension requiring conscious adjustment. */ bridge: number; from: { /** * Name of the first core number in this bridge pair. Identifies which aspect of personality or destiny is being compared. */ name: string; /** * The reduced single-digit value (1 to 9) of the first core number used in the bridge calculation. */ number: number; }; to: { /** * Name of the second core number in this bridge pair. Identifies the other aspect of personality or destiny being compared. */ name: string; /** * The reduced single-digit value (1 to 9) of the second core number used in the bridge calculation. */ number: number; }; /** * Actionable guidance for bridging the gap between these two aspects of your numerology profile. Explains what adjustments to make to bring these energies into harmony. */ meaning: string; }; /** * Bridge between Expression and Personality numbers. Reveals the gap between your true talents (all letters) and how others perceive you (consonants only). A high bridge means others may not see your real capabilities, requiring you to present yourself more authentically. */ expressionPersonality: { /** * Bridge number (0 to 8). The absolute difference between two core numerology numbers after reducing master numbers to single digits. 0 means the two aspects are already in natural harmony. Higher values indicate greater tension requiring conscious adjustment. */ bridge: number; from: { /** * Name of the first core number in this bridge pair. Identifies which aspect of personality or destiny is being compared. */ name: string; /** * The reduced single-digit value (1 to 9) of the first core number used in the bridge calculation. */ number: number; }; to: { /** * Name of the second core number in this bridge pair. Identifies the other aspect of personality or destiny being compared. */ name: string; /** * The reduced single-digit value (1 to 9) of the second core number used in the bridge calculation. */ number: number; }; /** * Actionable guidance for bridging the gap between these two aspects of your numerology profile. Explains what adjustments to make to bring these energies into harmony. */ meaning: string; }; /** * Bridge between Expression and Soul Urge numbers. Reveals the gap between your outward talents (all letters) and your deepest inner desires (vowels only). A high bridge means what you are good at may differ from what your soul truly craves, calling for realignment. */ expressionSoulUrge: { /** * Bridge number (0 to 8). The absolute difference between two core numerology numbers after reducing master numbers to single digits. 0 means the two aspects are already in natural harmony. Higher values indicate greater tension requiring conscious adjustment. */ bridge: number; from: { /** * Name of the first core number in this bridge pair. Identifies which aspect of personality or destiny is being compared. */ name: string; /** * The reduced single-digit value (1 to 9) of the first core number used in the bridge calculation. */ number: number; }; to: { /** * Name of the second core number in this bridge pair. Identifies the other aspect of personality or destiny being compared. */ name: string; /** * The reduced single-digit value (1 to 9) of the second core number used in the bridge calculation. */ number: number; }; /** * Actionable guidance for bridging the gap between these two aspects of your numerology profile. Explains what adjustments to make to bring these energies into harmony. */ meaning: string; }; }; }; export type CalculateBridgeNumbersResponse = CalculateBridgeNumbersResponses[keyof CalculateBridgeNumbersResponses]; export type CalculateSoulUrgeData = { body?: { /** * Full birth name (vowels will be extracted) */ fullName: string; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/numerology/soul-urge'; }; export type CalculateSoulUrgeErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type CalculateSoulUrgeError = CalculateSoulUrgeErrors[keyof CalculateSoulUrgeErrors]; export type CalculateSoulUrgeResponses = { /** * Successfully calculated Soul Urge number with detailed interpretation */ 200: { /** * Your Soul Urge number (also called Heart Desire number), revealing your innermost motivations and what your soul truly craves. Values range from 1 to 9 for single digits, or 11, 22, 33 for Master Numbers. */ number: number; /** * Full step-by-step Pythagorean reduction using only the vowels (A, E, I, O, U) from the birth name. Shows each vowel mapped to its numeric value, grouped by word, then summed and reduced to the final Soul Urge number. */ calculation: string; /** * Whether this is a standard single-digit number (1 to 9) or a Master Number (11, 22, 33). Master Numbers in the Soul Urge position indicate a soul with amplified spiritual longing and heightened inner sensitivity. */ type: 'single' | 'master'; /** * Indicates whether a Karmic Debt number (13, 14, 16, or 19) appeared during the vowel reduction chain. Karmic Debt in the Soul Urge reveals past-life emotional patterns and unresolved inner desires carried into this lifetime. */ hasKarmicDebt: boolean; /** * The specific Karmic Debt number detected during the vowel reduction, if any. Each debt number (13, 14, 16, 19) represents a distinct past-life emotional lesson that influences your deepest desires and motivations. */ karmicDebtNumber?: number; /** * Detailed interpretation of the Karmic Debt number when present. Only returned when hasKarmicDebt is true. */ karmicDebtMeaning?: { /** * Title describing the karmic debt theme and core past-life pattern. */ description: string; /** * The specific challenge from past lives that must be confronted. */ challenge: string; /** * Practical guidance for resolving the karmic debt. */ resolution: string; }; meaning: { /** * Numerology archetype for this Soul Urge number. Reveals the deepest inner motivation, such as "The Seeker" for 7 or "The Master Teacher" for 33. */ title: string; /** * Core emotional drives and inner motivations for this Soul Urge. Useful for understanding hidden desires, emotional needs, and what truly fulfills someone at the deepest level. */ keywords: Array; /** * Expert-written 300 to 500 word exploration of the inner self, hidden desires, and emotional landscape. Reveals what the heart truly craves beneath the surface persona. */ description: string; /** * Emotional superpowers and inner gifts. Each strength describes how it shapes decision-making, relationships, and the pursuit of personal fulfillment. */ strengths: Array; /** * Inner shadows and emotional patterns to balance. Explains how each challenge manifests when the Soul Urge energy is overextended or repressed. */ challenges: Array; /** * Career paths that satisfy your deepest emotional needs. Focuses on work that feeds the soul rather than just the resume, aligned with inner fulfillment. */ career: string; /** * How your Soul Urge shapes what you need from love, friendship, and family. Covers emotional compatibility, attachment style, and the key to feeling truly seen. */ relationships: string; /** * The spiritual hunger at your core. Explores what your soul is seeking in this lifetime and the practices that bring you closest to inner peace and alignment. */ spirituality: string; }; }; }; export type CalculateSoulUrgeResponse = CalculateSoulUrgeResponses[keyof CalculateSoulUrgeResponses]; export type CalculatePersonalityData = { body?: { /** * Full birth name (consonants will be extracted) */ fullName: string; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/numerology/personality'; }; export type CalculatePersonalityErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type CalculatePersonalityError = CalculatePersonalityErrors[keyof CalculatePersonalityErrors]; export type CalculatePersonalityResponses = { /** * Successfully calculated Personality number with detailed interpretation */ 200: { /** * Your Personality number, derived from the consonants in your birth name. Reveals how others perceive you, your outer persona, and the first impression you project. Values range from 1 to 9 for single digits, or 11, 22, 33 for Master Numbers. */ number: number; /** * Full step-by-step Pythagorean reduction using only the consonants from the birth name. Shows each consonant mapped to its numeric value, grouped by word, then summed and reduced to the final Personality number. */ calculation: string; /** * Whether this is a standard single-digit number (1 to 9) or a Master Number (11, 22, 33). Master Numbers in the Personality position indicate a powerful outer presence that others immediately sense, carrying heightened charisma and public influence. */ type: 'single' | 'master'; /** * Indicates whether a Karmic Debt number (13, 14, 16, or 19) appeared during the consonant reduction chain. Karmic Debt in the Personality position reveals past-life patterns that influence how others perceive you and the social challenges you must overcome. */ hasKarmicDebt: boolean; /** * The specific Karmic Debt number detected during the consonant reduction, if any. Each debt number (13, 14, 16, 19) represents a distinct past-life lesson that shapes your public image and social interactions. */ karmicDebtNumber?: number; /** * Detailed interpretation of the Karmic Debt number when present. Only returned when hasKarmicDebt is true. */ karmicDebtMeaning?: { /** * Title describing the karmic debt theme and core past-life pattern. */ description: string; /** * The specific challenge from past lives that must be confronted. */ challenge: string; /** * Practical guidance for resolving the karmic debt. */ resolution: string; }; meaning: { /** * Numerology archetype for this Personality number. Represents the outer mask you show the world, such as "The Builder" for 4 or "The Powerhouse" for 8. */ title: string; /** * Traits that define your public persona and first impression. These are the qualities others perceive before they get to know the real you. */ keywords: Array; /** * Expert-written 300 to 500 word analysis of the outer personality, social presence, and the image you project to the world. Reveals the gap between how others see you and who you truly are. */ description: string; /** * Your strongest social assets and public-facing gifts. These qualities shape how you are received in professional settings, social gatherings, and first meetings. */ strengths: Array; /** * Blind spots in your public persona. Patterns others notice that you may not, including defense mechanisms and image-management tendencies that can limit authentic connection. */ challenges: Array; /** * How your outward presence shapes professional opportunities. Covers the industries, roles, and environments where your public image creates the greatest advantage. */ career: string; /** * First impressions in love and social dynamics. Explores how your Personality number attracts certain partners, sets relationship expectations, and influences group dynamics. */ relationships: string; /** * The spiritual energy you radiate to others. Explores how your outer presence serves as a channel for deeper purpose, and what your public path reveals about your soul mission. */ spirituality: string; }; }; }; export type CalculatePersonalityResponse = CalculatePersonalityResponses[keyof CalculatePersonalityResponses]; export type CalculateBirthDayData = { body?: { /** * Day of birth (1-31) */ day: number; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/numerology/birth-day'; }; export type CalculateBirthDayErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type CalculateBirthDayError = CalculateBirthDayErrors[keyof CalculateBirthDayErrors]; export type CalculateBirthDayResponses = { /** * Successfully calculated Birth Day number with detailed interpretation */ 200: { /** * Your Birth Day number, revealing the special talents and innate abilities you carry from the day you were born. Values range from 1 to 9 for single digits, or 11, 22 for Master Numbers (days 11 and 22 are never reduced). */ number: number; /** * Step-by-step digit reduction of the birth day. Single-digit days (1 to 9) remain as-is, Master Number days (11, 22) are preserved, and all other double-digit days are reduced by summing their digits. */ calculation: string; /** * Whether this is a standard single-digit number (1 to 9) or a Master Number (11, 22). Master Numbers in the Birth Day position indicate extraordinary innate gifts that are available from birth and demand conscious development. */ type: 'single' | 'master'; /** * Indicates whether a Karmic Debt number (13, 14, 16, or 19) corresponds to the birth day. Karmic Debt in the Birth Day position reveals past-life challenges woven directly into your natural talents, influencing how your gifts manifest. */ hasKarmicDebt: boolean; /** * The specific Karmic Debt number detected from the birth day, if any. Each debt number (13, 14, 16, 19) represents a distinct past-life lesson embedded in the talents your birth day bestows. */ karmicDebtNumber?: number; /** * Detailed interpretation of the Karmic Debt number when present. Only returned when hasKarmicDebt is true. */ karmicDebtMeaning?: { /** * Title describing the karmic debt theme and core past-life pattern. */ description: string; /** * The specific challenge from past lives that must be confronted. */ challenge: string; /** * Practical guidance for resolving the karmic debt. */ resolution: string; }; meaning: { /** * Numerology archetype for this Birth Day number. Represents the specific talent or gift you brought into this life, like "The Nurturer" for 6 or "The Seeker" for 7. */ title: string; /** * Innate talents and natural aptitudes encoded in your birth day. These gifts are available from birth and become more refined with age. */ keywords: Array; /** * Expert-written 300 to 500 word reading of the special abilities your birth day bestows. Covers how these gifts complement your Life Path and Expression numbers. */ description: string; /** * Natural-born strengths that come effortlessly. These are the talents you can rely on even without formal training or conscious development. */ strengths: Array; /** * The flip side of your gifts. Each challenge explains how an overreliance on natural talent can become a liability without conscious balance. */ challenges: Array; /** * Professional paths where your birth day talents create an immediate advantage. Covers specific roles, industries, and work styles that align with your innate abilities. */ career: string; /** * How your birth day gifts shape the way you connect with others. Covers romantic chemistry, friendship dynamics, and the relationship patterns rooted in your natural temperament. */ relationships: string; /** * The spiritual dimension of your natural gifts. Explores how your birth day talents serve a higher purpose and the practices that help you channel them with intention. */ spirituality: string; }; }; }; export type CalculateBirthDayResponse = CalculateBirthDayResponses[keyof CalculateBirthDayResponses]; export type CalculateMaturityData = { body?: { /** * Your Life Path number (1-9, 11, 22, 33). Optional if year, month, day are provided. */ lifePath?: number; /** * Your Expression number (1-9, 11, 22, 33). Optional if fullName is provided. */ expression?: number; /** * Full birth name to calculate Expression number automatically. Use instead of passing expression directly. */ fullName?: string; /** * Birth year to calculate Life Path automatically. Use with month and day instead of passing lifePath directly. */ year?: number; /** * Birth month (1-12). Required with year and day for automatic Life Path calculation. */ month?: number; /** * Birth day (1-31). Required with year and month for automatic Life Path calculation. */ day?: number; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/numerology/maturity'; }; export type CalculateMaturityErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type CalculateMaturityError = CalculateMaturityErrors[keyof CalculateMaturityErrors]; export type CalculateMaturityResponses = { /** * Successfully calculated Maturity number with detailed interpretation */ 200: { /** * Your Maturity number (also called Realization number), revealing who you are becoming in the second half of life. Derived from the sum of your Life Path and Expression numbers. Values range from 1 to 9 for single digits, or 11, 22, 33 for Master Numbers. */ number: number; /** * Full step-by-step reduction showing Life Path plus Expression combined and reduced to the final Maturity number. This synthesis represents the convergence of your life purpose and natural talents into mature wisdom. */ calculation: string; /** * Whether this is a standard single-digit number (1 to 9) or a Master Number (11, 22, 33). Master Numbers in the Maturity position indicate a powerful late-life awakening with extraordinary potential for spiritual leadership and legacy. */ type: 'single' | 'master'; /** * Indicates whether a Karmic Debt number (13, 14, 16, or 19) appeared during the Life Path plus Expression reduction. Karmic Debt in the Maturity position reveals past-life lessons that surface during midlife transformation, typically after age 35 to 40. */ hasKarmicDebt: boolean; /** * The specific Karmic Debt number detected during the Maturity reduction, if any. Each debt number (13, 14, 16, 19) represents a distinct past-life challenge that becomes especially prominent as you enter the second half of life. */ karmicDebtNumber?: number; /** * Detailed interpretation of the Karmic Debt number when present. Only returned when hasKarmicDebt is true. */ karmicDebtMeaning?: { /** * Title describing the karmic debt theme and core past-life pattern. */ description: string; /** * The specific challenge from past lives that must be confronted. */ challenge: string; /** * Practical guidance for resolving the karmic debt. */ resolution: string; }; meaning: { /** * Numerology archetype for the Maturity number. Reveals who you are becoming in the second half of life, such as "The Builder" for 4 or "The Humanitarian" for 9. */ title: string; /** * Emerging traits and qualities that strengthen after age 35 to 40. These energies gradually integrate into your personality as you mature. */ keywords: Array; /** * Expert-written 300 to 500 word guide to the person you are evolving into. The Maturity number is the sum of Life Path and Expression, representing the wisdom gained through lived experience. */ description: string; /** * Late-blooming strengths that emerge with age and experience. These are the gifts that become your greatest assets in the second half of life. */ strengths: Array; /** * Growth areas to watch as Maturity energy intensifies. Understanding these early helps you navigate the transition with awareness and grace. */ challenges: Array; /** * Career evolution and professional reinvention for the second act. Covers industries, roles, and pursuits that align with your mature energy and accumulated wisdom. */ career: string; /** * How your relationships deepen and transform as Maturity energy takes hold. Covers evolving partnership needs, family dynamics, and the relationship wisdom that comes with age. */ relationships: string; /** * Spiritual awakening in the mature years. Explores the deeper meaning that emerges when life experience meets the Maturity number, and practices for this transformative phase. */ spirituality: string; }; }; }; export type CalculateMaturityResponse = CalculateMaturityResponses[keyof CalculateMaturityResponses]; export type AnalyzeKarmicLessonsData = { body?: { /** * Full birth name to analyze for missing numbers */ fullName: string; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/numerology/karmic-lessons'; }; export type AnalyzeKarmicLessonsErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type AnalyzeKarmicLessonsError = AnalyzeKarmicLessonsErrors[keyof AnalyzeKarmicLessonsErrors]; export type AnalyzeKarmicLessonsResponses = { /** * Successfully analyzed karmic lessons with development guidance */ 200: { /** * Numbers missing from name (karmic lessons) */ missingNumbers: Array; lessons: Array<{ /** * Missing number */ number: number; /** * Core lesson summary */ lesson: string; /** * Detailed lesson explanation */ description: string; /** * Practical guidance for developing this quality */ howToOvercome: string; }>; /** * Count of each number present in name */ presentNumbers: { [key: string]: number; }; }; }; export type AnalyzeKarmicLessonsResponse = AnalyzeKarmicLessonsResponses[keyof AnalyzeKarmicLessonsResponses]; export type CheckKarmicDebtData = { body?: { /** * Birth year (checks Life Path) */ year?: number; /** * Birth month (checks Life Path) */ month?: number; /** * Birth day (checks Life Path) */ day?: number; /** * Full birth name (checks Expression, Soul Urge, Personality) */ fullName?: string; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/numerology/karmic-debt'; }; export type CheckKarmicDebtErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type CheckKarmicDebtError = CheckKarmicDebtErrors[keyof CheckKarmicDebtErrors]; export type CheckKarmicDebtResponses = { /** * Successfully detected karmic debt with detailed meanings */ 200: { /** * Whether any karmic debt numbers were detected */ hasKarmicDebt: boolean; /** * All karmic debt numbers found (13, 14, 16, 19) */ debtNumbers: Array; meanings: Array<{ /** * Karmic debt number */ number: number; /** * Debt title and nature */ description: string; /** * Detailed explanation of past life issue and current challenges */ challenge: string; /** * Guidance for resolving karmic debt in this lifetime */ resolution: string; }>; /** * Human-readable summary. Explains what the karmic debt findings mean or provides a positive affirmation when no debt is found. */ message: string; }; }; export type CheckKarmicDebtResponse = CheckKarmicDebtResponses[keyof CheckKarmicDebtResponses]; export type CalculatePersonalDayData = { body?: { /** * Birth month (1-12) */ month: number; /** * Birth day (1-31) */ day: number; /** * Target date in YYYY-MM-DD format. Defaults to today (UTC). */ targetDate?: string; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/numerology/personal-day'; }; export type CalculatePersonalDayErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type CalculatePersonalDayError = CalculatePersonalDayErrors[keyof CalculatePersonalDayErrors]; export type CalculatePersonalDayResponses = { /** * Successfully calculated Personal Day with forecast */ 200: { /** * Personal Day number (1-9). The most granular numerology cycle, revealing the energy and theme for this specific day based on your birth data. */ personalDay: number; /** * Central theme for this Personal Day. A concise label capturing the dominant energy of the day. */ theme: string; /** * Actionable daily guidance. Specific advice for how to work with the energy of this Personal Day. */ guidance: string; /** * The calendar date this forecast applies to in YYYY-MM-DD format. */ targetDate: string; /** * The parent Personal Month number this day falls within. */ personalMonth: number; /** * Theme of the parent Personal Month, providing broader context for the daily forecast. */ personalMonthTheme: string; /** * The parent Personal Year number this day falls within. */ personalYear: number; /** * Theme of the parent Personal Year, providing the broadest cycle context. */ personalYearTheme: string; }; }; export type CalculatePersonalDayResponse = CalculatePersonalDayResponses[keyof CalculatePersonalDayResponses]; export type CalculatePersonalMonthData = { body?: { /** * Birth month (1-12) */ month: number; /** * Birth day (1-31) */ day: number; /** * Target year for calculation (defaults to current year) */ year?: number; /** * Target calendar month to forecast (1-12, defaults to current month) */ targetMonth?: number; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/numerology/personal-month'; }; export type CalculatePersonalMonthErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type CalculatePersonalMonthError = CalculatePersonalMonthErrors[keyof CalculatePersonalMonthErrors]; export type CalculatePersonalMonthResponses = { /** * Successfully calculated Personal Month with forecast */ 200: { /** * Personal Month number (1-9). Each month in the cycle carries specific energy and themes that guide decisions and focus. */ personalMonth: number; /** * Central theme for this Personal Month. A concise label capturing the dominant energy. */ theme: string; /** * Practical guidance for this month. Specific actions, areas of focus, and advice for making the most of this monthly energy. */ focus: string; /** * The calendar month this forecast applies to (1-12). */ calendarMonth: number; /** * The parent Personal Year number this month falls within. */ personalYear: number; /** * Theme of the parent Personal Year, providing broader context for the monthly forecast. */ personalYearTheme: string; }; }; export type CalculatePersonalMonthResponse = CalculatePersonalMonthResponses[keyof CalculatePersonalMonthResponses]; export type CalculatePersonalYearData = { body?: { /** * Birth month (1-12) */ month: number; /** * Birth day (1-31) */ day: number; /** * Year to calculate (defaults to current year) */ year?: number; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/numerology/personal-year'; }; export type CalculatePersonalYearErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type CalculatePersonalYearError = CalculatePersonalYearErrors[keyof CalculatePersonalYearErrors]; export type CalculatePersonalYearResponses = { /** * Successfully calculated Personal Year with forecast */ 200: { /** * Personal Year number (1-9) */ personalYear: number; /** * Position in the 9-year cycle */ cycle: string; /** * Main theme of the year */ theme: string; /** * Detailed year forecast (200-300 words) */ forecast: string; /** * Key opportunities in this year */ opportunities: Array; /** * Challenges to navigate */ challenges: Array; /** * Practical guidance for navigating the year */ advice: string; }; }; export type CalculatePersonalYearResponse = CalculatePersonalYearResponses[keyof CalculatePersonalYearResponses]; export type CalculateNumCompatibilityData = { body?: { person1: { /** * Full birth name to calculate Expression and Soul Urge numbers automatically. Use instead of passing expression and soulUrge directly. */ fullName?: string; /** * Birth year to calculate Life Path automatically. Use with month and day instead of passing lifePath directly. */ year?: number; /** * Birth month (1-12). Required with year and day for automatic Life Path calculation. */ month?: number; /** * Birth day (1-31). Required with year and month for automatic Life Path calculation. */ day?: number; /** * Person 1 Life Path number (1-9, 11, 22, 33). Optional if year, month, day are provided. */ lifePath?: number; /** * Person 1 Expression number (1-9, 11, 22, 33). Optional if fullName is provided. */ expression?: number; /** * Person 1 Soul Urge number (1-9, 11, 22, 33). Optional if fullName is provided. */ soulUrge?: number; }; person2: { /** * Full birth name to calculate Expression and Soul Urge numbers automatically. Use instead of passing expression and soulUrge directly. */ fullName?: string; /** * Birth year to calculate Life Path automatically. Use with month and day instead of passing lifePath directly. */ year?: number; /** * Birth month (1-12). Required with year and day for automatic Life Path calculation. */ month?: number; /** * Birth day (1-31). Required with year and month for automatic Life Path calculation. */ day?: number; /** * Person 2 Life Path number (1-9, 11, 22, 33). Optional if year, month, day are provided. */ lifePath?: number; /** * Person 2 Expression number (1-9, 11, 22, 33). Optional if fullName is provided. */ expression?: number; /** * Person 2 Soul Urge number (1-9, 11, 22, 33). Optional if fullName is provided. */ soulUrge?: number; }; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/numerology/compatibility'; }; export type CalculateNumCompatibilityErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type CalculateNumCompatibilityError = CalculateNumCompatibilityErrors[keyof CalculateNumCompatibilityErrors]; export type CalculateNumCompatibilityResponses = { /** * Successfully calculated compatibility with detailed analysis */ 200: { /** * Overall compatibility score (0-100) */ overallScore: number; /** * Compatibility rating: Highly Compatible, Very Compatible, Compatible, Moderately Compatible, or Challenging. */ rating: string; lifePath: { /** * Person 1 Life Path number */ person1: number; /** * Person 2 Life Path number */ person2: number; /** * Life Path compatibility score (0-100) */ compatibility: number; /** * Detailed Life Path compatibility analysis */ description: string; }; expression: { /** * Person 1 Expression number */ person1: number; /** * Person 2 Expression number */ person2: number; /** * Expression compatibility score (0-100) */ compatibility: number; /** * Detailed Expression compatibility analysis */ description: string; }; soulUrge: { /** * Person 1 Soul Urge number */ person1: number; /** * Person 2 Soul Urge number */ person2: number; /** * Soul Urge compatibility score (0-100) */ compatibility: number; /** * Detailed Soul Urge compatibility analysis */ description: string; }; /** * Key relationship strengths */ strengths: Array; /** * Potential relationship challenges */ challenges: Array; /** * Practical relationship advice */ advice: string; }; }; export type CalculateNumCompatibilityResponse = CalculateNumCompatibilityResponses[keyof CalculateNumCompatibilityResponses]; export type GenerateNumerologyChartData = { body?: { /** * Full birth name as it appears on the birth certificate. Used for all letter-based Pythagorean numerology calculations including Expression, Soul Urge, Personality, and Karmic Lessons. */ fullName: string; /** * Birth year between 100 and 2100. Supports historical figures like Einstein (1879) and Shakespeare (1564). */ year: number; /** * Birth month (1-12) */ month: number; /** * Birth day (1-31) */ day: number; /** * Year for Personal Year calculation (defaults to current year) */ currentYear?: number; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/numerology/chart'; }; export type GenerateNumerologyChartErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GenerateNumerologyChartError = GenerateNumerologyChartErrors[keyof GenerateNumerologyChartErrors]; export type GenerateNumerologyChartResponses = { /** * Successfully generated complete numerology chart */ 200: { /** * Input profile data used to generate the chart. */ profile: { /** * Full birth name used for letter-based calculations (Expression, Soul Urge, Personality). */ name: string; /** * Birth date in YYYY-MM-DD format. */ birthdate: string; }; /** * Six core numerology numbers with full interpretations. The foundation of any complete numerology reading. */ coreNumbers: { /** * Life Path. The most significant core number, revealing life purpose and destiny path. */ lifePath: { /** * Life Path number (1-9, 11, 22, 33). The most important number in numerology, derived from birth date. Reveals life purpose and destiny. */ number: number; /** * Step-by-step calculation showing how the Life Path number was derived from the birth date. */ calculation: string; /** * Whether this is a single digit (1-9) or master number (11, 22, 33). Master numbers carry amplified spiritual significance. */ type: 'single' | 'master'; /** * True if the reduction passed through a karmic debt number (13, 14, 16, 19). */ hasKarmicDebt: boolean; /** * The karmic debt number encountered during reduction, if any. */ karmicDebtNumber?: number; /** * Complete interpretation of the Life Path number with archetype, traits, career guidance, relationship insights, and spiritual direction. */ meaning: { /** * Numerology archetype name for this Life Path number. A defining phrase that captures the core identity, such as "The Leader" for 1 or "The Humanitarian" for 9. */ title: string; /** * Defining personality traits and energetic themes for this Life Path. Useful for compatibility matching, personality snapshots, and building numerology profile summaries. */ keywords: Array; /** * Authoritative 300 to 500 word interpretation covering personality, life purpose, and core themes. Written by numerology experts and suitable for full-page readings or PDF report generation. */ description: string; /** * Core strengths and positive qualities. Each entry pairs a trait with a detailed explanation of how it manifests in everyday life and decision-making. */ strengths: Array; /** * Growth areas and shadow qualities to work through. Each entry explains the root cause, how it surfaces in behavior, and constructive strategies for personal development. */ challenges: Array; /** * Tailored career guidance covering ideal industries, roles, and work environments. Includes specific job titles and explains why certain professional paths resonate with this Life Path energy. */ career: string; /** * Love, friendship, and family dynamics shaped by this Life Path. Covers romantic compatibility with other numbers, communication style, and the key relationship lessons for lasting partnerships. */ relationships: string; /** * Spiritual path, soul lessons, and recommended practices. Explores the deeper purpose behind this Life Path number and guidance for personal growth and inner transformation. */ spirituality: string; }; }; /** * Expression (Destiny) number. Reveals natural talents, abilities, and life goals derived from the full birth name. */ expression: { /** * Expression (Destiny) number derived from full birth name using Pythagorean numerology. */ number: number; /** * Letter-to-number conversion showing how the Expression number was calculated. */ calculation: string; /** * Single digit or master number. */ type: 'single' | 'master'; /** * Whether karmic debt was encountered during calculation. */ hasKarmicDebt: boolean; /** * Karmic debt number if present. */ karmicDebtNumber?: number; /** * Complete interpretation of the Expression number with archetype, talents, career paths, relationship dynamics, and spiritual expression. */ meaning: { /** * Numerology archetype for this Expression number. Reveals the natural talent blueprint, such as "The Communicator" for 3 or "The Master Builder" for 22. */ title: string; /** * Natural talents and abilities encoded in the birth name. These define your innate skill set, creative potential, and the gifts available to you throughout life. */ keywords: Array; /** * Expert-written 300 to 500 word analysis of natural abilities, life goals, and the talents your birth name reveals. Suitable for detailed readings and personality assessments. */ description: string; /** * Natural-born talents and creative gifts. Each strength describes a specific ability that comes effortlessly and how it contributes to personal and professional success. */ strengths: Array; /** * Growth areas where natural talent can become a liability without conscious balance. Explains how each challenge manifests and practical ways to work through it. */ challenges: Array; /** * Career paths where your Expression number talents create the greatest professional advantage. Covers specific industries, creative pursuits, and work styles aligned with your name vibration. */ career: string; /** * How your Expression number shapes the way you communicate, connect, and express love. Covers partnership dynamics, social style, and the relationship patterns rooted in your name energy. */ relationships: string; /** * The spiritual dimension of your natural gifts. Explores how your Expression number talents serve a higher purpose and the creative practices that deepen self-expression. */ spirituality: string; }; }; /** * Soul Urge (Heart Desire) number. Reveals innermost desires, motivations, and what truly makes you happy. Calculated from vowels. */ soulUrge: { /** * Soul Urge (Heart Desire) number from vowels in birth name. */ number: number; /** * Vowel extraction and reduction calculation. */ calculation: string; /** * Single digit or master number. */ type: 'single' | 'master'; /** * Whether karmic debt was encountered. */ hasKarmicDebt: boolean; /** * Karmic debt number if present. */ karmicDebtNumber?: number; /** * Complete interpretation of the Soul Urge number with archetype, emotional drives, relationship needs, and spiritual direction. */ meaning: { /** * Numerology archetype for this Soul Urge number. Reveals the deepest inner motivation, such as "The Seeker" for 7 or "The Master Teacher" for 33. */ title: string; /** * Core emotional drives and inner motivations. These define what truly fulfills you at the deepest level, beyond surface-level desires and social expectations. */ keywords: Array; /** * Expert-written 300 to 500 word exploration of the inner self, hidden desires, and emotional landscape. Reveals what the heart truly craves beneath the surface persona. */ description: string; /** * Emotional superpowers and inner gifts. Each strength describes how it shapes decision-making, relationships, and the pursuit of personal fulfillment. */ strengths: Array; /** * Inner shadows and emotional patterns to balance. Explains how each challenge manifests when the Soul Urge energy is overextended or repressed. */ challenges: Array; /** * Career paths that satisfy your deepest emotional needs. Focuses on work that feeds the soul rather than just the resume, aligned with lasting inner fulfillment. */ career: string; /** * How your Soul Urge shapes what you need from love, friendship, and family. Covers emotional compatibility, attachment style, and the key to feeling truly seen and understood. */ relationships: string; /** * The spiritual hunger at your core. Explores what your soul is seeking in this lifetime and the contemplative practices that bring you closest to inner peace and alignment. */ spirituality: string; }; }; /** * Personality number. The outer you, how the world perceives you. Calculated from consonants in the birth name. */ personality: { /** * Personality number from consonants in birth name. */ number: number; /** * Consonant extraction and reduction calculation. */ calculation: string; /** * Single digit or master number. */ type: 'single' | 'master'; /** * Whether karmic debt was encountered. */ hasKarmicDebt: boolean; /** * Karmic debt number if present. */ karmicDebtNumber?: number; /** * Complete interpretation of the Personality number with archetype, social traits, professional image, and first-impression dynamics. */ meaning: { /** * Numerology archetype for this Personality number. Represents the outer mask you show the world, such as "The Builder" for 4 or "The Powerhouse" for 8. */ title: string; /** * Traits that define your public persona and first impression. These are the qualities others perceive before they get to know the real you. */ keywords: Array; /** * Expert-written 300 to 500 word analysis of the outer personality, social presence, and the image you project to the world. Reveals the gap between perception and inner truth. */ description: string; /** * Your strongest social assets and public-facing gifts. These qualities shape how you are received in professional settings, social gatherings, and first meetings. */ strengths: Array; /** * Blind spots in your public persona. Patterns others notice that you may not, including defense mechanisms and image-management tendencies that can limit authentic connection. */ challenges: Array; /** * How your outward presence shapes professional opportunities. Covers the industries, roles, and environments where your public image creates the greatest advantage. */ career: string; /** * First impressions in love and social dynamics. Explores how your Personality number attracts certain partners, sets relationship expectations, and influences group dynamics. */ relationships: string; /** * The spiritual energy you radiate to others. Explores how your outer presence serves as a channel for deeper purpose and what your public path reveals about your soul mission. */ spirituality: string; }; }; /** * Birth Day number. Reveals a special talent or gift based on the calendar day of birth. */ birthDay: { /** * Birth Day number (1-31). A special talent number based on the day of the month you were born. */ number: number; /** * Step-by-step calculation showing how the Birth Day number was reduced from the calendar day of birth. */ calculation: string; /** * Whether this is a single digit (1-9) or master number (11, 22). Birth days of 11 and 22 are preserved as master numbers. */ type: 'single' | 'master'; /** * True if the birth day is a karmic debt number (13, 14, 16, 19). */ hasKarmicDebt: boolean; /** * The karmic debt number if the birth day carries one (13, 14, 16, or 19). */ karmicDebtNumber?: number; /** * Complete interpretation of the Birth Day number with archetype, innate talents, career advantages, and relationship dynamics. */ meaning: { /** * Numerology archetype for this Birth Day number. Represents the specific talent or gift you brought into this life, like "The Nurturer" for 6 or "The Seeker" for 7. */ title: string; /** * Innate talents and natural aptitudes encoded in your birth day. These gifts are available from birth and become more refined with age and experience. */ keywords: Array; /** * Expert-written 300 to 500 word reading of the special abilities your birth day bestows. Covers how these gifts complement your Life Path and Expression numbers. */ description: string; /** * Natural-born strengths that come effortlessly. These are the talents you can rely on even without formal training or conscious development. */ strengths: Array; /** * The flip side of your gifts. Each challenge explains how an overreliance on natural talent can become a liability without conscious balance. */ challenges: Array; /** * Professional paths where your birth day talents create an immediate advantage. Covers specific roles, industries, and work styles aligned with your innate abilities. */ career: string; /** * How your birth day gifts shape the way you connect with others. Covers romantic chemistry, friendship dynamics, and the relationship patterns rooted in your natural temperament. */ relationships: string; /** * The spiritual dimension of your natural gifts. Explores how your birth day talents serve a higher purpose and the practices that help you channel them with intention. */ spirituality: string; }; }; /** * Maturity number. The person you are becoming. Sum of Life Path and Expression, activates around age 35-40. */ maturity: { /** * Maturity number (Life Path + Expression). Becomes active around age 35-40. */ number: number; /** * Shows Life Path + Expression reduction. */ calculation: string; /** * Single digit or master number. */ type: 'single' | 'master'; /** * Whether karmic debt was encountered. */ hasKarmicDebt: boolean; /** * Karmic debt number if present. */ karmicDebtNumber?: number; /** * Complete interpretation of the Maturity number with archetype, emerging traits, career evolution, and spiritual awakening. */ meaning: { /** * Numerology archetype for the Maturity number. Reveals who you are becoming in the second half of life, such as "The Builder" for 4 or "The Humanitarian" for 9. */ title: string; /** * Emerging traits and qualities that strengthen after age 35 to 40. These energies gradually integrate into your personality as you mature and gain life experience. */ keywords: Array; /** * Expert-written 300 to 500 word guide to the person you are evolving into. The Maturity number represents the wisdom gained through lived experience and reveals your ultimate destination. */ description: string; /** * Late-blooming strengths that emerge with age and experience. These are the gifts that become your greatest assets in the second half of life. */ strengths: Array; /** * Growth areas to watch as Maturity energy intensifies. Understanding these early helps you navigate the transition into your mature self with awareness and grace. */ challenges: Array; /** * Career evolution and professional reinvention for the second act. Covers industries, roles, and pursuits that align with your mature energy and accumulated wisdom. */ career: string; /** * How your relationships deepen and transform as Maturity energy takes hold. Covers evolving partnership needs, family dynamics, and the relationship wisdom that comes with age. */ relationships: string; /** * Spiritual awakening in the mature years. Explores the deeper meaning that emerges when life experience meets the Maturity number and practices for this transformative phase. */ spirituality: string; }; }; }; /** * Additional numerology insights: karmic analysis, yearly/monthly forecasts, pinnacles, challenges, hidden passion, subconscious self, and name letter analysis. */ additionalInsights: { /** * Karmic Lessons analysis. Identifies lessons the soul needs to learn based on missing numbers in the birth name. */ karmicLessons: { /** * Numbers (1-9) missing from the birth name. Each missing number represents a karmic lesson to learn in this lifetime. */ missingNumbers: Array; /** * Detailed karmic lessons for each missing number. */ lessons: Array<{ /** * The missing number representing this karmic lesson. */ number: number; /** * Karmic lesson title identifying the core quality or virtue this soul needs to develop in the current lifetime. */ lesson: string; /** * What this missing number means for personal growth. Explains the life patterns, recurring situations, and soul-level work required to integrate this energy. */ description: string; /** * Actionable guidance for mastering this karmic lesson. Includes specific behaviors, mindset shifts, and daily practices that build the missing quality over time. */ howToOvercome: string; }>; /** * Count of each number (1-9) present in the birth name. High counts indicate natural strengths. */ presentNumbers: { [key: string]: number; }; }; /** * Karmic Debt analysis. Identifies unresolved karma from past lives carried through specific numbers (13, 14, 16, 19). */ karmicDebt: { /** * True if any core number reduces through a karmic debt number (13, 14, 16, 19). */ hasKarmicDebt: boolean; /** * List of karmic debt numbers found (13=laziness, 14=abuse of freedom, 16=ego destruction, 19=selfishness). */ debtNumbers: Array; /** * Detailed meanings for each karmic debt number found. */ meanings: Array<{ /** * Karmic debt number (13, 14, 16, or 19). Each represents a specific pattern of unresolved karma from past lives that demands conscious attention. */ number: number; /** * What this karmic debt means for your current lifetime. Explains the past-life pattern, how it manifests today, and why certain struggles keep recurring. */ description: string; /** * The central life challenge this debt creates. Identifies the repeating obstacle pattern and the emotional or behavioral trap to watch for. */ challenge: string; /** * How to resolve and transcend this karmic debt. Provides the spiritual lesson, practical steps, and the transformative shift that breaks the cycle. */ resolution: string; }>; }; /** * Personal Year forecast with nested Personal Month. Yearly and monthly numerology cycles. */ personalYear: { /** * Personal Year number (1-9). Each year in the 9-year cycle has distinct themes and energies. */ personalYear: number; /** * Position in the 9-year numerology cycle (e.g., "Year 5 of 9"). Each position carries distinct energy that shapes the entire year. */ cycle: string; /** * Central theme and energy defining this Personal Year. Provides a one-line summary of the dominant vibration influencing all areas of life. */ theme: string; /** * Detailed yearly forecast covering what to expect across career, relationships, health, and personal development. Provides month-by-month energy shifts and key turning points. */ forecast: string; /** * Key opportunities available during this Personal Year. Each entry identifies a specific area of life where conditions are favorable for growth and forward momentum. */ opportunities: Array; /** * Potential challenges to navigate during this cycle. Each entry identifies a recurring theme or obstacle and how to work with the energy rather than against it. */ challenges: Array; /** * Strategic guidance for making the most of this Personal Year. Covers timing decisions, areas to focus on, and the mindset that aligns with the current numerological energy. */ advice: string; /** * Personal Month forecast nested within the Personal Year cycle. */ personalMonth: { /** * Personal Month number (1-9). */ personalMonth: number; /** * Central theme for this Personal Month. */ theme: string; /** * Practical focus and guidance for this month. */ focus: string; }; }; /** * Four Pinnacle numbers representing major life phases with age ranges and meanings. */ pinnacles: Array<{ /** * Pinnacle position (1-4). Four major life phases. */ position: number; /** * Pinnacle number (1-9, 11, 22, 33). Defines the theme of this life phase. */ number: number; /** * Age when this Pinnacle phase begins. */ startAge: number; /** * Age when this phase ends. Null for the 4th Pinnacle (lasts rest of life). */ endAge: number | null; /** * Meaning and interpretation for this Pinnacle number. */ meaning: { /** * Pinnacle phase title. */ title: string; /** * What this Pinnacle phase brings to your life. */ description: string; /** * Key opportunities during this phase. */ opportunities: Array; /** * Challenges to navigate during this phase. */ challenges: Array; }; }>; /** * Four Challenge numbers representing life obstacles aligned with Pinnacle timing. */ challenges: Array<{ /** * Challenge position (1-4). Four life obstacle periods. */ position: number; /** * Challenge number (0-8). Defines the obstacle of this period. */ number: number; /** * Age when this Challenge period begins. */ startAge: number; /** * Age when this period ends. Null for the 4th Challenge. */ endAge: number | null; /** * Meaning and resolution guidance for this Challenge number. */ meaning: { /** * Challenge title. */ title: string; /** * What this Challenge demands you overcome. */ description: string; /** * Core lesson to learn during this period. */ lesson: string; /** * Actionable guidance for working through this Challenge. */ howToOvercome: string; }; }>; /** * Hidden Passion number. The most frequent number in the name revealing an overwhelming drive or talent. */ hiddenPassion: { /** * Hidden Passion number (1-9). The most frequently occurring number in the birth name. */ number: number; /** * How many times this number appears in the name. */ count: number; /** * All numbers tied for highest frequency (usually one, sometimes multiple). */ allPassions: Array; /** * Archetype title for this Hidden Passion. */ title: string; /** * What this dominant number drive reveals about latent talents and obsessions. */ description: string; }; /** * Subconscious Self number. Reveals inner confidence and emergency response style. */ subconsciousSelf: { /** * Subconscious Self number (1-9). Count of unique numbers present in the name. */ number: number; /** * Which numbers (1-9) are present in the birth name. */ uniqueNumbers: Array; /** * Archetype title for this Subconscious Self level. */ title: string; /** * How you handle emergencies and unexpected challenges based on the breadth of numbers in your name. */ description: string; }; /** * Name letter analysis: Cornerstone, Capstone, and First Vowel. */ nameLetters: { /** * Cornerstone letter analysis. Reveals approach to new situations. */ cornerstone: { /** * First letter of the first name. */ letter: string; /** * Pythagorean number value of the Cornerstone letter. */ number: number; /** * How you approach new situations and initiate action. */ meaning: string; }; /** * Capstone letter analysis. Reveals completion and follow-through style. */ capstone: { /** * Last letter of the first name. */ letter: string; /** * Pythagorean number value of the Capstone letter. */ number: number; /** * How you complete tasks and handle endings. */ meaning: string; }; /** * First Vowel analysis. Reveals instinctive emotional reactions. */ firstVowel: { /** * First vowel in the full name (A, E, I, O, or U). */ letter: string; /** * Instinctive emotional response and inner reaction style. */ meaning: string; }; }; }; /** * Birth Day profile with day-specific meaning (1-31). Unlike the core Birth Day number, this provides unique interpretation per calendar day. */ birthDayProfile?: { /** * Calendar day of birth (1-31). */ day: number; /** * Single digit or master number this day reduces to. */ reducesTo: number; /** * Unique archetype title for this specific birth day. */ title: string; /** * Personality traits specific to this birth day. */ keywords: Array; /** * Detailed personality profile unique to this calendar day, not just the reduced digit. */ description: string; /** * Strengths specific to this birth day. */ strengths: Array; /** * Challenges specific to this birth day. */ challenges: Array; /** * Career guidance for this specific birth day. */ career: string; /** * Relationship dynamics for this birth day. */ relationships: string; }; /** * Maturity number activation status based on current age. */ maturityStatus: { /** * Whether the Maturity number is currently active (typically activates around age 35-40). */ isActive: boolean; /** * Current age calculated from the birth year. */ currentAge: number; /** * Age range when the Maturity number typically activates (35-40). */ activationRange: string; }; /** * Lucky associations based on Life Path number: colors, gemstones, day, element, planet, and compatibility. */ luckyAssociations?: { /** * Lucky colors associated with the Life Path number. */ colors: Array; /** * Lucky gemstones aligned to the ruling planet. */ gemstones: Array; /** * Lucky day of the week. */ day: string; /** * Classical element (Fire, Water, Earth, Air). */ element: string; /** * Ruling planet for this Life Path number. */ rulingPlanet: string; /** * Most compatible Life Path numbers. */ compatibleNumbers: Array; /** * Least compatible Life Path numbers. */ incompatibleNumbers: Array; }; /** * AI-ready holistic summary weaving all core numbers, karmic insights, and yearly forecast into a cohesive narrative. Ideal for generating personalized reports, chatbot responses, or one-page numerology overviews. */ summary: string; }; }; export type GenerateNumerologyChartResponse = GenerateNumerologyChartResponses[keyof GenerateNumerologyChartResponses]; export type GetNumberMeaningData = { body?: never; path: { /** * Numerology number (1-9, 11, 22, 33) */ number: string; }; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/numerology/meanings/{number}'; }; export type GetNumberMeaningErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Number meaning not found */ 404: { /** * Human-readable error message. The wording may change, so do not parse it programmatically. Switch on the stable code instead. */ error: string; /** * Machine-readable error code. Stable identifier for programmatic error handling. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself. The same URL in every environment, so it is safe to log, print in a CLI, or paste into a bug report. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetNumberMeaningError = GetNumberMeaningErrors[keyof GetNumberMeaningErrors]; export type GetNumberMeaningResponses = { /** * Successfully retrieved number meaning */ 200: { /** * Requested number */ number: number; /** * Number type */ type: 'single' | 'master'; meaning: { /** * Numerology archetype name. A single phrase capturing the core identity of this number, such as "The Leader" for 1 or "The Master Builder" for 22. */ title: string; /** * Ten defining personality traits and energetic themes. Useful for personality snapshots, compatibility matching, and building numerology profile summaries. */ keywords: Array; /** * Authoritative 300 to 500 word interpretation covering personality, life purpose, and core themes. Written by numerology experts and suitable for full-page readings. */ description: string; /** * Core strengths and positive qualities. Each entry pairs a trait name with a detailed explanation of how it manifests in real life. */ strengths: Array; /** * Growth areas and shadow qualities. Each entry explains the root cause, how it surfaces, and constructive strategies for working through it. */ challenges: Array; /** * Tailored career guidance with specific job titles, industries, and work environments. Explains why certain professional paths resonate with this number. */ career: string; /** * Love, friendship, and family dynamics. Covers romantic compatibility with other numbers, communication style, and the key relationship lessons. */ relationships: string; /** * Spiritual path, soul lessons, and recommended practices. Explores the deeper purpose behind this number and guidance for personal growth. */ spirituality: string; }; }; }; export type GetNumberMeaningResponse = GetNumberMeaningResponses[keyof GetNumberMeaningResponses]; export type GetDailyNumberData = { body?: { /** * Optional seed for reproducible readings. Same seed + same date = same number every time. Pass any unique identifier (userId, email hash, session token). Omit for anonymous daily readings. */ seed?: string; /** * Date for the reading in YYYY-MM-DD format. Defaults to today (UTC). Useful for viewing past daily readings or pre-generating future ones. */ date?: string; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/numerology/daily'; }; export type GetDailyNumberErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetDailyNumberError = GetDailyNumberErrors[keyof GetDailyNumberErrors]; export type GetDailyNumberResponses = { /** * Daily numerology number with full interpretation */ 200: { /** * Date this daily number is for (YYYY-MM-DD, UTC). */ date: string; /** * Computed seed used for this reading. Same seed always produces the same number. */ seed: string; /** * Daily numerology number (1-9, 11, 22, 33). Represents the dominant energy and theme for this day. */ number: number; /** * Whether this is a single-digit number (1-9) or a Master Number (11, 22, 33). Master Number days carry amplified spiritual significance. */ type: 'single' | 'master'; /** * Concise daily guidance message combining the number archetype with practical advice for the day. */ dailyMessage: string; meaning: { /** * Numerology archetype for this number. Captures the core energy of the day in a single phrase. */ title: string; /** * Defining traits and energetic themes active today. Useful for daily affirmations, journaling prompts, and focus areas. */ keywords: Array; /** * Expert-written 300 to 500 word interpretation of the daily energy. Covers personality resonance, life themes, and how this number influences the day. */ description: string; /** * Qualities that are amplified and accessible today. Lean into these for maximum alignment with the daily energy. */ strengths: Array; /** * Shadow patterns to watch for today. Awareness of these helps navigate the day with intention and balance. */ challenges: Array; /** * Professional guidance tuned to the daily energy. Suggests optimal work strategies, meeting approaches, and productivity focus areas. */ career: string; /** * Relationship dynamics influenced by the daily number. Covers communication style, social energy, and partnership awareness for the day. */ relationships: string; /** * Spiritual theme of the day. Suggests meditation focus, contemplative practices, and the deeper lesson available today. */ spirituality: string; }; }; }; export type GetDailyNumberResponse = GetDailyNumberResponses[keyof GetDailyNumberResponses]; export type CalculateChaldeanData = { body?: { /** * The name to analyze. Chaldean tradition uses the name a person is most known by, not necessarily the full legal birth name. */ name: string; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/numerology/chaldean'; }; export type CalculateChaldeanErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type CalculateChaldeanError = CalculateChaldeanErrors[keyof CalculateChaldeanErrors]; export type CalculateChaldeanResponses = { /** * Successfully calculated the Chaldean name reading */ 200: { /** * The name analyzed. */ name: string; /** * The Destiny or name number from all letters. The primary Chaldean number, revealing the overall direction encoded in the name. */ destiny: { /** * Raw sum of the Chaldean letter values before any reduction. */ total: number; /** * The interpretable compound number (10 to 52), the hidden influence behind the name, or null when the total resolves below 10. */ compound: number | null; /** * The single-digit root (1 to 9), the outward expression. Chaldean does not preserve master numbers. */ root: number; /** * Letter-by-letter Chaldean breakdown summed to the total, then to compound and root. */ calculation: string; /** * Cheiro compound-number interpretation when the aspect carries a compound layer. */ compoundMeaning: { /** * The compound number (10 to 52). */ number: number; /** * Classical symbolic title from Cheiro, or null when the number has no named symbol. */ name: string | null; /** * Overall tenor of the compound. "mixed" covers conditional numbers that are fortunate only alongside a favorable single number or in a specific domain. */ nature: 'fortunate' | 'unfortunate' | 'mixed'; /** * Cheiro interpretation of the hidden influence carried by this compound number. */ meaning: string; /** * For numbers 33 to 52, the lower compound in the same series whose meaning this number shares. */ sameAs?: number; } | null; }; /** * The Soul Urge number from the vowels, revealing inner desire. Root may be 0 when the name has no vowels. */ soulUrge: { /** * Raw sum of the Chaldean letter values before any reduction. */ total: number; /** * The interpretable compound number (10 to 52), the hidden influence behind the name, or null when the total resolves below 10. */ compound: number | null; /** * The single-digit root (1 to 9), the outward expression. Chaldean does not preserve master numbers. */ root: number; /** * Letter-by-letter Chaldean breakdown summed to the total, then to compound and root. */ calculation: string; /** * Cheiro compound-number interpretation when the aspect carries a compound layer. */ compoundMeaning: { /** * The compound number (10 to 52). */ number: number; /** * Classical symbolic title from Cheiro, or null when the number has no named symbol. */ name: string | null; /** * Overall tenor of the compound. "mixed" covers conditional numbers that are fortunate only alongside a favorable single number or in a specific domain. */ nature: 'fortunate' | 'unfortunate' | 'mixed'; /** * Cheiro interpretation of the hidden influence carried by this compound number. */ meaning: string; /** * For numbers 33 to 52, the lower compound in the same series whose meaning this number shares. */ sameAs?: number; } | null; }; /** * The Personality number from the consonants, revealing the outer impression. Root may be 0 when the name has no consonants. */ personality: { /** * Raw sum of the Chaldean letter values before any reduction. */ total: number; /** * The interpretable compound number (10 to 52), the hidden influence behind the name, or null when the total resolves below 10. */ compound: number | null; /** * The single-digit root (1 to 9), the outward expression. Chaldean does not preserve master numbers. */ root: number; /** * Letter-by-letter Chaldean breakdown summed to the total, then to compound and root. */ calculation: string; /** * Cheiro compound-number interpretation when the aspect carries a compound layer. */ compoundMeaning: { /** * The compound number (10 to 52). */ number: number; /** * Classical symbolic title from Cheiro, or null when the number has no named symbol. */ name: string | null; /** * Overall tenor of the compound. "mixed" covers conditional numbers that are fortunate only alongside a favorable single number or in a specific domain. */ nature: 'fortunate' | 'unfortunate' | 'mixed'; /** * Cheiro interpretation of the hidden influence carried by this compound number. */ meaning: string; /** * For numbers 33 to 52, the lower compound in the same series whose meaning this number shares. */ sameAs?: number; } | null; }; numberMeaning: { /** * The Destiny root (1 to 9). */ number: number; /** * Ruling planet. */ planet: string; /** * Archetype of the root number. */ title: string; /** * Core themes of the Destiny root. */ keywords: Array; /** * True for roots 4 and 8, the two numbers Cheiro counsels caution with. */ caution: boolean; /** * Planetary interpretation of the Destiny root number. */ meaning: string; }; /** * True when the Destiny root is 4 or 8, the karmic numbers Cheiro advises adjusting a name away from for material success. */ caution: boolean; /** * One-line plain-language summary of the Chaldean reading. */ summary: string; }; }; export type CalculateChaldeanResponse = CalculateChaldeanResponses[keyof CalculateChaldeanResponses]; export type GetCompoundNumberData = { body?: never; path: { /** * Compound number from 10 to 52. */ number: string; }; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/numerology/compound-number/{number}'; }; export type GetCompoundNumberErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetCompoundNumberError = GetCompoundNumberErrors[keyof GetCompoundNumberErrors]; export type GetCompoundNumberResponses = { /** * Successfully retrieved the compound number meaning */ 200: { /** * The compound number (10 to 52). */ number: number; /** * Classical symbolic title from Cheiro, or null when none is given. */ name: string | null; /** * Overall tenor of the number. "mixed" marks conditional numbers, fortunate only with a favorable single number or in one domain. */ nature: 'fortunate' | 'unfortunate' | 'mixed'; /** * Cheiro interpretation of the hidden influence carried by this compound number. */ meaning: string; /** * The single-digit root the compound reduces to (1 to 9). */ root: number; /** * For numbers 33 to 52, the lower compound in the same series whose meaning this number shares. */ sameAs?: number; }; }; export type GetCompoundNumberResponse = GetCompoundNumberResponses[keyof GetCompoundNumberResponses]; export type CalculateDualData = { body?: { /** * The name to analyze in both systems. */ name: string; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/numerology/dual'; }; export type CalculateDualErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type CalculateDualError = CalculateDualErrors[keyof CalculateDualErrors]; export type CalculateDualResponses = { /** * Successfully calculated the name in both numerology systems */ 200: { /** * The name analyzed. */ name: string; pythagorean: { /** * Pythagorean Expression number (1 to 9, 11, 22, 33). */ number: number; /** * Single digit or preserved master number. */ type: 'single' | 'master'; /** * Pythagorean letter breakdown and reduction. */ calculation: string; /** * Archetype of the number. */ title: string; /** * Core themes in the Pythagorean reading. */ keywords: Array; }; chaldean: { /** * Chaldean compound number (10 to 52), the hidden influence, or null. */ compound: number | null; /** * Chaldean root (1 to 9). */ root: number; /** * Raw Chaldean letter total. */ total: number; /** * Chaldean letter breakdown to compound and root. */ calculation: string; /** * Planetary ruler of the Chaldean root. */ planet: string; /** * Archetype of the Chaldean root. */ title: string; /** * True when the Chaldean root is 4 or 8, the numbers of caution. */ caution: boolean; /** * Cheiro compound interpretation when present. */ compoundMeaning: { /** * The compound number. */ number: number; /** * Symbolic title. */ name: string | null; /** * Tenor of the compound. */ nature: 'fortunate' | 'unfortunate' | 'mixed'; /** * Cheiro interpretation. */ meaning: string; /** * Series equivalent for 33 to 52. */ sameAs?: number; } | null; }; /** * True when both systems reduce to the same single-digit energy (Pythagorean number reduced to one digit equals the Chaldean root). Agreement is read as a name whose vibrations are in harmony. */ agreement: boolean; /** * Plain-language comparison of the two systems for this name. */ note: string; }; }; export type CalculateDualResponse = CalculateDualResponses[keyof CalculateDualResponses]; export type CalculateBusinessNameData = { body?: { /** * The business or brand name to evaluate. */ name: string; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/numerology/business-name'; }; export type CalculateBusinessNameErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type CalculateBusinessNameError = CalculateBusinessNameErrors[keyof CalculateBusinessNameErrors]; export type CalculateBusinessNameResponses = { /** * Successfully analyzed the business name */ 200: { /** * The business name analyzed. */ name: string; /** * Raw Chaldean letter total of the name. */ total: number; /** * Chaldean compound number (10 to 52), the hidden influence, or null. */ compound: number | null; /** * Single-digit business root (1 to 9), the outward commercial expression. */ root: number; /** * Planetary ruler of the business root. */ planet: string; /** * Overall favorability of the root for business. excellent and good are growth-friendly; caution (7, 8) and avoid (4) flag the demanding and unstable roots. */ rating: 'excellent' | 'good' | 'caution' | 'avoid'; /** * True when the compound number is one of Cheiro fortunate compounds, an extra positive signal layered over the root rating. */ favorableCompound: boolean; /** * Industries the business root favors. */ industries: Array; /** * Plain-language guidance for using this number as a brand. */ guidance: string; /** * Chaldean letter breakdown of the business name. */ calculation: string; /** * Cheiro compound interpretation when present. */ compoundMeaning: { /** * The compound number. */ number: number; /** * Symbolic title, if any. */ name: string | null; /** * Tenor of the compound. */ nature: 'fortunate' | 'unfortunate' | 'mixed'; /** * Cheiro interpretation. */ meaning: string; /** * Series equivalent for 33 to 52. */ sameAs?: number; } | null; /** * One-line plain-language verdict for the business name. */ summary: string; }; }; export type CalculateBusinessNameResponse = CalculateBusinessNameResponses[keyof CalculateBusinessNameResponses]; export type CalculateGematriaData = { /** * What to score and how. Send text for a Latin input or textHebrew for a Hebrew one, never both: which one you send decides whether a transliteration step runs at all. Every other field has a default. */ body: { /** * Latin text to write in Hebrew and then score, up to 200 characters. Non Latin scripts are folded to Latin first, so a Cyrillic or Devanagari name works. Send textHebrew instead to control the Hebrew spelling yourself. */ text?: string; /** * Hebrew text to score, up to 200 characters. Anything outside the Hebrew script is rejected. Vowel points, cantillation marks, maqaf and paseq are removed before scoring, so a pointed and an unpointed spelling of one word give the same number. */ textHebrew?: string; /** * How a Latin name is written in Hebrew before it is scored. Two members. letter-map-mathers is the 1887 Hermetic letter map, with e read as its author practised it: a point inside a word and alef at the start of one. It writes no c, f, w or x, so a name carrying one of them outside a two letter group returns 400 naming the letter. letter-map-modern follows the modern Israeli transcription rules for the sound each Latin letter carries in English and French spelling, covers every Latin letter, drops the geresh and does not double vav or yod, so send textHebrew for the ktiv male form. Every form states the readings it used in rule. Phonetic Ashkenazi and Sephardi schemes are not offered because no two references agree on a rule for that direction. */ transliteration?: 'letter-map-mathers' | 'letter-map-modern'; /** * Which ciphers to return, by identifier. Omit for every computed cipher. Valid values are mispar-hechrachi, mispar-gadol, otiyot-be-milui, mispar-katan, mispar-kidmi, mispar-prati, mispar-ha-merubah-ha-klali, mispar-meshulash, mispar-musafi, kolel. */ ciphers?: Array<'mispar-hechrachi' | 'mispar-gadol' | 'otiyot-be-milui' | 'mispar-katan' | 'mispar-kidmi' | 'mispar-prati' | 'mispar-ha-merubah-ha-klali' | 'mispar-meshulash' | 'mispar-musafi' | 'kolel'>; /** * Which method the name mispar gadol means, because the sources use it for two. Use finals-500-900 to score the five word final letters as 500 to 900, or milui to score each letter as the value of its own spelled out name. */ misparGadol?: 'finals-500-900' | 'milui'; /** * What AtBash and Albam return: the substituted Hebrew string, its standard value, or both. The biblical witness for AtBash is a substituted WORD rather than a number, which is why the string is available on its own. */ atbashOutput?: 'both' | 'string' | 'value'; /** * Whether to return the curated equal value entries for the chosen spelling. Set false to skip the lookup when only the numbers are wanted. */ includeMatches?: boolean; /** * Whether to also score the Latin text with the three Latin alphabet ciphers. They are Renaissance Christian and modern in lineage rather than rabbinic, and the response labels each one. Ignored when textHebrew was sent. */ latinCiphers?: boolean; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/kabbalah/gematria'; }; export type CalculateGematriaErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type CalculateGematriaError = CalculateGematriaErrors[keyof CalculateGematriaErrors]; export type CalculateGematriaResponses = { /** * Every candidate spelling with its values, the chosen one, and the matches. */ 200: { input: { /** * Echo of the Latin text sent. Absent when Hebrew was sent instead. */ text?: string; /** * Echo of the Hebrew text sent. Absent when Latin was sent instead. */ textHebrew?: string; }; /** * Every Hebrew spelling the input can be written as, greedy parse first. One entry when Hebrew was sent, since there is nothing to choose. */ hebrewForms: Array<{ /** * One Hebrew spelling the Latin input can be written as. Data, identical in every language. */ hebrew: string; /** * Latin transcription of the Hebrew beside it, produced by one mechanical letter map. It is a label for reading the string back, never a pronunciation claim. */ romanization: string; /** * Why this spelling came out of the map: the parse rule first, then one sentence for every reading the scheme applied that the letters alone would not show, so a caller can tell the parses apart. */ rule: string; /** * Every computed cipher applied to this spelling, in catalogue order. The rows carry no display name, because they are the same ciphers in the same order for every spelling: read the names off the top level values array once. */ values: Array<{ /** * Machine identifier of the cipher. Call the ciphers endpoint for the definition, the tradition and the sources behind each one. */ id: string; /** * The number this cipher gives for the string. Always a number: the one catalogued cipher this API does not compute is absent from this array rather than present without a value, so no row here has to be guarded. Its catalogue entry carries computed false and says why. */ value: number; /** * Other published totals for the same string, ascending. Present only where the cipher is not single valued: letter names have several accepted spellings, so several totals are equally published. Absent otherwise, so a caller can branch on presence. */ alternateValues?: Array; /** * Provenance class of the cipher, one of rabbinic, renaissance-latin, golden-dawn-transliterated or modern. Always English, so it stays safe to compare against in code. */ tradition: string; /** * The first published source this cipher was taken from. */ source: string; }>; /** * The per letter breakdown of this spelling under the standard reading. */ letters: Array<{ /** * The Hebrew letter as it stands in the string. Data, identical in every language. */ glyph: string; /** * Machine identifier of the letter, always English romanization so it stays safe to compare against in code. */ letterId: string; /** * Display name of the letter, in the requested language. Branch on letterId, never on this. */ name: string; /** * True when the glyph is the word final form. Under the finals-500-900 reading the same letter scores differently in final position, which is why this is on the row. */ isFinal: boolean; /** * What this letter contributed under the standard reading, or under the finals reading when one applies. */ value: number; }>; }>; chosen: { /** * The spelling the values and matches on this response were taken from. */ hebrew: string; /** * Why this spelling was chosen over the others. */ rule: string; }; /** * Every requested cipher applied to the chosen spelling, in catalogue order, each named as the catalogue names it. Only computed ciphers appear, so every row carries a number. */ values: Array<{ /** * Machine identifier of the cipher. Call the ciphers endpoint for the definition, the tradition and the sources behind each one. */ id: string; /** * The number this cipher gives for the string. Always a number: the one catalogued cipher this API does not compute is absent from this array rather than present without a value, so no row here has to be guarded. Its catalogue entry carries computed false and says why. */ value: number; /** * Other published totals for the same string, ascending. Present only where the cipher is not single valued: letter names have several accepted spellings, so several totals are equally published. Absent otherwise, so a caller can branch on presence. */ alternateValues?: Array; /** * Provenance class of the cipher, one of rabbinic, renaissance-latin, golden-dawn-transliterated or modern. Always English, so it stays safe to compare against in code. */ tradition: string; /** * The first published source this cipher was taken from. */ source: string; /** * Display name of the cipher in the requested language, the same string the ciphers catalogue serves for this id. Present so a caller holding one response can label a row without humanizing the identifier or fetching the catalogue. Switch on id, never on this. */ name: string; }>; /** * The two substitution transformations applied to the chosen spelling. Each exchanges letters and returns a new word, so the interesting output is often the string rather than the number. */ transformations: Array<{ /** * Machine identifier of the transformation. */ id: string; /** * Display name of the transformation as the catalogue names it, in the requested language. */ name: string; /** * The substituted Hebrew string. Absent when atbashOutput asked for the value alone. */ output?: string; /** * Latin transcription of the substituted string, from the same mechanical letter map. */ outputRomanization?: string; /** * Standard value of the substituted string. Absent when atbashOutput asked for the string alone. */ value?: number; /** * Provenance class of the transformation. */ tradition: string; /** * The first published source the substitution table was taken from. */ source: string; }>; /** * The Latin alphabet ciphers applied to the Latin text. Present only when latinCiphers was set and a Latin text was sent. */ latinValues?: Array<{ /** * Machine identifier of the Latin cipher. */ id: string; /** * The number this cipher gives for the Latin text as sent. */ value: number; /** * Provenance class. None of these is rabbinic, whatever a consumer calculator calls them. */ tradition: string; /** * Where the cipher comes from, stated so it cannot be misattributed. */ lineage: string; }>; /** * Curated words whose standard value equals the chosen spelling. Matching is on the standard reading only, because that is the relation the classical method works with. Empty when nothing matches, which is the ordinary case. */ matches: Array<{ /** * Machine identifier of the entry, an ASCII romanization. */ id: string; /** * The word in Hebrew. Data, identical in every language. */ hebrew: string; /** * Latin transcription of the Hebrew beside it, from the same mechanical letter map. */ romanization: string; /** * What the word means, in the requested language. */ meaning: string; /** * Its value under the standard reading, which is why it matched. */ value: number; /** * What the tradition says about the equality, in the requested language. */ note: string; /** * Where the value is attested. Every entry in the lexicon carries at least two independent sources, which is why the list is short rather than long. */ sources: Array; }>; conventions: { /** * The Latin to Hebrew scheme applied. Absent when the caller sent Hebrew directly. */ transliteration?: string; /** * Which of the two published methods the name mispar gadol was read as. */ misparGadol: string; /** * What the substitution transformations returned. */ atbashOutput: string; }; }; }; export type CalculateGematriaResponse = CalculateGematriaResponses[keyof CalculateGematriaResponses]; export type ListGematriaCiphersData = { body?: never; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/kabbalah/ciphers'; }; export type ListGematriaCiphersErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type ListGematriaCiphersError = ListGematriaCiphersErrors[keyof ListGematriaCiphersErrors]; export type ListGematriaCiphersResponses = { /** * The cipher catalogue, split by kind. */ 200: { /** * Number of entries across all three lists. */ total: number; /** * The rabbinic ciphers. Each returns a number from the letters of a Hebrew string. */ ciphers: Array<{ /** * Machine identifier of the cipher, always English romanization so it stays safe to compare against in code. Pass it in the ciphers array on the gematria endpoint. */ id: string; /** * Display name of the cipher, in the requested language. */ name: string; /** * Provenance class, one of rabbinic, renaissance-latin, golden-dawn-transliterated or modern. Always English. Read it before presenting a cipher as Jewish practice, because three of the ones here are not. */ tradition: string; /** * The century the tradition this method belongs to is attested in, not a first publication date for the named variety. */ century: string; /** * How the cipher turns letters into a number, in the requested language. */ definition: string; /** * Whether the gematria endpoint returns a number for this cipher. False on the one method whose table is not published in two independent sources, which is stated rather than silently omitted. */ computed: boolean; /** * Present and true where one spelling has several equally published totals. Absent otherwise, so a caller can branch on presence. */ multiValued?: boolean; /** * Where the definition is published. Every cipher here carries at least two independent sources, which is why the catalogue is shorter than the ones that advertise a cipher count. */ sources: Array; }>; /** * The rabbinic substitution transformations. Each exchanges letters for other letters and returns a WORD, whose value is then read the ordinary way. */ transformations: Array<{ /** * Machine identifier of the cipher, always English romanization so it stays safe to compare against in code. Pass it in the ciphers array on the gematria endpoint. */ id: string; /** * Display name of the cipher, in the requested language. */ name: string; /** * Provenance class, one of rabbinic, renaissance-latin, golden-dawn-transliterated or modern. Always English. Read it before presenting a cipher as Jewish practice, because three of the ones here are not. */ tradition: string; /** * The century the tradition this method belongs to is attested in, not a first publication date for the named variety. */ century: string; /** * How the cipher turns letters into a number, in the requested language. */ definition: string; /** * Whether the gematria endpoint returns a number for this cipher. False on the one method whose table is not published in two independent sources, which is stated rather than silently omitted. */ computed: boolean; /** * Present and true where one spelling has several equally published totals. Absent otherwise, so a caller can branch on presence. */ multiValued?: boolean; /** * Where the definition is published. Every cipher here carries at least two independent sources, which is why the catalogue is shorter than the ones that advertise a cipher count. */ sources: Array; }>; /** * The Latin alphabet ciphers, scored on Latin letters directly. None is rabbinic and each carries the lineage that says so. */ latinCiphers: Array<{ /** * Machine identifier of the cipher, always English romanization so it stays safe to compare against in code. Pass it in the ciphers array on the gematria endpoint. */ id: string; /** * Display name of the cipher, in the requested language. */ name: string; /** * Provenance class, one of rabbinic, renaissance-latin, golden-dawn-transliterated or modern. Always English. Read it before presenting a cipher as Jewish practice, because three of the ones here are not. */ tradition: string; /** * The century the tradition this method belongs to is attested in, not a first publication date for the named variety. */ century: string; /** * How the cipher turns letters into a number, in the requested language. */ definition: string; /** * Whether the gematria endpoint returns a number for this cipher. False on the one method whose table is not published in two independent sources, which is stated rather than silently omitted. */ computed: boolean; /** * Present and true where one spelling has several equally published totals. Absent otherwise, so a caller can branch on presence. */ multiValued?: boolean; /** * Where the definition is published. Every cipher here carries at least two independent sources, which is why the catalogue is shorter than the ones that advertise a cipher count. */ sources: Array; }>; }; }; export type ListGematriaCiphersResponse = ListGematriaCiphersResponses[keyof ListGematriaCiphersResponses]; export type GenerateNameProfileData = { /** * The name to profile. Send name for a Latin input or nameHebrew for a Hebrew one, never both: which one you send decides whether a transliteration step runs at all. */ body: { /** * The name in Latin script, to be written in Hebrew and then scored. Non Latin scripts are folded to Latin first. Send nameHebrew instead to control the spelling yourself. */ name?: string; /** * The name already in Hebrew, which skips the transliteration step entirely and scores exactly the spelling you sent. */ nameHebrew?: string; /** * How a Latin name is written in Hebrew before it is scored. Two members. letter-map-mathers is the 1887 Hermetic letter map, with e read as its author practised it: a point inside a word and alef at the start of one. It writes no c, f, w or x, so a name carrying one of them outside a two letter group returns 400 naming the letter. letter-map-modern follows the modern Israeli transcription rules for the sound each Latin letter carries in English and French spelling, covers every Latin letter, drops the geresh and does not double vav or yod, so send textHebrew for the ktiv male form. Every form states the readings it used in rule. Phonetic Ashkenazi and Sephardi schemes are not offered because no two references agree on a rule for that direction. */ transliteration?: 'letter-map-mathers' | 'letter-map-modern'; /** * Which method the name mispar gadol means, because the sources use it for two. Use finals-500-900 to score the five word final letters as 500 to 900, or milui to score each letter as the value of its own spelled out name. */ misparGadol?: 'finals-500-900' | 'milui'; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/kabbalah/name-profile'; }; export type GenerateNameProfileErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GenerateNameProfileError = GenerateNameProfileErrors[keyof GenerateNameProfileErrors]; export type GenerateNameProfileResponses = { /** * The name profile. */ 200: { input: { /** * Echo of the Latin name sent. Absent when Hebrew was sent instead. */ name?: string; /** * Echo of the Hebrew name sent. Absent when Latin was sent instead. */ nameHebrew?: string; }; /** * Every Hebrew spelling the name can be written as, greedy parse first. One entry when Hebrew was sent, since there is nothing to choose. */ hebrewForms: Array<{ /** * One Hebrew spelling the Latin input can be written as. Data, identical in every language. */ hebrew: string; /** * Latin transcription of the Hebrew beside it, produced by one mechanical letter map. It is a label for reading the string back, never a pronunciation claim. */ romanization: string; /** * Why this spelling came out of the map: the parse rule first, then one sentence for every reading the scheme applied that the letters alone would not show, so a caller can tell the parses apart. */ rule: string; /** * Every computed cipher applied to this spelling, in catalogue order. The rows carry no display name, because they are the same ciphers in the same order for every spelling: read the names off the top level values array once. */ values: Array<{ /** * Machine identifier of the cipher. Call the ciphers endpoint for the definition, the tradition and the sources behind each one. */ id: string; /** * The number this cipher gives for the string. Always a number: the one catalogued cipher this API does not compute is absent from this array rather than present without a value, so no row here has to be guarded. Its catalogue entry carries computed false and says why. */ value: number; /** * Other published totals for the same string, ascending. Present only where the cipher is not single valued: letter names have several accepted spellings, so several totals are equally published. Absent otherwise, so a caller can branch on presence. */ alternateValues?: Array; /** * Provenance class of the cipher, one of rabbinic, renaissance-latin, golden-dawn-transliterated or modern. Always English, so it stays safe to compare against in code. */ tradition: string; /** * The first published source this cipher was taken from. */ source: string; }>; /** * The per letter breakdown of this spelling under the standard reading. */ letters: Array<{ /** * The Hebrew letter as it stands in the string. Data, identical in every language. */ glyph: string; /** * Machine identifier of the letter, always English romanization so it stays safe to compare against in code. */ letterId: string; /** * Display name of the letter, in the requested language. Branch on letterId, never on this. */ name: string; /** * True when the glyph is the word final form. Under the finals-500-900 reading the same letter scores differently in final position, which is why this is on the row. */ isFinal: boolean; /** * What this letter contributed under the standard reading, or under the finals reading when one applies. */ value: number; }>; }>; chosen: { /** * The spelling the rest of this response was computed from. */ hebrew: string; /** * Latin transcription of the chosen spelling, from the mechanical map. */ romanization: string; /** * Why this spelling was chosen over the others. */ rule: string; }; /** * The four readings a name profile leads with. Call the gematria endpoint for the full set and for the substitution transformations. */ values: { /** * Mispar hechrachi, the standard reading, where every letter takes its ordinary value and a final form scores as its base letter. */ standard: number; /** * Mispar gadol under the reading the misparGadol convention selected, which is why the convention comes back on the response. */ large: number; /** * Mispar katan, where each letter value has its trailing zeros truncated, so yod is 1 and qof is 1. */ small: number; /** * Mispar kidmi, where each letter scores the sum of every standard value up to and including itself, so tav is 1495. */ preceding: number; }; /** * The per letter breakdown of the chosen spelling. */ letters: Array<{ /** * The letter as it stands in the chosen spelling. */ glyph: string; /** * Machine identifier of the letter. */ letterId: string; /** * Display name of the letter. */ name: string; /** * True when the glyph is the word final form. */ isFinal: boolean; /** * What this letter contributed. */ value: number; }>; /** * Where the name lands on the tree. The reduction is a numerical convention, not a rule from any text, and the reading says so. */ sephirah: { /** * Machine identifier of the sephirah the reduced value points at. */ id: string; /** * Its position in the emanation, 1 to 10. */ number: number | null; /** * The English gloss of the name, in the requested language. */ english: string; /** * The name in Hebrew. Data, identical in every language. */ hebrew: string; /** * The standard value reduced by repeated digit sum, stopping at ten so all ten emanations stay reachable. */ reduced: number; /** * What the emanation is said to hold, in the requested language. */ meaning: string; /** * The composed sentence that places the name on the tree, in the requested language. It states plainly that the reduction is a numerical convention rather than a classical rule. */ reading: string; }; /** * Curated words whose standard value equals the name. Empty when nothing matches, which is the ordinary case. */ matches: Array<{ /** * Machine identifier of the entry, an ASCII romanization. */ id: string; /** * The word in Hebrew. Data, identical in every language. */ hebrew: string; /** * Latin transcription of the Hebrew beside it, from the same mechanical letter map. */ romanization: string; /** * What the word means, in the requested language. */ meaning: string; /** * Its value under the standard reading, which is why it matched. */ value: number; /** * What the tradition says about the equality, in the requested language. */ note: string; /** * Where the value is attested. Every entry in the lexicon carries at least two independent sources, which is why the list is short rather than long. */ sources: Array; }>; conventions: { /** * The Latin to Hebrew scheme applied. Absent when the caller sent Hebrew directly. */ transliteration?: string; /** * Which of the two published methods the name mispar gadol was read as. */ misparGadol: string; }; }; }; export type GenerateNameProfileResponse = GenerateNameProfileResponses[keyof GenerateNameProfileResponses]; export type GenerateBirthProfileData = { body: { /** * Birth date in YYYY-MM-DD, proleptic Gregorian. Dates before the 1582 reform are read on the same proleptic reckoning rather than switched to the Julian calendar. */ date: string; /** * Birth time in HH:MM:SS local to the timezone field. Defaults to noon when omitted, which is stated because the name read from the hour changes every twenty minutes and a defaulted time cannot be precise. */ time?: string; /** * IANA name (e.g. "America/New_York", "Europe/London", "UTC"), decimal hours (e.g. -5 for EST, 1 for CET), or a fixed UTC offset (e.g. "-05:00", "+01:00"). Prefer the IANA name: it is resolved to the offset in force at the birth date and time, historical daylight-saving rules included, while a fixed offset or decimal is taken literally and will be wrong if it does not match the daylight-saving state at that moment. On a transition day a time in the repeated hour is read as its first occurrence and a time in the skipped hour is moved forward past the gap. Invalid timezones return 400 with a validation error. */ timezone: number | string; /** * How the name of the day is found. Use solar-longitude for the exact five degree arc the Sun stood in at the birth moment, or lenain-blocks for the fixed civil calendar of five day periods. The Sun does not move at a constant rate, so the two drift apart by up to about three days by early August and were never reconciled. */ angelDating?: 'solar-longitude' | 'lenain-blocks'; /** * Which date the civil wheel of five day periods opens on. Both are conventions rather than facts: the equinox itself moves inside a window that covers both days, and it fell on 20 March in 2026. march-21 is the pinned published wheel and march-20 is that wheel shifted one day. Ignored when angelDating is solar-longitude. */ yearStart?: 'march-21' | 'march-20'; /** * Where 29 February falls. The civil wheel was built for a 365 day year and has no slot for it, so published tables differ: extend-previous reads the day as part of the period ending 28 February, next-angel reads it as the opening of the period starting 1 March. Ignored when angelDating is solar-longitude. */ leapDayPolicy?: 'extend-previous' | 'next-angel'; /** * Set true when the moment falls after nightfall, which advances the Hebrew date by one day because the Hebrew day begins in the evening. It is a caller assertion rather than a computation, since sunset depends on a place and this conversion takes none. */ afterSunset?: boolean; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/kabbalah/birth-profile'; }; export type GenerateBirthProfileErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GenerateBirthProfileError = GenerateBirthProfileErrors[keyof GenerateBirthProfileErrors]; export type GenerateBirthProfileResponses = { /** * The Hebrew date, the birthday, the three names and the sephirah. */ 200: { /** * The birth moment this answer was computed from. */ birthData: { /** * Echo of the birth date. */ date: string; /** * The birth time used, which is noon when none was sent. */ time: string; /** * The timezone resolved to a decimal offset in hours. An IANA name sent on the request is resolved against the birth date, so a summer birth carries its summer offset. */ timezone: number; }; /** * The Hebrew date of the birth. */ hebrewDate: { /** * Hebrew year. */ year: number; /** * Hebrew month name. A leap year carries Adar I and Adar II in place of Adar, which is why the name is returned rather than only a number. */ month: string; /** * Month number in the published algorithm order, Nisan first. Adar II is 13. */ monthNumber: number; /** * Day of the Hebrew month, 1 to 30. */ day: number; /** * True in the seven years of each nineteen that carry a second Adar. */ leapYear: boolean; /** * The date written the way it is printed, with the day and the year in Hebrew letters. Data, identical in every language. */ hebrew: string; /** * Echo of the sunset flag. The Hebrew day begins in the evening, so a moment after nightfall already belongs to the next date and this says whether that was applied. */ afterSunset: boolean; }; /** * The next Hebrew birthday. Three Hebrew dates are missing from some years, and where the anniversary moves to is a matter of community practice rather than arithmetic, so the field is null with a note rather than a guess. */ hebrewBirthday: { /** * The next Gregorian date the Hebrew birthday falls on, or null when that Hebrew date does not exist in the year it would fall in. */ date: string | null; /** * The Hebrew year the anniversary was looked for in. */ hebrewYear: number; /** * Present only when the date is null, saying why. Absent otherwise, so a caller can branch on presence. */ note?: string; }; /** * The three names: two read from the day of birth by two different cycles, and one from the hour. All three are described, never invoked. */ angels: Array<{ /** * What this name is read from: body and character both come from the day of birth by two different cycles, and spirit comes from the hour. Always English, so it stays safe to compare against in code. */ role: string; /** * Index of the name, 1 to 72. */ number: number; /** * The name in Hebrew. Data, identical in every language. */ name: string; /** * Latin transcription of the Hebrew, from the one mechanical letter map. */ romanization: string; /** * The Latin spelling the published tables print, which is the searchable name. */ traditionalName: string; /** * The angelic choir the name belongs to under the published Renaissance table. */ choir: string; /** * The window that selected this name, in the terms of its own cycle: an arc of longitude, a span of civil days, or a twenty minute interval of the clock. */ window: string; /** * What the tradition says this name is read for, in the requested language. */ reading: string; }>; /** * The sephirah reached from the value of the Hebrew date written in letters. A numerical convention rather than a classical rule, offered as a way into the tree. */ sephirah: { /** * Machine identifier of the sephirah of the birth day. */ id: string; /** * Its position in the emanation, 1 to 10. */ number: number | null; /** * The English gloss of the name, in the requested language. */ english: string; /** * The name in Hebrew. Data, identical in every language. */ hebrew: string; /** * Latin transcription of the Hebrew, from the mechanical letter map. */ romanization: string; /** * What the emanation is said to hold, in the requested language. */ meaning: string; }; /** * The conventions this answer was computed under, echoed so it can be reproduced. */ conventions: { /** * Which construction dated the name of the day. */ angelDating: string; /** * Where the civil wheel opened. Reported even under solar-longitude, where it selects nothing, so a stored response records every input. */ yearStart: string; /** * Where 29 February was read as falling. */ leapDayPolicy: string; /** * Whether the Hebrew date was advanced for nightfall. */ afterSunset: boolean; }; }; }; export type GenerateBirthProfileResponse = GenerateBirthProfileResponses[keyof GenerateBirthProfileResponses]; export type ListShemNamesData = { body?: never; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; /** * Maximum items to return per page. Range: 1-72, default 20. */ limit?: number; /** * Number of items to skip for pagination. Default 0. */ offset?: number; /** * Ecliptic longitude in degrees, 0 inclusive to 360 exclusive, measured from 0 Aries. Returns the single name governing that degree instead of the list. 360 is rejected because it is the same point as 0 and the arcs are half open at the top. */ longitude?: number; }; url: '/kabbalah/names'; }; export type ListShemNamesErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type ListShemNamesError = ListShemNamesErrors[keyof ListShemNamesErrors]; export type ListShemNamesResponses = { /** * The names, or the one name governing the requested longitude. */ 200: { /** * Number of names matching the request before paging, which is 72 for the list and 1 for a longitude lookup. */ total: number; /** * How many rows this page carries at most. */ limit: number; /** * How many rows were skipped before this page. */ offset: number; /** * Echo of the longitude looked up. Absent when the whole list was requested. */ longitude?: number; names: Array<{ /** * Index of the name, 1 to 72. The index is the identifier here, because the Latin spellings differ between published tables while the index never does. */ number: number; /** * The three letters read out of the verses, with any word final form written as its base letter, which is how every published list prints them. */ letters: string; /** * The three letters exactly as they stand in the verses. Eighteen of the seventy two pick up a word final form because the source letter falls at a word end, and keeping this beside the normalized form is what makes the rule auditable. */ lettersAsWritten: string; /** * The divine name suffix added to make the triplet pronounceable. Forty of the seventy two take one and thirty two take the other. */ suffix: string; /** * The suffixed name in Hebrew. Data, identical in every language. */ name: string; /** * Latin transcription of the Hebrew, from the one mechanical letter map. A label for reading the string back, and NOT the spelling the published tables print, which is in traditionalName. */ romanization: string; /** * The Latin spelling the published tables print. This is the search term a reader knows the name by. Several rows have two attested spellings across tables and the one used here is stated on the methodology page. */ traditionalName: string; /** * First degree of the ecliptic arc this name governs, measured from 0 Aries. Inclusive. */ arcStart: number; /** * Last degree of the arc, EXCLUSIVE. Seventy two arcs of five degrees tile the circle exactly, which only works if the upper bound is exclusive. */ arcEnd: number; /** * Which sign the arc falls in. Always English lowercase, so it stays safe to compare against in code. Six names fall in each sign. */ sign: string; /** * Where the arc opens inside its sign, 0 to 25 in steps of five. */ degreeInSign: number; /** * The angelic choir this name belongs to under the published Renaissance table. Nine choirs of exactly eight names each. */ choir: string; /** * Present only on the rows where a named published list differs from the derivation. Recorded rather than silently corrected, because a reader comparing two sources deserves to know which one moved. Absent on every other row, so a caller can branch on presence. */ publishedDisagreement?: { /** * Which published list prints something different on this row. */ list: string; /** * What that list prints, so a caller matching against it can see why. */ prints: string; }; }>; }; }; export type ListShemNamesResponse = ListShemNamesResponses[keyof ListShemNamesResponses]; export type GetShemNameData = { body?: never; path: { /** * Index of the name, 1 to 72. */ number: number; }; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/kabbalah/names/{number}'; }; export type GetShemNameErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetShemNameError = GetShemNameErrors[keyof GetShemNameErrors]; export type GetShemNameResponses = { /** * The name. */ 200: { /** * Index of the name, 1 to 72. The index is the identifier here, because the Latin spellings differ between published tables while the index never does. */ number: number; /** * The three letters read out of the verses, with any word final form written as its base letter, which is how every published list prints them. */ letters: string; /** * The three letters exactly as they stand in the verses. Eighteen of the seventy two pick up a word final form because the source letter falls at a word end, and keeping this beside the normalized form is what makes the rule auditable. */ lettersAsWritten: string; /** * The divine name suffix added to make the triplet pronounceable. Forty of the seventy two take one and thirty two take the other. */ suffix: string; /** * The suffixed name in Hebrew. Data, identical in every language. */ name: string; /** * Latin transcription of the Hebrew, from the one mechanical letter map. A label for reading the string back, and NOT the spelling the published tables print, which is in traditionalName. */ romanization: string; /** * The Latin spelling the published tables print. This is the search term a reader knows the name by. Several rows have two attested spellings across tables and the one used here is stated on the methodology page. */ traditionalName: string; /** * First degree of the ecliptic arc this name governs, measured from 0 Aries. Inclusive. */ arcStart: number; /** * Last degree of the arc, EXCLUSIVE. Seventy two arcs of five degrees tile the circle exactly, which only works if the upper bound is exclusive. */ arcEnd: number; /** * Which sign the arc falls in. Always English lowercase, so it stays safe to compare against in code. Six names fall in each sign. */ sign: string; /** * Where the arc opens inside its sign, 0 to 25 in steps of five. */ degreeInSign: number; /** * The angelic choir this name belongs to under the published Renaissance table. Nine choirs of exactly eight names each. */ choir: string; /** * Present only on the rows where a named published list differs from the derivation. Recorded rather than silently corrected, because a reader comparing two sources deserves to know which one moved. Absent on every other row, so a caller can branch on presence. */ publishedDisagreement?: { /** * Which published list prints something different on this row. */ list: string; /** * What that list prints, so a caller matching against it can see why. */ prints: string; }; }; }; export type GetShemNameResponse = GetShemNameResponses[keyof GetShemNameResponses]; export type GetTreeOfLifeData = { body?: never; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; /** * Which arrangement of the twenty two paths. The 1652 arrangement, in which Malkuth carries three paths, is the only one with a published table that letters every path, so it is the only member. */ treeVariant?: 'kircher'; /** * Which reading assigns a sphere to each sephirah. The two were compared row by row and agree on all ten, so the answer is the same either way; the parameter exists so a caller knows which one produced it rather than assuming. */ sephirotSystem?: 'classical' | 'golden-dawn'; /** * Which reading assigns the element, planet or sign to each letter. The seven double letters are the contested column and the four readings genuinely disagree on them; the twelve simple letters run in natural zodiacal order in all four. The golden-dawn member does NOT exchange He and Tzade, which is a later change from a different author. */ letterAttribution?: 'sefer-yetzirah-gra' | 'sefer-yetzirah-short' | 'sefer-yetzirah-saadia' | 'golden-dawn'; }; url: '/kabbalah/tree'; }; export type GetTreeOfLifeErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetTreeOfLifeError = GetTreeOfLifeErrors[keyof GetTreeOfLifeErrors]; export type GetTreeOfLifeResponses = { /** * The sephirot, the paths, the worlds and the lightning flash. */ 200: { /** * The ten emanations in order, with Daat last. */ sephirot: Array<{ /** * Machine identifier of the sephirah, an ASCII romanization, always English so it stays safe to compare against in code. Several romanizations of each name are in circulation and none is canonical, which is exactly why the id is fixed here. */ id: string; /** * Position in the emanation, 1 to 10. Null for Daat, which is counted in some diagrams and left out of others and is never an eleventh emanation. */ number: number | null; /** * The name in Hebrew, with vowel points. Data, identical in every language. */ hebrew: string; /** * Latin transcription of the Hebrew beside it, from the one mechanical letter map. A label for reading the string back, never a pronunciation claim and not the same thing as the id. */ romanization: string; /** * The English gloss of the name, in the requested language. */ english: string; /** * Which of the three pillars the sephirah stands on: left, middle or right. Always English. */ pillar: string; /** * Display name of the pillar, in the requested language. */ pillarName: string; /** * Which of the four worlds the sephirah belongs to under the Hermetic mapping. Null for Daat. A second mapping is in circulation and both are returned in the worlds block. */ world: string | null; /** * The sphere assigned to the sephirah under the requested system, in the requested language. This is the sephirot allotment and it is NOT the planet series the seven double letters carry. */ attribution: string; /** * What the emanation is said to hold, in the requested language. */ meaning: string; }>; /** * The 22 paths, in path order. */ paths: Array<{ /** * Path number, 11 to 32. The numbering continues the ten sephirot into the thirty two Paths of Wisdom, so path 11 is the eleventh Path and not the eleventh path. */ path: number; /** * Machine identifier of the letter on the path. Each of the 22 appears exactly once. */ letter: string; /** * The letter itself. Data, identical in every language. */ letterGlyph: string; /** * Machine identifier of the sephirah the path runs from. */ from: string; /** * Machine identifier of the sephirah the path runs to. */ to: string; trump: { /** * Identifier of the tarot trump on this path. It resolves in the Tarot API on the same key. */ id: string; /** * The trump number as the deck prints it. */ number: string; /** * Display name of the trump. */ name: string; }; attribution: { /** * What the letter attribution names: element, planet or sign. */ kind: string; /** * The element, planet or sign under the requested reading. Always English. */ value: string; }; }>; /** * The four worlds, with both published mappings of the sephirot onto them. */ worlds: Array<{ /** * Machine identifier of the world, an ASCII romanization. */ id: string; /** * The name in Hebrew. Data, identical in every language. */ hebrew: string; /** * Latin transcription of the Hebrew, from the mechanical letter map. */ romanization: string; /** * The English gloss, in the requested language. */ english: string; /** * Which sephirot fall in this world under the Hermetic mapping, the one the world field on each sephirah uses. */ sephirot: Array; /** * Which sephirot fall in this world under the second mapping in circulation. The two agree on Formation and Action and differ at the top, and neither is suppressed. */ sephirotAlternate: Array; }>; /** * The order the emanation descends, top to bottom. Ten identifiers, no repeats. */ lightningFlash: Array; /** * The conventions this answer was computed under, echoed so it can be reproduced. */ conventions: { /** * Which arrangement of the paths produced this answer. */ treeVariant: string; /** * Which reading assigned the spheres. */ sephirotSystem: string; /** * Which reading assigned the element, planet or sign on each path. */ letterAttribution: string; }; }; }; export type GetTreeOfLifeResponse = GetTreeOfLifeResponses[keyof GetTreeOfLifeResponses]; export type GetSephirahData = { body?: never; path: { /** * Sephirah identifier, one of keter, chokhmah, binah, chesed, gevurah, tiferet, netzach, hod, yesod, malkuth, daat. Matching folds case and punctuation. */ id: 'keter' | 'chokhmah' | 'binah' | 'chesed' | 'gevurah' | 'tiferet' | 'netzach' | 'hod' | 'yesod' | 'malkuth' | 'daat'; }; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; /** * Which reading assigns a sphere to each sephirah. The two were compared row by row and agree on all ten, so the answer is the same either way; the parameter exists so a caller knows which one produced it rather than assuming. */ sephirotSystem?: 'classical' | 'golden-dawn'; /** * Which reading assigns the element, planet or sign to each letter. The seven double letters are the contested column and the four readings genuinely disagree on them; the twelve simple letters run in natural zodiacal order in all four. The golden-dawn member does NOT exchange He and Tzade, which is a later change from a different author. */ letterAttribution?: 'sefer-yetzirah-gra' | 'sefer-yetzirah-short' | 'sefer-yetzirah-saadia' | 'golden-dawn'; }; url: '/kabbalah/sephirot/{id}'; }; export type GetSephirahErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetSephirahError = GetSephirahErrors[keyof GetSephirahErrors]; export type GetSephirahResponses = { /** * The sephirah, with the paths that touch it. */ 200: { /** * Machine identifier of the sephirah, an ASCII romanization, always English so it stays safe to compare against in code. Several romanizations of each name are in circulation and none is canonical, which is exactly why the id is fixed here. */ id: string; /** * Position in the emanation, 1 to 10. Null for Daat, which is counted in some diagrams and left out of others and is never an eleventh emanation. */ number: number | null; /** * The name in Hebrew, with vowel points. Data, identical in every language. */ hebrew: string; /** * Latin transcription of the Hebrew beside it, from the one mechanical letter map. A label for reading the string back, never a pronunciation claim and not the same thing as the id. */ romanization: string; /** * The English gloss of the name, in the requested language. */ english: string; /** * Which of the three pillars the sephirah stands on: left, middle or right. Always English. */ pillar: string; /** * Display name of the pillar, in the requested language. */ pillarName: string; /** * Which of the four worlds the sephirah belongs to under the Hermetic mapping. Null for Daat. A second mapping is in circulation and both are returned in the worlds block. */ world: string | null; /** * The sphere assigned to the sephirah under the requested system, in the requested language. This is the sephirot allotment and it is NOT the planet series the seven double letters carry. */ attribution: string; /** * What the emanation is said to hold, in the requested language. */ meaning: string; /** * Every path that runs to or from this sephirah, in path order. Malkuth carries three under the arrangement this API ships, which is the whole difference between the two arrangements in circulation. */ paths: Array<{ /** * Path number, 11 to 32. The numbering continues the ten sephirot into the thirty two Paths of Wisdom, so path 11 is the eleventh Path and not the eleventh path. */ path: number; /** * Machine identifier of the letter on the path. Each of the 22 appears exactly once. */ letter: string; /** * The letter itself. Data, identical in every language. */ letterGlyph: string; /** * Machine identifier of the sephirah the path runs from. */ from: string; /** * Machine identifier of the sephirah the path runs to. */ to: string; trump: { /** * Identifier of the tarot trump on this path. It resolves in the Tarot API on the same key. */ id: string; /** * The trump number as the deck prints it. */ number: string; /** * Display name of the trump. */ name: string; }; attribution: { /** * What the letter attribution names: element, planet or sign. */ kind: string; /** * The element, planet or sign under the requested reading. Always English. */ value: string; }; }>; /** * The conventions this answer was computed under. */ conventions: { /** * Which reading assigned the sphere. */ sephirotSystem: string; /** * Which reading assigned the element, planet or sign on each path. */ letterAttribution: string; }; }; }; export type GetSephirahResponse = GetSephirahResponses[keyof GetSephirahResponses]; export type ListHebrewLettersData = { body?: never; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; /** * Which reading assigns the element, planet or sign to each letter. The seven double letters are the contested column and the four readings genuinely disagree on them; the twelve simple letters run in natural zodiacal order in all four. The golden-dawn member does NOT exchange He and Tzade, which is a later change from a different author. */ letterAttribution?: 'sefer-yetzirah-gra' | 'sefer-yetzirah-short' | 'sefer-yetzirah-saadia' | 'golden-dawn'; }; url: '/kabbalah/letters'; }; export type ListHebrewLettersErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type ListHebrewLettersError = ListHebrewLettersErrors[keyof ListHebrewLettersErrors]; export type ListHebrewLettersResponses = { /** * All 22 letters in alphabet order. */ 200: { /** * Number of letters returned, which is always 22. */ total: number; /** * Echo of the reading the attributions were taken from. */ letterAttribution: string; /** * Three, seven and twelve. Every recension agrees on the split even where it disagrees on what goes where. */ classCounts: { /** * Mother letters, which take an element. */ mother: number; /** * Double letters, which take a planet. */ double: number; /** * Simple letters, which take a sign of the zodiac. */ simple: number; }; letters: Array<{ /** * Machine identifier of the letter, always English romanization so it stays safe to compare against in code. */ id: string; /** * The base glyph. Data, identical in every language. */ letter: string; /** * The word final glyph, or null for the seventeen letters that have none. Five letters change shape at the end of a word and score differently there under one reading of mispar gadol. */ final: string | null; /** * Latin transcription of the glyph, from the one mechanical letter map this API uses in both directions. A label, never a pronunciation claim. */ romanization: string; /** * Display name of the letter, in the requested language. */ name: string; /** * What the letter name means as an ordinary word, in the requested language. The names are object names, which is what the shapes were drawn from. */ meaning: string; /** * Position in the alphabet, 1 to 22. A property of the letter, not a cipher reading. */ ordinal: number; /** * Value under the standard reading. The 22 letters cover 1 to 9, 10 to 90 and 100 to 400. */ value: number; /** * Value in final position under the finals-500-900 reading of mispar gadol, or null where the letter has no final form. */ finalValue: number | null; /** * Sefer Yetzirah class: mother, double or simple. Three mothers take an element, seven doubles take a planet, twelve simples take a sign, and the three counts are the structure of the whole letter tradition. */ letterClass: string; /** * What the class means, in the requested language. */ classReading: string; attribution: { /** * What the attribution names: element, planet or sign. Always English. */ kind: string; /** * The element, planet or sign under the requested reading. Always English, so it stays safe to compare against in code. */ value: string; }; trump: { /** * Identifier of the tarot trump on this letter path. It resolves in the Tarot API on the same key, so a caller can follow it straight to the card. */ id: string; /** * The trump number as the deck prints it, in Roman numerals. */ number: string; /** * Display name of the trump. */ name: string; }; /** * The path this letter sits on, numbered 11 to 32 to continue the ten sephirot into the thirty two Paths of Wisdom. Never null in practice: all 22 letters carry a path. */ path: number | null; }>; }; }; export type ListHebrewLettersResponse = ListHebrewLettersResponses[keyof ListHebrewLettersResponses]; export type GetHebrewLetterData = { body?: never; path: { /** * Letter identifier, one of alef, bet, gimel, dalet, he, vav, zayin, chet, tet, yod, kaf, lamed, mem, nun, samekh, ayin, pe, tzadi, qof, resh, shin, tav. Matching folds case and punctuation. */ id: 'alef' | 'bet' | 'gimel' | 'dalet' | 'he' | 'vav' | 'zayin' | 'chet' | 'tet' | 'yod' | 'kaf' | 'lamed' | 'mem' | 'nun' | 'samekh' | 'ayin' | 'pe' | 'tzadi' | 'qof' | 'resh' | 'shin' | 'tav'; }; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; /** * Which reading assigns the element, planet or sign to each letter. The seven double letters are the contested column and the four readings genuinely disagree on them; the twelve simple letters run in natural zodiacal order in all four. The golden-dawn member does NOT exchange He and Tzade, which is a later change from a different author. */ letterAttribution?: 'sefer-yetzirah-gra' | 'sefer-yetzirah-short' | 'sefer-yetzirah-saadia' | 'golden-dawn'; }; url: '/kabbalah/letters/{id}'; }; export type GetHebrewLetterErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetHebrewLetterError = GetHebrewLetterErrors[keyof GetHebrewLetterErrors]; export type GetHebrewLetterResponses = { /** * The letter. */ 200: { /** * Machine identifier of the letter, always English romanization so it stays safe to compare against in code. */ id: string; /** * The base glyph. Data, identical in every language. */ letter: string; /** * The word final glyph, or null for the seventeen letters that have none. Five letters change shape at the end of a word and score differently there under one reading of mispar gadol. */ final: string | null; /** * Latin transcription of the glyph, from the one mechanical letter map this API uses in both directions. A label, never a pronunciation claim. */ romanization: string; /** * Display name of the letter, in the requested language. */ name: string; /** * What the letter name means as an ordinary word, in the requested language. The names are object names, which is what the shapes were drawn from. */ meaning: string; /** * Position in the alphabet, 1 to 22. A property of the letter, not a cipher reading. */ ordinal: number; /** * Value under the standard reading. The 22 letters cover 1 to 9, 10 to 90 and 100 to 400. */ value: number; /** * Value in final position under the finals-500-900 reading of mispar gadol, or null where the letter has no final form. */ finalValue: number | null; /** * Sefer Yetzirah class: mother, double or simple. Three mothers take an element, seven doubles take a planet, twelve simples take a sign, and the three counts are the structure of the whole letter tradition. */ letterClass: string; /** * What the class means, in the requested language. */ classReading: string; attribution: { /** * What the attribution names: element, planet or sign. Always English. */ kind: string; /** * The element, planet or sign under the requested reading. Always English, so it stays safe to compare against in code. */ value: string; }; trump: { /** * Identifier of the tarot trump on this letter path. It resolves in the Tarot API on the same key, so a caller can follow it straight to the card. */ id: string; /** * The trump number as the deck prints it, in Roman numerals. */ number: string; /** * Display name of the trump. */ name: string; }; /** * The path this letter sits on, numbered 11 to 32 to continue the ten sephirot into the thirty two Paths of Wisdom. Never null in practice: all 22 letters carry a path. */ path: number | null; }; }; export type GetHebrewLetterResponse = GetHebrewLetterResponses[keyof GetHebrewLetterResponses]; export type CalculateNameCompatibilityData = { /** * The two names to compare. Each side takes the Latin field or the Hebrew one, never both: which one you send decides whether a transliteration step runs for that side. */ body: { /** * First name in Latin script. Send firstNameHebrew instead to control the spelling. */ firstName?: string; /** * First name already in Hebrew, which skips the transliteration step. */ firstNameHebrew?: string; /** * Second name in Latin script. Send secondNameHebrew instead to control the spelling. */ secondName?: string; /** * Second name already in Hebrew, which skips the transliteration step. */ secondNameHebrew?: string; /** * How a Latin name is written in Hebrew before it is scored. Two members. letter-map-mathers is the 1887 Hermetic letter map, with e read as its author practised it: a point inside a word and alef at the start of one. It writes no c, f, w or x, so a name carrying one of them outside a two letter group returns 400 naming the letter. letter-map-modern follows the modern Israeli transcription rules for the sound each Latin letter carries in English and French spelling, covers every Latin letter, drops the geresh and does not double vav or yod, so send textHebrew for the ktiv male form. Every form states the readings it used in rule. Phonetic Ashkenazi and Sephardi schemes are not offered because no two references agree on a rule for that direction. */ transliteration?: 'letter-map-mathers' | 'letter-map-modern'; /** * Which method the name mispar gadol means, because the sources use it for two. Use finals-500-900 to score the five word final letters as 500 to 900, or milui to score each letter as the value of its own spelled out name. */ misparGadol?: 'finals-500-900' | 'milui'; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/kabbalah/compatibility'; }; export type CalculateNameCompatibilityErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type CalculateNameCompatibilityError = CalculateNameCompatibilityErrors[keyof CalculateNameCompatibilityErrors]; export type CalculateNameCompatibilityResponses = { /** * Both profiles, what they share, and the composite with its components. */ 200: { first: { /** * The name as sent, in whichever script it was sent in. */ input: string; /** * The Hebrew spelling this side was scored from. */ hebrew: string; /** * Latin transcription of that spelling, from the one mechanical letter map. */ romanization: string; /** * Why this spelling was chosen over the other parses. */ rule: string; /** * Value under the standard reading, which is the relation the tradition works with. */ standard: number; /** * The standard value reduced by repeated digit sum, stopping at ten. */ reduced: number; /** * Machine identifier of the sephirah the reduced value points at. */ sephirah: string; /** * The English gloss of that sephirah, in the requested language. */ sephirahEnglish: string; }; second: { /** * The name as sent, in whichever script it was sent in. */ input: string; /** * The Hebrew spelling this side was scored from. */ hebrew: string; /** * Latin transcription of that spelling, from the one mechanical letter map. */ romanization: string; /** * Why this spelling was chosen over the other parses. */ rule: string; /** * Value under the standard reading, which is the relation the tradition works with. */ standard: number; /** * The standard value reduced by repeated digit sum, stopping at ten. */ reduced: number; /** * Machine identifier of the sephirah the reduced value points at. */ sephirah: string; /** * The English gloss of that sephirah, in the requested language. */ sephirahEnglish: string; }; /** * Every cipher on which the two names give the same number. Empty when they share none, which happens often and carries no traditional reading of its own. */ sharedValues: Array<{ /** * Machine identifier of the cipher the two names agree on. */ cipher: string; /** * Display name of that cipher. */ name: string; /** * The value both names give under it. */ value: number; }>; /** * The composite, 0 to 100. A RoxyAPI composite, not a classical measure: no source scores two names against each other, so the components below are published and the number is derivable from them. */ score: number; /** * Which band the composite falls in: high, moderate or low. Derived from the score, always English. */ band: string; /** * Every component of the composite with its own maximum, so a caller who disagrees with the weighting can recompute rather than argue. */ components: Array<{ /** * Machine identifier of the component. */ id: string; /** * What this component contributed. */ points: number; /** * The most it can contribute. The four maxima sum to 100, so the weighting is visible rather than implied. */ maximum: number; /** * Whether the component found anything at all. */ matched: boolean; }>; /** * The composed reading, in the requested language. It states that the score is ours. */ reading: string; conventions: { /** * The Latin to Hebrew scheme applied. Absent when the caller sent Hebrew directly. */ transliteration?: string; /** * Which of the two published methods the name mispar gadol was read as. */ misparGadol: string; }; }; }; export type CalculateNameCompatibilityResponse = CalculateNameCompatibilityResponses[keyof CalculateNameCompatibilityResponses]; export type GetDailySephirahData = { body?: never; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; /** * Date in YYYY-MM-DD. Defaults to the current UTC date when omitted, so a caller that wants a fixed answer should send one. */ date?: string; /** * IANA name or decimal offset, used only to decide which calendar date it is where the caller is when date is omitted. It does not move the count, which is a calendar count rather than a clock one. */ timezone?: string; /** * Set true when the moment falls after nightfall, which advances the Hebrew date by one day because the Hebrew day begins in the evening. It is a caller assertion rather than a computation, since sunset depends on a place and this route takes none. */ afterSunset?: string; }; url: '/kabbalah/daily'; }; export type GetDailySephirahErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetDailySephirahError = GetDailySephirahErrors[keyof GetDailySephirahErrors]; export type GetDailySephirahResponses = { /** * The Omer day, or a statement that the count is not running. */ 200: { /** * The date this answer is for. Echoes the request or the resolved date. */ date: string; /** * Whether the count is running on this date. False outside the forty nine days, and the fields below the count are then absent. */ inOmer: boolean; /** * Day of the count, 1 to 49. Absent when the count is not running. */ day?: number; /** * Which of the seven weeks the day falls in. Absent outside the count. */ week?: number; /** * Which day inside that week, 1 to 7. Absent outside the count. */ dayInWeek?: number; /** * The sephirah of the WEEK, which is the outer half of the label. Absent outside the count. */ weekSephirah?: { /** * Machine identifier of the sephirah, always English so it stays safe to compare against in code. */ id: string; /** * The name in Hebrew, unpointed. Data, identical in every language. */ hebrew: string; /** * Latin transcription of the Hebrew, from the one mechanical letter map. */ romanization: string; /** * The English gloss of the name, in the requested language. */ english: string; }; /** * The sephirah of the DAY inside the week, which is the inner half of the label and is named first. Absent outside the count. */ daySephirah?: { /** * Machine identifier of the sephirah, always English so it stays safe to compare against in code. */ id: string; /** * The name in Hebrew, unpointed. Data, identical in every language. */ hebrew: string; /** * Latin transcription of the Hebrew, from the one mechanical letter map. */ romanization: string; /** * The English gloss of the name, in the requested language. */ english: string; }; /** * The label as the printed text carries it, inner then outer. Absent outside the count. */ hebrewLabel?: string; /** * The Hebrew month and day of this Omer day. Day 1 is 16 Nisan, the second day of Passover, on the reckoning this API uses. Absent outside the count. */ hebrewDate?: string; /** * The composed reading for the day, in the requested language. */ reading: string; /** * The date the count next opens. Present only when the count is not running, so a caller can branch on presence. */ nextStart?: string; }; }; export type GetDailySephirahResponse = GetDailySephirahResponses[keyof GetDailySephirahResponses]; export type ListCardsData = { body?: never; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; /** * Maximum items to return per page. Range: 1-100, default 20. */ limit?: number; /** * Number of items to skip for pagination. Default 0. */ offset?: number; /** * Filter by arcana type. Major arcana (0-21) represents life lessons and spiritual themes. Minor arcana (Ace-King in 4 suits) represents daily situations and practical matters. */ arcana?: 'major' | 'minor'; /** * Filter minor arcana by suit. Cups=emotions/relationships, Wands=creativity/passion, Swords=intellect/conflict, Pentacles=material/finances. Only applies to minor arcana cards. */ suit?: 'cups' | 'wands' | 'swords' | 'pentacles'; /** * Filter by card number. Major Arcana: 0 (The Fool) through 21 (The World). Minor Arcana: 1 (Ace) through 14 (King). Combine with arcana or suit filters for precise results. */ number?: number; }; url: '/tarot/cards'; }; export type ListCardsErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type ListCardsError = ListCardsErrors[keyof ListCardsErrors]; export type ListCardsResponses = { /** * List of tarot cards with basic information. Use GET /cards/{id} for full details. */ 200: { /** * Total number of tarot cards matching the applied filters. 78 for the full deck, 22 for Major Arcana, 56 for Minor Arcana, 14 per suit. */ total: number; /** * Maximum items returned per page. */ limit: number; /** * Number of items skipped from the start of the result set. */ offset: number; /** * Array of tarot cards with basic metadata. Use GET /cards/{id} for full upright and reversed interpretations. */ cards: Array; }; }; export type ListCardsResponse = ListCardsResponses[keyof ListCardsResponses]; export type GetCardData = { body?: never; path: { /** * Card identifier. Major arcana: "fool", "magician", "death". Minor arcana: "ace-of-cups", "seven-of-wands", "queen-of-swords", "king-of-pentacles". Casing and separators are flexible, so "Fool" and "ACE_OF_CUPS" both resolve, and a leading definite article is optional, so "the-star" resolves to "star". The canonical form, and the one every response echoes, is kebab-case with no article. */ id: string; }; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/tarot/cards/{id}'; }; export type GetCardErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Card not found */ 404: { /** * Human-readable error message. The wording may change, so do not parse it programmatically. Switch on the stable code instead. */ error: string; /** * Machine-readable error code. Stable identifier for programmatic error handling. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself. The same URL in every environment, so it is safe to log, print in a CLI, or paste into a bug report. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetCardError = GetCardErrors[keyof GetCardErrors]; export type GetCardResponses = { /** * Card details */ 200: Card; }; export type GetCardResponse = GetCardResponses[keyof GetCardResponses]; export type DrawCardsData = { body: { /** * Number of cards to draw (1-78). Common values: 1 for daily card, 3 for past-present-future, 5 for relationship spread, 10 for Celtic Cross. Drawing 78 returns the entire shuffled deck. */ count: number; /** * Optional seed for reproducible results. Same seed = same cards in same order. Use format like "userId-date" for daily consistency, or "readingId" for shareable readings. Omit for true randomness. */ seed?: string; /** * Whether cards can appear reversed (upside down). Reversed cards have different meanings. Set false for upright-only readings. Default: true (50% chance of reversal per card). */ allowReversals?: boolean; /** * Whether same card can be drawn multiple times. Set false for traditional deck behavior (each card drawn only once). Set true for statistical analysis or oracle-style readings. Default: false. */ allowDuplicates?: boolean; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/tarot/draw'; }; export type DrawCardsErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type DrawCardsError = DrawCardsErrors[keyof DrawCardsErrors]; export type DrawCardsResponses = { /** * Drawn cards */ 200: { /** * Seed used for this reading, if one was provided. Same seed reproduces identical draw results for consistent tarot readings. */ seed?: string; /** * Array of drawn tarot cards in draw order, each with orientation, keywords, and full meaning for divination. */ cards: Array; }; }; export type DrawCardsResponse = DrawCardsResponses[keyof DrawCardsResponses]; export type GetDailyCardData = { body?: { /** * Optional seed for reproducible readings. Same seed + same date = same card every time. Pass any unique identifier (userId, email hash, session token). Omit for anonymous daily readings. */ seed?: string; /** * Date for the reading in YYYY-MM-DD format. Defaults to today (UTC). Useful for viewing past daily readings or pre-generating future ones. */ date?: string; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/tarot/daily'; }; export type GetDailyCardErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetDailyCardError = GetDailyCardErrors[keyof GetDailyCardErrors]; export type GetDailyCardResponses = { /** * Daily card reading */ 200: { /** * Date of the daily tarot reading in YYYY-MM-DD format (UTC). Determines which card is drawn for seeded readings. */ date: string; /** * Seed used for this daily reading. Same seed on the same date always produces the identical card for reproducible daily divination. */ seed: string; card: DrawnCard; /** * Concise daily tarot message summarizing the card, its orientation, key themes, and brief guidance for the day. */ dailyMessage: string; }; }; export type GetDailyCardResponse = GetDailyCardResponses[keyof GetDailyCardResponses]; export type CastYesNoData = { body: { /** * Your specific yes/no question. Be clear and focused. Good: "Should I move to a new city?" Bad: "What should I do about my life?" The more specific the question, the more useful the tarot guidance. */ question?: string; /** * Optional seed for reproducible results. Same seed + same question = same answer. Useful for testing, sharing readings, or ensuring consistency. Omit for random draws each time. */ seed?: string; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/tarot/yes-no'; }; export type CastYesNoErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type CastYesNoError = CastYesNoErrors[keyof CastYesNoErrors]; export type CastYesNoResponses = { /** * Yes/No answer with interpretation */ 200: { /** * The querent question that was asked, if one was provided. */ question?: string; /** * The seed used for this draw, echoed back when one was supplied. Present only if the request carried a seed. Makes a cached or forwarded response self describing, so a reading can be reproduced or shared without the original request beside it. */ seed?: string; /** * Tarot-derived answer. Yes = upright card supports a positive outcome. No = reversed card suggests obstacles. Maybe = inherently ambiguous card drawn (The Hanged Man, Wheel of Fortune, Temperance, Two of Swords, Four of Swords) signaling pause, reflection, or shifting circumstances. */ answer: 'Yes' | 'No' | 'Maybe'; /** * Confidence level of the answer. Strong = Major Arcana card drawn (powerful, definitive cosmic energy). Qualified = Minor Arcana card drawn (nuanced, situational guidance). */ strength: 'Strong' | 'Qualified'; card: { /** * Unique card identifier in kebab-case (e.g. the-fool, ace-of-cups). */ id: string; /** * Display name of the tarot card. */ name: string; /** * Whether this card belongs to the Major Arcana (22 trump cards, major life themes) or Minor Arcana (56 suit cards, daily situations). */ arcana: 'major' | 'minor'; /** * True if the card was drawn reversed (upside down). Reversed cards carry modified or blocked energy compared to upright position. */ reversed: boolean; /** * Key themes and concepts associated with this card in its current orientation (upright or reversed). */ keywords: Array; /** * URL to the tarot card artwork image. */ imageUrl: string; }; /** * Contextual narrative explaining why this card answers the question with this result. Connects card meaning, orientation, and arcana strength into actionable guidance. */ interpretation: string; }; }; export type CastYesNoResponse = CastYesNoResponses[keyof CastYesNoResponses]; export type CastThreeCardData = { body: { /** * Optional specific question to focus the reading. Examples: "What should I know about my relationship?", "How can I improve my finances?", "What is blocking my creative growth?" Leave empty for general guidance. */ question?: string; /** * Optional seed for reproducible results. Same seed = same 3 cards in same positions. Useful for sharing readings, testing, or ensuring users get consistent results. Omit for random draws. */ seed?: string; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/tarot/spreads/three-card'; }; export type CastThreeCardErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type CastThreeCardError = CastThreeCardErrors[keyof CastThreeCardErrors]; export type CastThreeCardResponses = { /** * Three-card spread reading */ 200: { /** * Name of the tarot spread used (e.g. Three-Card, Celtic Cross, Career, Love). */ spread: string; /** * The querent question, if one was provided. */ question?: string; /** * Seed used for this reading, if one was provided. Same seed reproduces identical results. */ seed?: string; /** * Array of spread positions, each containing a drawn card with position-specific tarot interpretation. */ positions: Array<{ /** * Position number in the spread layout (1-based). */ position: number; /** * Position name describing what this card reveals (e.g. Past, Present, Future, Challenge). */ name: string; /** * Position-specific interpretation of the drawn card, explaining how this card meaning applies to this particular spread position. */ interpretation: string; card: DrawnCard; }>; /** * Narrative summary that connects the cards drawn across the spread positions into one cohesive reading. */ summary?: string; }; }; export type CastThreeCardResponse = CastThreeCardResponses[keyof CastThreeCardResponses]; export type CastCelticCrossData = { body: { /** * Optional querent question to focus the Celtic Cross. It is echoed back on the reading and gives the ten positions their context. Omit for a general reading of the situation. */ question?: string; /** * Optional seed for reproducible results. The same seed always draws the same ten cards into the same Celtic Cross positions, which is what lets a reading be shared or re-rendered. Omit for a random draw. */ seed?: string; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/tarot/spreads/celtic-cross'; }; export type CastCelticCrossErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type CastCelticCrossError = CastCelticCrossErrors[keyof CastCelticCrossErrors]; export type CastCelticCrossResponses = { /** * Celtic Cross spread reading */ 200: { /** * Name of the tarot spread used (e.g. Three-Card, Celtic Cross, Career, Love). */ spread: string; /** * The querent question, if one was provided. */ question?: string; /** * Seed used for this reading, if one was provided. Same seed reproduces identical results. */ seed?: string; /** * Array of 10 spread positions forming the complete Celtic Cross layout, each with a drawn card and position-specific interpretation. */ positions: Array<{ /** * Position number in the spread layout (1-based). */ position: number; /** * Position name describing what this card reveals (e.g. Past, Present, Future, Challenge). */ name: string; /** * Position-specific interpretation of the drawn card, explaining how this card meaning applies to this particular spread position. */ interpretation: string; card: DrawnCard; }>; /** * Narrative summary that connects the cards drawn across the spread positions into one cohesive reading. */ summary?: string; }; }; export type CastCelticCrossResponse = CastCelticCrossResponses[keyof CastCelticCrossResponses]; export type CastLoveSpreadData = { body: { /** * Optional querent question to focus the love spread. It is echoed back on the reading and gives the five relationship positions their context. Omit for general relationship guidance. */ question?: string; /** * Optional seed for reproducible results. The same seed always draws the same five cards into the same love positions, which is what lets a reading be shared or re-rendered. Omit for a random draw. */ seed?: string; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/tarot/spreads/love'; }; export type CastLoveSpreadErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type CastLoveSpreadError = CastLoveSpreadErrors[keyof CastLoveSpreadErrors]; export type CastLoveSpreadResponses = { /** * Love spread reading */ 200: { /** * Name of the tarot spread used (e.g. Three-Card, Celtic Cross, Career, Love). */ spread: string; /** * The querent question, if one was provided. */ question?: string; /** * Seed used for this reading, if one was provided. Same seed reproduces identical results. */ seed?: string; /** * Array of 5 love spread positions exploring relationship dynamics, each with a drawn card and position-specific interpretation. */ positions: Array<{ /** * Position number in the spread layout (1-based). */ position: number; /** * Position name describing what this card reveals (e.g. Past, Present, Future, Challenge). */ name: string; /** * Position-specific interpretation of the drawn card, explaining how this card meaning applies to this particular spread position. */ interpretation: string; card: DrawnCard; }>; /** * Narrative summary that connects the cards drawn across the spread positions into one cohesive reading. */ summary?: string; }; }; export type CastLoveSpreadResponse = CastLoveSpreadResponses[keyof CastLoveSpreadResponses]; export type CastCareerSpreadData = { body: { /** * Optional querent question to focus the career spread. It is echoed back on the reading and gives the seven career positions their context. Omit for general work and vocation guidance. */ question?: string; /** * Optional seed for reproducible results. The same seed always draws the same seven cards into the same career positions, which is what lets a reading be shared or re-rendered. Omit for a random draw. */ seed?: string; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/tarot/spreads/career'; }; export type CastCareerSpreadErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type CastCareerSpreadError = CastCareerSpreadErrors[keyof CastCareerSpreadErrors]; export type CastCareerSpreadResponses = { /** * Career spread reading */ 200: { /** * Name of the tarot spread used (e.g. Three-Card, Celtic Cross, Career, Love). */ spread: string; /** * The querent question, if one was provided. */ question?: string; /** * Seed used for this reading, if one was provided. Same seed reproduces identical results. */ seed?: string; /** * Array of 7 career spread positions using SWOT framework, each with a drawn card and position-specific interpretation. */ positions: Array<{ /** * Position number in the spread layout (1-based). */ position: number; /** * Position name describing what this card reveals (e.g. Past, Present, Future, Challenge). */ name: string; /** * Position-specific interpretation of the drawn card, explaining how this card meaning applies to this particular spread position. */ interpretation: string; card: DrawnCard; }>; /** * Narrative summary that connects the cards drawn across the spread positions into one cohesive reading. */ summary?: string; }; }; export type CastCareerSpreadResponse = CastCareerSpreadResponses[keyof CastCareerSpreadResponses]; export type CastCustomSpreadData = { body: { /** * Optional name for your custom tarot spread layout. Used as the spread identifier in the response. */ spreadName?: string; /** * Array of 1-10 custom position definitions for your tarot spread. Each position gets one drawn card with a position-specific interpretation. */ positions: Array<{ /** * Name for this position in the spread (e.g. Core Issue, Hidden Factor, Best Action). Defines what aspect of the reading this card represents. */ name: string; /** * Description of what this position reveals in the reading. Guides the tarot interpretation for the card drawn in this slot. */ interpretation: string; }>; /** * Optional querent question to focus the custom tarot reading. Provides context for position-specific interpretations. */ question?: string; /** * Optional seed for reproducible results. Same seed with the same positions produces identical card draws for consistent divination. */ seed?: string; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/tarot/spreads/custom'; }; export type CastCustomSpreadErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type CastCustomSpreadError = CastCustomSpreadErrors[keyof CastCustomSpreadErrors]; export type CastCustomSpreadResponses = { /** * Custom spread reading */ 200: { /** * Name of the tarot spread used (e.g. Three-Card, Celtic Cross, Career, Love). */ spread: string; /** * The querent question, if one was provided. */ question?: string; /** * Seed used for this reading, if one was provided. Same seed reproduces identical results. */ seed?: string; /** * Array of custom spread positions matching your defined layout, each with a drawn card and position-specific interpretation. */ positions: Array<{ /** * Position number in the spread layout (1-based). */ position: number; /** * Position name describing what this card reveals (e.g. Past, Present, Future, Challenge). */ name: string; /** * Position-specific interpretation of the drawn card, explaining how this card meaning applies to this particular spread position. */ interpretation: string; card: DrawnCard; }>; }; }; export type CastCustomSpreadResponse = CastCustomSpreadResponses[keyof CastCustomSpreadResponses]; export type GetReadingData = { body?: { /** * Birth date of the person in YYYY-MM-DD format. This is the anchor for all biorhythm cycle calculations. */ birthDate: string; /** * Date to calculate the reading for in YYYY-MM-DD format. Defaults to today (UTC) if omitted. */ targetDate?: string; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/biorhythm/reading'; }; export type GetReadingErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetReadingError = GetReadingErrors[keyof GetReadingErrors]; export type GetReadingResponses = { /** * Complete biorhythm reading with all 10 cycles, energy rating, interpretation, and critical alerts */ 200: { /** * Birth date used for this calculation (YYYY-MM-DD). */ birthDate: string; /** * Date this reading is for (YYYY-MM-DD). */ targetDate: string; /** * Total days alive from birth date to target date. This is the basis for all cycle calculations. */ daysSinceBirth: number; /** * All 10 biorhythm cycle readings. Keys: physical, emotional, intellectual, intuitive, aesthetic, awareness, spiritual, passion, mastery, wisdom. */ cycles: { [key: string]: { /** * Percentage position in the cycle from -100 (trough) to 100 (peak). 0 represents a critical zero crossing. */ value: number; /** * Raw sine wave value before percentage conversion, ranging from -1.0 to 1.0. */ rawValue: number; /** * Current phase of the cycle. One of: peak, high, rising, critical_ascending, critical_descending, falling, low, trough. Canonical English whatever the lang parameter says, so it stays safe to compare against in code; phaseLabel carries the reader-facing form and IS translated. */ phase: 'peak' | 'high' | 'rising' | 'critical_ascending' | 'critical_descending' | 'falling' | 'low' | 'trough'; /** * Human-readable phase name for display in UIs, dashboards, and reports. */ phaseLabel: string; /** * Current day position within the cycle (1-based). Ranges from 1 to the cycle period length. */ dayInCycle: number; /** * Number of days until the next peak (100%) in this cycle. */ daysUntilPeak: number; /** * Number of days until the next trough (-100%) in this cycle. */ daysUntilTrough: number; /** * Number of days until the next zero crossing in this cycle. */ daysUntilCritical: number; /** * Short-term direction of the cycle, which is its SLOPE rather than its band, so it moves independently of phase. One of: rising, falling, peaking, bottoming. Canonical English, like phase. */ trend: 'rising' | 'falling' | 'peaking' | 'bottoming'; /** * Editorial 2-3 sentence reading specific to this cycle at its current phase position. */ interpretation: string; }; }; /** * Overall energy score from 1 (deep recovery) to 10 (peak performance), derived from the three primary cycle positions. */ energyRating: number; /** * Summary phase across every cycle for the day. One of: high_energy, mixed, recovery, critical. */ overallPhase: 'high_energy' | 'mixed' | 'recovery' | 'critical'; /** * Editorial 3-5 sentence reading combining all cycle states into a coherent daily assessment. */ interpretation: string; /** * Actionable 1-2 sentence guidance for the day based on the combined cycle analysis. */ advice: string; /** * Critical day alerts. Present only when one or more primary cycles are at or near zero crossing. */ criticalAlerts: Array<{ /** * Which cycle is at or near zero crossing. */ cycle: 'physical' | 'emotional' | 'intellectual' | 'intuitive' | 'aesthetic' | 'awareness' | 'spiritual' | 'passion' | 'mastery' | 'wisdom'; /** * Alert type. One of: zero_crossing. Raised once for the whole critical band, when the cycle sits within 9 points of zero in either direction. */ type: 'zero_crossing'; /** * Whether the cycle is rising through zero (ascending) or falling through zero (descending). */ direction: 'ascending' | 'descending'; /** * Specific advisory text for this critical alert. */ advisory: string; }>; }; }; export type GetReadingResponse = GetReadingResponses[keyof GetReadingResponses]; export type GetForecastData = { body?: { /** * Birth date of the person in YYYY-MM-DD format. */ birthDate: string; /** * Start date of the forecast range in YYYY-MM-DD format. Defaults to today (UTC). */ startDate?: string; /** * End date of the forecast range in YYYY-MM-DD format. Defaults to startDate + 30 days. Maximum range: 90 days. */ endDate?: string; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/biorhythm/forecast'; }; export type GetForecastErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetForecastError = GetForecastErrors[keyof GetForecastErrors]; export type GetForecastResponses = { /** * Biorhythm forecast with daily readings, summary, and best/worst day identification */ 200: { /** * Birth date used for this calculation. */ birthDate: string; /** * First day of the forecast range. */ startDate: string; /** * Last day of the forecast range. */ endDate: string; /** * Number of days in the forecast range. */ totalDays: number; summary: { /** * Date with the highest average primary cycle values in the range. Best day for demanding activities. */ bestDay: string; /** * Date with the lowest average primary cycle values in the range. Best scheduled as a rest day. */ worstDay: string; /** * Total number of days where at least one primary cycle crosses zero in the range. */ criticalDayCount: number; /** * Average energy rating (1-10) across the entire forecast period. */ averageEnergy: number; /** * Overview guidance for the entire forecast period based on average energy and cycle patterns. */ periodAdvice: string; }; /** * Array of daily readings, one per day in the forecast range. */ days: Array<{ /** * Date of this daily reading (YYYY-MM-DD). */ date: string; /** * Days from birth date to this date. */ daysSinceBirth: number; /** * Physical cycle value (-100 to 100). */ physical: number; /** * Emotional cycle value (-100 to 100). */ emotional: number; /** * Intellectual cycle value (-100 to 100). */ intellectual: number; /** * Intuitive cycle value (-100 to 100). */ intuitive: number; /** * Energy rating for this day (1-10). */ energyRating: number; /** * True if any primary cycle crosses zero on this day. */ isCritical: boolean; /** * Which primary cycles are critical on this day. Empty array if none. */ criticalCycles: Array; }>; }; }; export type GetForecastResponse = GetForecastResponses[keyof GetForecastResponses]; export type GetCriticalDaysData = { body?: { /** * Birth date of the person in YYYY-MM-DD format. */ birthDate: string; /** * Start date of the search range in YYYY-MM-DD format. Defaults to today (UTC). */ startDate?: string; /** * End date of the search range in YYYY-MM-DD format. Defaults to startDate + 90 days. Maximum range: 180 days. */ endDate?: string; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/biorhythm/critical-days'; }; export type GetCriticalDaysErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetCriticalDaysError = GetCriticalDaysErrors[keyof GetCriticalDaysErrors]; export type GetCriticalDaysResponses = { /** * Critical days with zero crossing details, severity levels, and advisory text */ 200: { /** * Birth date used for this calculation. */ birthDate: string; /** * Start of the search range. */ startDate: string; /** * End of the search range. */ endDate: string; /** * Total count of critical day events in the range. A double critical day counts as two events. */ totalCriticalDays: number; /** * All critical day events in the range, sorted by date. */ criticalDays: Array<{ /** * Date of the zero crossing (YYYY-MM-DD). */ date: string; /** * Which primary cycle crosses zero on this date. One of: physical, emotional, intellectual. Only the three primary cycles are scanned; the secondary and composite cycles are not. */ cycle: 'physical' | 'emotional' | 'intellectual'; /** * Cycle period in days. */ period: number; /** * Whether the cycle is rising through zero (ascending) or falling through zero (descending). */ direction: 'ascending' | 'descending'; /** * How many primary cycles are critical on this date. One of: single, double, triple. */ severity: 'single' | 'double' | 'triple'; /** * Advisory text explaining the significance of this critical day and recommended precautions. */ advisory: string; }>; /** * Dates where 2 or more primary cycles cross zero simultaneously. These are particularly significant days requiring extra caution. */ doubleCriticalDays: Array; /** * Date where all 3 primary cycles cross zero simultaneously. Extremely rare event. Null if none found in range. */ tripleCriticalDay: string | null; }; }; export type GetCriticalDaysResponse = GetCriticalDaysResponses[keyof GetCriticalDaysResponses]; export type CalculateBioCompatibilityData = { body?: { person1: { /** * Birth date of person 1 in YYYY-MM-DD format. */ birthDate: string; }; person2: { /** * Birth date of person 2 in YYYY-MM-DD format. */ birthDate: string; }; /** * Date to evaluate compatibility on in YYYY-MM-DD format. Defaults to today (UTC). Compatibility varies by day since biorhythm cycles are continuous. */ targetDate?: string; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/biorhythm/compatibility'; }; export type CalculateBioCompatibilityErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type CalculateBioCompatibilityError = CalculateBioCompatibilityErrors[keyof CalculateBioCompatibilityErrors]; export type CalculateBioCompatibilityResponses = { /** * Biorhythm compatibility analysis with per-cycle alignment, overall score, and relationship guidance */ 200: { person1: { /** * Birth date of person 1. */ birthDate: string; }; person2: { /** * Birth date of person 2. */ birthDate: string; }; /** * Date this compatibility was calculated for. */ targetDate: string; /** * Overall compatibility score from 0 (fully opposed) to 100 (perfectly synchronized). */ overallScore: number; /** * Compatibility rating label. One of: Highly Aligned, Well Aligned, Moderately Aligned, Misaligned, Opposed. */ rating: string; /** * Per-cycle compatibility analysis for physical, emotional, and intellectual cycles. */ cycles: { [key: string]: { /** * Person 1 cycle value on the target date (-100 to 100). */ person1Value: number; /** * Person 2 cycle value on the target date (-100 to 100). */ person2Value: number; /** * Absolute difference between the two values (0-200). Lower values indicate better alignment. */ difference: number; /** * Alignment score from 0 (perfectly opposed) to 100 (perfectly in sync). */ alignment: number; /** * How the cycles of the two people sit against each other. One of: in_sync, complementary, neutral, opposing. This is a PAIR alignment and shares no values with the single-person cycle phase. */ phase: 'in_sync' | 'complementary' | 'neutral' | 'opposing'; /** * Human-readable description of how this cycle alignment affects the relationship. */ description: string; }; }; /** * Relationship strengths based on the compatibility profile. */ strengths: Array; /** * Potential relationship challenges to be aware of. */ challenges: Array; /** * Practical relationship guidance based on the combined cycle analysis. */ advice: string; dailySync: { /** * Absolute difference in physical cycle values (0-200). Lower = more aligned. */ physicalDiff: number; /** * Absolute difference in emotional cycle values (0-200). Lower = more aligned. */ emotionalDiff: number; /** * Absolute difference in intellectual cycle values (0-200). Lower = more aligned. */ intellectualDiff: number; }; }; }; export type CalculateBioCompatibilityResponse = CalculateBioCompatibilityResponses[keyof CalculateBioCompatibilityResponses]; export type GetPhasesData = { body?: { /** * Birth date of the person in YYYY-MM-DD format. */ birthDate: string; /** * Date to get phase information for in YYYY-MM-DD format. Defaults to today (UTC). */ targetDate?: string; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/biorhythm/phases'; }; export type GetPhasesErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetPhasesError = GetPhasesErrors[keyof GetPhasesErrors]; export type GetPhasesResponses = { /** * Phase information for all 10 cycles with summary */ 200: { /** * Birth date used for this calculation. */ birthDate: string; /** * Date this phase info is for. */ targetDate: string; /** * Total days alive from birth date to target date. */ daysSinceBirth: number; /** * Phase information for all 10 cycles keyed by cycle ID. */ phases: { [key: string]: { /** * Cycle value from -100 to 100. */ value: number; /** * Current phase identifier. */ phase: 'peak' | 'high' | 'rising' | 'critical_ascending' | 'critical_descending' | 'falling' | 'low' | 'trough'; /** * Human-readable phase label. */ phaseLabel: string; /** * Current day position within the cycle. */ dayInCycle: number; /** * Cycle period in days. 0 for composite cycles (passion, mastery, wisdom). */ totalDays: number; /** * Days until next zero crossing. */ daysUntilCritical: number; /** * Short-term direction: rising, falling, peaking, or bottoming. */ trend: 'rising' | 'falling' | 'peaking' | 'bottoming'; }; }; /** * Quick overview string summarizing the current state of all cycles. */ summary: string; }; }; export type GetPhasesResponse = GetPhasesResponses[keyof GetPhasesResponses]; export type GetDailyBiorhythmData = { body?: { /** * Optional seed for reproducible readings. Same seed + same date = same reading every time. Pass any unique identifier (userId, email hash, session token). Omit for anonymous daily readings. */ seed?: string; /** * Date for the reading in YYYY-MM-DD format. Defaults to today (UTC). Useful for viewing past daily readings or pre-generating future ones. */ date?: string; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/biorhythm/daily'; }; export type GetDailyBiorhythmErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetDailyBiorhythmError = GetDailyBiorhythmErrors[keyof GetDailyBiorhythmErrors]; export type GetDailyBiorhythmResponses = { /** * Daily biorhythm reading with spotlight cycle and actionable guidance */ 200: { /** * Date this daily reading is for (YYYY-MM-DD, UTC). */ date: string; /** * Computed seed used for this reading. Same seed always produces the same reading. */ seed: string; /** * Overall energy score from 1 to 10. */ energyRating: number; /** * Summary phase across every cycle for the day. One of: high_energy, mixed, recovery, critical. */ overallPhase: 'high_energy' | 'mixed' | 'recovery' | 'critical'; spotlight: { /** * Which primary cycle is featured as the daily spotlight. One of: physical, emotional, intellectual. */ cycle: 'physical' | 'emotional' | 'intellectual'; /** * Current value of the spotlight cycle (-100 to 100). */ value: number; /** * Current phase of the spotlight cycle. */ phase: 'peak' | 'high' | 'rising' | 'critical_ascending' | 'critical_descending' | 'falling' | 'low' | 'trough'; /** * Personalized message about the spotlight cycle and what it means for today. */ message: string; }; quickRead: { /** * Physical cycle value (-100 to 100). */ physical: number; /** * Emotional cycle value (-100 to 100). */ emotional: number; /** * Intellectual cycle value (-100 to 100). */ intellectual: number; }; /** * Concise daily biorhythm message combining energy rating and spotlight cycle. */ dailyMessage: string; /** * Actionable 1-2 sentence guidance for the day. */ advice: string; }; }; export type GetDailyBiorhythmResponse = GetDailyBiorhythmResponses[keyof GetDailyBiorhythmResponses]; export type CalculateAyurvedicConstitutionData = { body?: AyurvedaConstitutionRequest; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/ayurveda/constitution'; }; export type CalculateAyurvedicConstitutionErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type CalculateAyurvedicConstitutionError = CalculateAyurvedicConstitutionErrors[keyof CalculateAyurvedicConstitutionErrors]; export type CalculateAyurvedicConstitutionResponses = { /** * The constitution, its cited factors, and the graha table behind them. */ 200: { /** * The sidereal frame this reading was cast in. */ frame: { /** * The sidereal frame the chart was cast in, echoing the request. Always English, so it is safe to compare against. */ ayanamsa: string; /** * The frame offset in degrees at the birth instant, read once and used for both sign factors and for the strength ranking, so the three cannot come from frames a fraction of a degree apart. */ ayanamsaDegrees: number; }; /** * The rising sign, lowercase and always English. It is the best attested of the three factors and carries the heaviest weight. */ lagnaSign: string; /** * The sign the Moon occupies, lowercase and always English. It is read through the same sign table as the rising sign, on the warrant of the verse that equates the two. */ moonSign: string; /** * The three scored factors, in the order they are weighted. */ factors: Array<{ /** * Which factor this is. One of lagna-sign, moon-sign or strongest-planet. Always English and stable, so it is safe to switch on. There are three and only three, because the two indicators often listed beside them, the lagna lord and the Sun, carry no classical rule that they show the native humour. */ id: string; /** * What this factor read: a sign id for the two sign factors, or the space-separated grahas that reached the strength cutoff for the third. */ input: string; /** * The humours this factor carries, as the Sanskrit identifiers vata, pitta and kapha. Never translated, so they stay safe to compare against. Where a factor carries more than one they are stored in the standing order and that order means nothing, because the two translations of the source order them differently and their sets are identical. */ doshas: Array; /** * How much of the composite this factor is given. The weights are a RoxyAPI convention and no primary text states them, which is why every one of them is published here rather than kept private. */ weight: number; /** * Where one claim in this response comes from. */ source: { /** * Title of the work the claim is taken from, as it should be cited. */ text: string; /** * Chapter or sthana, as printed in that edition. Use it with the verse to find the passage in any copy. */ chapter: string; /** * Verse or verse range, printed as the source prints it, so it is a string and not always numeric. Where the claim sits in an appended note or a commentary rather than in a numbered verse, this value is prose, as in "note to 20". Join it to the chapter with a dot only when it is numeric, and otherwise render it after the chapter with a comma, so the pair reads "18, note to 20" rather than "18.note to 20". */ verse: string; /** * The named translator, or null where the English shipped here was written from the Sanskrit because no public-domain translation of that work exists. */ translation: string | null; /** * Publication year of the named translation, or null where no translation is cited. Use it with publicDomain to judge what may be quoted. */ year: number | null; /** * Whether the cited translation may be quoted. When false the verse reference is the citation and the translator wording is not reproduced anywhere in this API, so a caller reproducing a source must go to the verse rather than to us. */ publicDomain: boolean; /** * A recorded disagreement between sources, or a stated limit on what the citation covers. Present only where one exists, and never resolved silently in favour of one reading. */ note?: string; }; }>; /** * The blended reading. The factors are cited and this is not, which is why it carries a convention label. */ composite: { /** * Share of vata in whole percent. The three shares always sum to exactly 100, by largest remainder, so a caller can render them as a bar without normalising first. */ vata: number; /** * Share of pitta in whole percent. */ pitta: number; /** * Share of kapha in whole percent. */ kapha: number; /** * The humour holding the largest share. A Sanskrit identifier, never translated. */ dominant: string; /** * The humour holding the second largest share. Reported whether or not it reached the margin that would put it in the type label. */ secondary: string; /** * The derived label: one humour when it leads clearly, two joined by a hyphen when the second is within the published margin, and sama when all three sit inside that band. Built from Sanskrit identifiers, so it stays the same string in every language. */ type: string; /** * The version of the blending convention this composite was built under. It is ours and not classical, and it is versioned so a caller comparing two readings taken months apart can tell whether the rule moved. */ convention: string; /** * Every number behind the blend, published so a caller who disagrees can re-weigh the factors themselves. */ weighting: { /** * Weight given to the rising sign factor. */ lagnaSign: number; /** * Weight given to the Moon sign factor, lower than the rising sign because its classical warrant is the narrower of the two. */ moonSign: number; /** * Weight given to the strongest graha factor. */ strongestPlanet: number; /** * Fraction of the leading shadbala total at which a second graha also counts as strong. The verse licenses a blended result where several planets attain strength and gives no number for several, so this one is ours. */ strongPlanetThreshold: number; /** * Percentage-point gap below which the second humour joins the type label. When all three sit inside it the label is sama. */ dualTypeMargin: number; }; }; /** * The seven grahas ranked by shadbala, strongest first. Rahu and Ketu are not ranked, because shadbala is defined over the seven. */ strengthRanking: Array<{ /** * Graha name, as a Vedic birth chart returns it. */ graha: string; /** * Total shadbala in virupas, the six-fold strength measure. Higher is stronger, and the ranking below is taken from it. */ totalVirupas: number; /** * Position in the ranking, 1 for the strongest of the seven. */ rank: number; /** * Whether this graha reached the strength cutoff and therefore contributed to the reading. More than one true value is what makes the reading a blend. */ strong: boolean; }>; /** * The graha to humour and graha to constituent table, as reference. It is informational and does not vary with the request. */ planetDoshas: Array<{ /** * Graha name, matching the name a Vedic birth chart uses, so this table joins to a chart with nothing in between. */ graha: string; /** * The graha name in Sanskrit, in the standard diacritic transliteration. */ sanskritName: string; /** * The humours the verses give this graha. The Moon and Venus rows carry vata before kapha in both published translations, which is the row material in general circulation most often reverses. */ doshas: Array; /** * The bodily constituent this graha rules, in English. Saturn returns a deliberately neutral rendering, because the one Sanskrit word behind it is attested as sinew, tendon, muscle and nerve alike and the two published translations split on it. */ dhatu: string; /** * The same constituent in Sanskrit. Read this rather than the English wherever the two translations disagree. These seven are not the standard seven dhatus and three of them will not line up against such a list. */ dhatuSanskrit: string; /** * Where one claim in this response comes from. */ doshaSource: { /** * Title of the work the claim is taken from, as it should be cited. */ text: string; /** * Chapter or sthana, as printed in that edition. Use it with the verse to find the passage in any copy. */ chapter: string; /** * Verse or verse range, printed as the source prints it, so it is a string and not always numeric. Where the claim sits in an appended note or a commentary rather than in a numbered verse, this value is prose, as in "note to 20". Join it to the chapter with a dot only when it is numeric, and otherwise render it after the chapter with a comma, so the pair reads "18, note to 20" rather than "18.note to 20". */ verse: string; /** * The named translator, or null where the English shipped here was written from the Sanskrit because no public-domain translation of that work exists. */ translation: string | null; /** * Publication year of the named translation, or null where no translation is cited. Use it with publicDomain to judge what may be quoted. */ year: number | null; /** * Whether the cited translation may be quoted. When false the verse reference is the citation and the translator wording is not reproduced anywhere in this API, so a caller reproducing a source must go to the verse rather than to us. */ publicDomain: boolean; /** * A recorded disagreement between sources, or a stated limit on what the citation covers. Present only where one exists, and never resolved silently in favour of one reading. */ note?: string; }; /** * Where one claim in this response comes from. */ dhatuSource: { /** * Title of the work the claim is taken from, as it should be cited. */ text: string; /** * Chapter or sthana, as printed in that edition. Use it with the verse to find the passage in any copy. */ chapter: string; /** * Verse or verse range, printed as the source prints it, so it is a string and not always numeric. Where the claim sits in an appended note or a commentary rather than in a numbered verse, this value is prose, as in "note to 20". Join it to the chapter with a dot only when it is numeric, and otherwise render it after the chapter with a comma, so the pair reads "18, note to 20" rather than "18.note to 20". */ verse: string; /** * The named translator, or null where the English shipped here was written from the Sanskrit because no public-domain translation of that work exists. */ translation: string | null; /** * Publication year of the named translation, or null where no translation is cited. Use it with publicDomain to judge what may be quoted. */ year: number | null; /** * Whether the cited translation may be quoted. When false the verse reference is the citation and the translator wording is not reproduced anywhere in this API, so a caller reproducing a source must go to the verse rather than to us. */ publicDomain: boolean; /** * A recorded disagreement between sources, or a stated limit on what the citation covers. Present only where one exists, and never resolved silently in favour of one reading. */ note?: string; }; }>; /** * The reading in prose, composed from the factors rather than selected from stock text, and translated in place. */ summary: string; /** * The conventions this reading was produced under. */ conventions: { /** * Which sign table the two sign factors were read through. Echoes the request. */ signDoshaScheme: string; /** * Which sidereal frame the chart was cast in. Echoes the request, and is repeated here beside the other conventions so one object answers what was chosen. */ ayanamsa: string; }; /** * Scope of the response. */ meta: { /** * The scope of everything in this response, in the requested language. Present on every response from this API, and intended to be shown to the reader rather than stripped. */ disclaimer: string; }; }; }; export type CalculateAyurvedicConstitutionResponse = CalculateAyurvedicConstitutionResponses[keyof CalculateAyurvedicConstitutionResponses]; export type GetDinacharyaScheduleData = { body?: AyurvedaDinacharyaRequest; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/ayurveda/dinacharya'; }; export type GetDinacharyaScheduleErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetDinacharyaScheduleError = GetDinacharyaScheduleErrors[keyof GetDinacharyaScheduleErrors]; export type GetDinacharyaScheduleResponses = { /** * The day divided, with the routine the chapter gives. */ 200: { /** * The local date this schedule is for, echoing the request. */ date: string; /** * Sunrise at this place on this date, as an ISO 8601 instant in UTC. The day begins here, which is why every block below is measured from it rather than from midnight. */ sunrise: string; /** * Sunset at this place on this date, as an ISO 8601 instant in UTC. */ sunset: string; /** * The following sunrise, as an ISO 8601 instant in UTC. It closes the night, so the three night blocks are cut between this and the sunset above. */ nextSunrise: string; /** * The pre-dawn window, as a fixed offset from sunrise. It is not scaled to the length of the night, and calculators that scale it are following a reading the commentary rejects. */ brahmaMuhurta: { /** * When the window opens, 96 minutes before sunrise. */ start: string; /** * When the window closes, 48 minutes before sunrise. */ end: string; /** * Length of one muhurta in minutes. Thirty of them make one day AND night together, not thirty in the daylight alone, and reading it the other way doubles every number here. */ muhurtaMinutes: number; /** * Muhurtas in one full day and night. Two texts state this and agree exactly on it while differing on the smaller units. */ muhurtasPerAhoratra: number; /** * Where one claim in this response comes from. */ source: { /** * Title of the work the claim is taken from, as it should be cited. */ text: string; /** * Chapter or sthana, as printed in that edition. Use it with the verse to find the passage in any copy. */ chapter: string; /** * Verse or verse range, printed as the source prints it, so it is a string and not always numeric. Where the claim sits in an appended note or a commentary rather than in a numbered verse, this value is prose, as in "note to 20". Join it to the chapter with a dot only when it is numeric, and otherwise render it after the chapter with a comma, so the pair reads "18, note to 20" rather than "18.note to 20". */ verse: string; /** * The named translator, or null where the English shipped here was written from the Sanskrit because no public-domain translation of that work exists. */ translation: string | null; /** * Publication year of the named translation, or null where no translation is cited. Use it with publicDomain to judge what may be quoted. */ year: number | null; /** * Whether the cited translation may be quoted. When false the verse reference is the citation and the translator wording is not reproduced anywhere in this API, so a caller reproducing a source must go to the verse rather than to us. */ publicDomain: boolean; /** * A recorded disagreement between sources, or a stated limit on what the citation covers. Present only where one exists, and never resolved silently in favour of one reading. */ note?: string; }; }; /** * The six blocks under the convention that was requested, in chronological order. */ doshaPeriods: Array<{ /** * The humour this block belongs to, as the Sanskrit identifier. Never translated, so it stays safe to compare against and to use as a style key. */ dosha: string; /** * When the block opens, as an ISO 8601 instant in UTC. */ start: string; /** * When the block closes, as an ISO 8601 instant in UTC. */ end: string; /** * Whether the block sits in the day or the night. Always English, so it stays safe to switch on. */ span: string; /** * Which third of its half the block is, 1 for the first, 2 for the middle and 3 for the last. Present only on the sunrise-anchored division, because the clock grid divides no actual day and has no thirds to report. */ third?: number; }>; /** * The same six blocks under the other convention, so a caller can show one and reconcile against the other without a second call. */ alternatePeriods: Array<{ /** * The humour this block belongs to, as the Sanskrit identifier. Never translated, so it stays safe to compare against and to use as a style key. */ dosha: string; /** * When the block opens, as an ISO 8601 instant in UTC. */ start: string; /** * When the block closes, as an ISO 8601 instant in UTC. */ end: string; /** * Whether the block sits in the day or the night. Always English, so it stays safe to switch on. */ span: string; /** * Which third of its half the block is, 1 for the first, 2 for the middle and 3 for the last. Present only on the sunrise-anchored division, because the clock grid divides no actual day and has no thirds to report. */ third?: number; }>; /** * The daily sequence the chapter gives, in its own order. */ routine: Array<{ /** * Position in the sequence the chapter gives, starting at 1. */ order: number; /** * Stable identifier for the step. Always English and lowercase, so it is safe to compare against and to key a translation off. */ id: string; /** * The step under its Sanskrit name, in the standard diacritic transliteration. Data rather than a translation, so it is identical under every language. */ sanskritName: string; /** * What the step is, written from the source and translated in place. The chapter also names specific substances and gives lists of who should abstain; neither is carried here. */ guidance: string; /** * Where the step sits in the sequence. Only the first step carries a real offset, because the chapter orders the day rather than scheduling it; the clock for this place is in the fields above. */ timing: string; /** * Where one claim in this response comes from. */ source: { /** * Title of the work the claim is taken from, as it should be cited. */ text: string; /** * Chapter or sthana, as printed in that edition. Use it with the verse to find the passage in any copy. */ chapter: string; /** * Verse or verse range, printed as the source prints it, so it is a string and not always numeric. Where the claim sits in an appended note or a commentary rather than in a numbered verse, this value is prose, as in "note to 20". Join it to the chapter with a dot only when it is numeric, and otherwise render it after the chapter with a comma, so the pair reads "18, note to 20" rather than "18.note to 20". */ verse: string; /** * The named translator, or null where the English shipped here was written from the Sanskrit because no public-domain translation of that work exists. */ translation: string | null; /** * Publication year of the named translation, or null where no translation is cited. Use it with publicDomain to judge what may be quoted. */ year: number | null; /** * Whether the cited translation may be quoted. When false the verse reference is the citation and the translator wording is not reproduced anywhere in this API, so a caller reproducing a source must go to the verse rather than to us. */ publicDomain: boolean; /** * A recorded disagreement between sources, or a stated limit on what the citation covers. Present only where one exists, and never resolved silently in favour of one reading. */ note?: string; }; }>; /** * The day in prose, composed and translated in place. */ summary: string; /** * Every work behind this response, once each. */ sources: Array<{ /** * Title of the work the claim is taken from, as it should be cited. */ text: string; /** * Chapter or sthana, as printed in that edition. Use it with the verse to find the passage in any copy. */ chapter: string; /** * Verse or verse range, printed as the source prints it, so it is a string and not always numeric. Where the claim sits in an appended note or a commentary rather than in a numbered verse, this value is prose, as in "note to 20". Join it to the chapter with a dot only when it is numeric, and otherwise render it after the chapter with a comma, so the pair reads "18, note to 20" rather than "18.note to 20". */ verse: string; /** * The named translator, or null where the English shipped here was written from the Sanskrit because no public-domain translation of that work exists. */ translation: string | null; /** * Publication year of the named translation, or null where no translation is cited. Use it with publicDomain to judge what may be quoted. */ year: number | null; /** * Whether the cited translation may be quoted. When false the verse reference is the citation and the translator wording is not reproduced anywhere in this API, so a caller reproducing a source must go to the verse rather than to us. */ publicDomain: boolean; /** * A recorded disagreement between sources, or a stated limit on what the citation covers. Present only where one exists, and never resolved silently in favour of one reading. */ note?: string; }>; /** * The conventions this schedule was produced under. */ conventions: { /** * Which division the doshaPeriods array holds. Echoes the request; the other one is in alternatePeriods. */ doshaClock: string; }; /** * Scope of the response. */ meta: { /** * The scope of everything in this response, in the requested language. Present on every response from this API, and intended to be shown to the reader rather than stripped. */ disclaimer: string; }; }; }; export type GetDinacharyaScheduleResponse = GetDinacharyaScheduleResponses[keyof GetDinacharyaScheduleResponses]; export type GetRitucharyaData = { body?: AyurvedaRitucharyaRequest; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/ayurveda/ritucharya'; }; export type GetRitucharyaErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetRitucharyaError = GetRitucharyaErrors[keyof GetRitucharyaErrors]; export type GetRitucharyaResponses = { /** * The season, its boundaries, and what the chapter states for it. */ 200: { /** * The date this reading is for, echoing the request. */ date: string; /** * The season in force on this date. */ ritu: { /** * The season as a Sanskrit identifier, always English-safe and never translated. One of sisira, vasanta, grisma, varsa, sarad and hemanta, plus pravrt which only the alternate scheme carries. */ id: string; /** * The season in the standard diacritic transliteration. */ sanskritName: string; /** * The season in Devanagari. Data rather than a translation, so it is identical under every language. */ devanagari: string; /** * What the season is called in the requested language. This is the gloss and it does translate; the identifier above does not. */ gloss: string; /** * The default-scheme season the classical layer was read from. Equal to the id in the ordinary case, and different under the alternate scheme, whose own verse states no strength cycle, taste cycle or dosha cycle for its seasons. */ classicalRitu: string; /** * When the season opened, as an ISO 8601 instant in UTC. This is the ingress into the first of its two solar months, computed rather than tabulated, so it is exact to the second. */ start: string; /** * When the season closes, as an ISO 8601 instant in UTC. It is the ingress that opens the next season, so two consecutive calls join without a gap. */ end: string; /** * The two solar months the season spans, in order. A solar month is the interval the sun spends inside one rasi, which is why every boundary above is an ingress instant. */ solarMonths: Array<{ /** * Zero-based rasi index, 0 for Aries, so a caller can order the twelve without a name table. */ index: number; /** * The rasi as the lowercase English sign id every other RoxyAPI domain uses. */ id: string; /** * The solar month under the name a panchang prints for it. Data, identical in every language. */ sanskritName: string; }>; }; /** * Which course the sun is in. */ ayana: { /** * The half-year course of the sun, as a Sanskrit identifier. Never translated. It names what the sun is doing rather than what the weather is, so it is the same for every observer on the same day and is never rotated for the hemisphere. */ id: string; /** * Where one claim in this response comes from. */ source: { /** * Title of the work the claim is taken from, as it should be cited. */ text: string; /** * Chapter or sthana, as printed in that edition. Use it with the verse to find the passage in any copy. */ chapter: string; /** * Verse or verse range, printed as the source prints it, so it is a string and not always numeric. Where the claim sits in an appended note or a commentary rather than in a numbered verse, this value is prose, as in "note to 20". Join it to the chapter with a dot only when it is numeric, and otherwise render it after the chapter with a comma, so the pair reads "18, note to 20" rather than "18.note to 20". */ verse: string; /** * The named translator, or null where the English shipped here was written from the Sanskrit because no public-domain translation of that work exists. */ translation: string | null; /** * Publication year of the named translation, or null where no translation is cited. Use it with publicDomain to judge what may be quoted. */ year: number | null; /** * Whether the cited translation may be quoted. When false the verse reference is the citation and the translator wording is not reproduced anywhere in this API, so a caller reproducing a source must go to the verse rather than to us. */ publicDomain: boolean; /** * A recorded disagreement between sources, or a stated limit on what the citation covers. Present only where one exists, and never resolved silently in favour of one reading. */ note?: string; }; }; /** * The taking or giving half of the year. */ phase: { /** * Whether the sun is taking or giving across this half of the year, as a Sanskrit identifier. Never translated, and deliberately so: the published translations render the two terms with four different English words between them, so an English value would not be stable enough to compare against. */ id: string; /** * The three tastes that grow across this half of the year, in the order the verse gives them, one per season. This is the sequence the season taste below is one member of. */ tastes: Array<{ /** * The taste as a Sanskrit identifier. Never translated, so it stays safe to compare against and joins straight to the tastes catalogue. */ id: string; /** * The same taste in the standard diacritic transliteration. */ sanskritName: string; /** * The taste in the requested language. This is the gloss and it does translate. */ english: string; }>; /** * Where one claim in this response comes from. */ source: { /** * Title of the work the claim is taken from, as it should be cited. */ text: string; /** * Chapter or sthana, as printed in that edition. Use it with the verse to find the passage in any copy. */ chapter: string; /** * Verse or verse range, printed as the source prints it, so it is a string and not always numeric. Where the claim sits in an appended note or a commentary rather than in a numbered verse, this value is prose, as in "note to 20". Join it to the chapter with a dot only when it is numeric, and otherwise render it after the chapter with a comma, so the pair reads "18, note to 20" rather than "18.note to 20". */ verse: string; /** * The named translator, or null where the English shipped here was written from the Sanskrit because no public-domain translation of that work exists. */ translation: string | null; /** * Publication year of the named translation, or null where no translation is cited. Use it with publicDomain to judge what may be quoted. */ year: number | null; /** * Whether the cited translation may be quoted. When false the verse reference is the citation and the translator wording is not reproduced anywhere in this API, so a caller reproducing a source must go to the verse rather than to us. */ publicDomain: boolean; /** * A recorded disagreement between sources, or a stated limit on what the citation covers. Present only where one exists, and never resolved silently in favour of one reading. */ note?: string; }; }; /** * Where the season sits in the strength cycle. */ strength: { /** * Bodily strength in this season: highest, moderate or lowest. Always English so it stays safe to switch on. The strongest pair is the cold season and the dewy season, which are adjacent in the cycle but sit at opposite ends of the two courses, and that wrap-around is the part a positional reading of the verse gets wrong. */ level: string; /** * Where one claim in this response comes from. */ source: { /** * Title of the work the claim is taken from, as it should be cited. */ text: string; /** * Chapter or sthana, as printed in that edition. Use it with the verse to find the passage in any copy. */ chapter: string; /** * Verse or verse range, printed as the source prints it, so it is a string and not always numeric. Where the claim sits in an appended note or a commentary rather than in a numbered verse, this value is prose, as in "note to 20". Join it to the chapter with a dot only when it is numeric, and otherwise render it after the chapter with a comma, so the pair reads "18, note to 20" rather than "18.note to 20". */ verse: string; /** * The named translator, or null where the English shipped here was written from the Sanskrit because no public-domain translation of that work exists. */ translation: string | null; /** * Publication year of the named translation, or null where no translation is cited. Use it with publicDomain to judge what may be quoted. */ year: number | null; /** * Whether the cited translation may be quoted. When false the verse reference is the citation and the translator wording is not reproduced anywhere in this API, so a caller reproducing a source must go to the verse rather than to us. */ publicDomain: boolean; /** * A recorded disagreement between sources, or a stated limit on what the citation covers. Present only where one exists, and never resolved silently in favour of one reading. */ note?: string; }; }; /** * The taste that grows IN NATURE across this season. It is not the taste to favour: the regimen for the same season is broadly the opposite, which is why this field is never named for a recommendation. */ tasteIncreasing: { /** * The taste as a Sanskrit identifier. Never translated, so it stays safe to compare against and joins straight to the tastes catalogue. */ id: string; /** * The same taste in the standard diacritic transliteration. */ sanskritName: string; /** * The taste in the requested language. This is the gloss and it does translate. */ english: string; /** * Where one claim in this response comes from. */ source: { /** * Title of the work the claim is taken from, as it should be cited. */ text: string; /** * Chapter or sthana, as printed in that edition. Use it with the verse to find the passage in any copy. */ chapter: string; /** * Verse or verse range, printed as the source prints it, so it is a string and not always numeric. Where the claim sits in an appended note or a commentary rather than in a numbered verse, this value is prose, as in "note to 20". Join it to the chapter with a dot only when it is numeric, and otherwise render it after the chapter with a comma, so the pair reads "18, note to 20" rather than "18.note to 20". */ verse: string; /** * The named translator, or null where the English shipped here was written from the Sanskrit because no public-domain translation of that work exists. */ translation: string | null; /** * Publication year of the named translation, or null where no translation is cited. Use it with publicDomain to judge what may be quoted. */ year: number | null; /** * Whether the cited translation may be quoted. When false the verse reference is the citation and the translator wording is not reproduced anywhere in this API, so a caller reproducing a source must go to the verse rather than to us. */ publicDomain: boolean; /** * A recorded disagreement between sources, or a stated limit on what the citation covers. Present only where one exists, and never resolved silently in favour of one reading. */ note?: string; }; }; /** * Which humours the season moves, and how. A season moves at most three of the nine slots and often fewer, so an empty entry for a humour means the cycle simply says nothing about it in this season. */ doshaCycle: Array<{ /** * The humour, as a Sanskrit identifier. Never translated. */ dosha: string; /** * Where the humour stands: accumulating, aggravated or settling. Always English so it stays safe to switch on. The three are positions and qualities rather than complaints, which is what the definitions below say. */ state: string; /** * What the state is, in the requested language, defined by where the humour sits and how it behaves. */ meaning: string; /** * A recorded disagreement about this row, present only where one exists. */ note?: string; }>; /** * What the chapter states for this season. Roughly half its verses leave no item here once substances and clinical procedures are set aside, and those verses are absent rather than padded. */ regimen: Array<{ /** * Stable identifier for the item. Always English and lowercase, so it is safe to compare against. */ id: string; /** * The behaviour item, written from the source and translated in place. Behaviours, qualities and tastes only: the chapter also names specific substances and prescribes clinical procedures, and neither is carried here. */ guidance: string; /** * Where one claim in this response comes from. */ source: { /** * Title of the work the claim is taken from, as it should be cited. */ text: string; /** * Chapter or sthana, as printed in that edition. Use it with the verse to find the passage in any copy. */ chapter: string; /** * Verse or verse range, printed as the source prints it, so it is a string and not always numeric. Where the claim sits in an appended note or a commentary rather than in a numbered verse, this value is prose, as in "note to 20". Join it to the chapter with a dot only when it is numeric, and otherwise render it after the chapter with a comma, so the pair reads "18, note to 20" rather than "18.note to 20". */ verse: string; /** * The named translator, or null where the English shipped here was written from the Sanskrit because no public-domain translation of that work exists. */ translation: string | null; /** * Publication year of the named translation, or null where no translation is cited. Use it with publicDomain to judge what may be quoted. */ year: number | null; /** * Whether the cited translation may be quoted. When false the verse reference is the citation and the translator wording is not reproduced anywhere in this API, so a caller reproducing a source must go to the verse rather than to us. */ publicDomain: boolean; /** * A recorded disagreement between sources, or a stated limit on what the citation covers. Present only where one exists, and never resolved silently in favour of one reading. */ note?: string; }; }>; /** * The season in prose, composed and translated in place. */ summary: string; /** * Every work behind this response, once each. */ sources: Array<{ /** * Title of the work the claim is taken from, as it should be cited. */ text: string; /** * Chapter or sthana, as printed in that edition. Use it with the verse to find the passage in any copy. */ chapter: string; /** * Verse or verse range, printed as the source prints it, so it is a string and not always numeric. Where the claim sits in an appended note or a commentary rather than in a numbered verse, this value is prose, as in "note to 20". Join it to the chapter with a dot only when it is numeric, and otherwise render it after the chapter with a comma, so the pair reads "18, note to 20" rather than "18.note to 20". */ verse: string; /** * The named translator, or null where the English shipped here was written from the Sanskrit because no public-domain translation of that work exists. */ translation: string | null; /** * Publication year of the named translation, or null where no translation is cited. Use it with publicDomain to judge what may be quoted. */ year: number | null; /** * Whether the cited translation may be quoted. When false the verse reference is the citation and the translator wording is not reproduced anywhere in this API, so a caller reproducing a source must go to the verse rather than to us. */ publicDomain: boolean; /** * A recorded disagreement between sources, or a stated limit on what the citation covers. Present only where one exists, and never resolved silently in favour of one reading. */ note?: string; }>; /** * The conventions this reading was produced under. */ conventions: { /** * Which six-season division was applied. Echoes the request. */ ritucharyaScheme: string; /** * Which zodiac the boundaries were measured in. Echoes the request, and the two answers can differ by about 24 days. */ rituZodiac: string; /** * Which half of the world the season names are stated for. Echoes the request and is never inferred from a latitude. */ hemisphere: string; }; /** * Scope of the response. */ meta: { /** * The scope of everything in this response, in the requested language. Present on every response from this API, and intended to be shown to the reader rather than stripped. */ disclaimer: string; }; }; }; export type GetRitucharyaResponse = GetRitucharyaResponses[keyof GetRitucharyaResponses]; export type GetDailyAyurvedaReadingData = { body?: never; path?: never; query: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; /** * Reading date in YYYY-MM-DD format. Past and future dates are both supported, for editorial scheduling and backfill. Defaults to the current day in the timezone parameter. */ date?: string; /** * Latitude in decimal degrees. It sets how long the day and the night actually are, which is what the dosha periods are cut from. */ latitude: number; /** * Longitude in decimal degrees. It sets the clock time of sunrise at this place. */ longitude: number; /** * Selects which day counts as current when date is omitted, and which local day sunrise is computed for. Defaults to UTC, so the reading rolls over at 00:00 UTC. Accepts an IANA name (e.g. "Europe/London"), decimal hours (e.g. 5.5 for IST), or a fixed UTC offset (e.g. "-05:00"). */ timezone?: string; }; url: '/ayurveda/daily'; }; export type GetDailyAyurvedaReadingErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetDailyAyurvedaReadingError = GetDailyAyurvedaReadingErrors[keyof GetDailyAyurvedaReadingErrors]; export type GetDailyAyurvedaReadingResponses = { /** * The day, composed from the routine and the season. */ 200: { /** * The date of this reading. Echoes the date requested, or the current day in the timezone parameter when it was omitted. */ date: string; /** * Sunrise at this place, as an ISO 8601 instant in UTC. */ sunrise: string; /** * Sunset at this place, as an ISO 8601 instant in UTC. */ sunset: string; /** * The pre-dawn window as a fixed offset from sunrise, not a share of the night. */ brahmaMuhurta: { /** * When the window opens, 96 minutes before sunrise. */ start: string; /** * When the window closes, 48 minutes before sunrise. */ end: string; }; /** * The six blocks, cut from the actual day and night at this place into thirds. */ doshaPeriods: Array<{ /** * The humour this block belongs to, as a Sanskrit identifier. */ dosha: string; /** * When the block opens, as an ISO 8601 instant in UTC. */ start: string; /** * When the block closes, as an ISO 8601 instant in UTC. */ end: string; /** * Whether the block sits in the day or the night. */ span: string; }>; /** * The season this date falls in. */ ritu: { /** * The season as a Sanskrit identifier. Never translated. */ id: string; /** * The season in the standard diacritic transliteration. */ sanskritName: string; /** * What the season is called in the requested language. */ gloss: string; /** * When the season opened, as an ISO 8601 instant in UTC. */ start: string; /** * When it closes, as an ISO 8601 instant in UTC. */ end: string; /** * The half-year course of the sun, as a Sanskrit identifier. It names what the sun is doing, so it is the same for every observer on the same day. */ ayana: string; /** * Whether the sun is taking or giving across this half of the year, as a Sanskrit identifier. */ phase: string; /** * Bodily strength in this season: highest, moderate or lowest. Always English so it stays safe to switch on. */ strength: string; /** * The taste that grows in nature across this season, as a Sanskrit identifier. It is what the season brings rather than what to favour in it. */ tasteIncreasing: string; }; /** * Which humours this season moves, and how. A season moves at most three of the nine slots and often fewer. */ doshaCycle: Array<{ /** * The humour, as a Sanskrit identifier. */ dosha: string; /** * Where the season puts it: accumulating, aggravated or settling. Always English so it stays safe to switch on. */ state: string; }>; /** * The day in prose, composed and translated in place. */ summary: string; /** * Every work behind this response, once each. */ sources: Array<{ /** * Title of the work the claim is taken from, as it should be cited. */ text: string; /** * Chapter or sthana, as printed in that edition. Use it with the verse to find the passage in any copy. */ chapter: string; /** * Verse or verse range, printed as the source prints it, so it is a string and not always numeric. Where the claim sits in an appended note or a commentary rather than in a numbered verse, this value is prose, as in "note to 20". Join it to the chapter with a dot only when it is numeric, and otherwise render it after the chapter with a comma, so the pair reads "18, note to 20" rather than "18.note to 20". */ verse: string; /** * The named translator, or null where the English shipped here was written from the Sanskrit because no public-domain translation of that work exists. */ translation: string | null; /** * Publication year of the named translation, or null where no translation is cited. Use it with publicDomain to judge what may be quoted. */ year: number | null; /** * Whether the cited translation may be quoted. When false the verse reference is the citation and the translator wording is not reproduced anywhere in this API, so a caller reproducing a source must go to the verse rather than to us. */ publicDomain: boolean; /** * A recorded disagreement between sources, or a stated limit on what the citation covers. Present only where one exists, and never resolved silently in favour of one reading. */ note?: string; }>; /** * The conventions this reading was produced under. All four are the defaults, stated rather than assumed. */ conventions: { /** * How the six periods were cut. This route always uses the default; the routine route takes the choice. */ doshaClock: string; /** * Which six-season division was applied. This route always uses the default; the season route takes the choice. */ ritucharyaScheme: string; /** * Which zodiac the season boundaries were measured in. This route always uses the default. */ rituZodiac: string; /** * Which half of the world the season name is stated for. This route always uses the default and never infers it from the latitude. */ hemisphere: string; }; /** * Scope of the response. */ meta: { /** * The scope of everything in this response, in the requested language. Present on every response from this API, and intended to be shown to the reader rather than stripped. */ disclaimer: string; }; }; }; export type GetDailyAyurvedaReadingResponse = GetDailyAyurvedaReadingResponses[keyof GetDailyAyurvedaReadingResponses]; export type ListDoshasData = { body?: never; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; /** * Maximum items to return per page. Range: 1-3, default 3. */ limit?: number; /** * Number of items to skip for pagination. Default 0. */ offset?: number; }; url: '/ayurveda/doshas'; }; export type ListDoshasErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type ListDoshasError = ListDoshasErrors[keyof ListDoshasErrors]; export type ListDoshasResponses = { /** * The three doshas. */ 200: { /** * Total number of doshas, which is always three. */ total: number; /** * Maximum doshas returned in this page. */ limit: number; /** * Number of doshas skipped before this page. */ offset: number; /** * The doshas for this page, in the standing order the texts name them. */ doshas: Array<{ /** * The dosha as a Sanskrit identifier: vata, pitta or kapha. Never translated in any language, because a caller switches on it, and a translated dosha name is a different concept rather than the same one in another language. */ id: string; /** * The same name in the standard diacritic transliteration. */ sanskritName: string; /** * The same name in Devanagari. Data, identical in every language. */ devanagari: string; /** * Other names the primary texts use for the same dosha. Data rather than translations, and useful when reading a verse that names one of them instead. */ alsoCalled: Array; /** * The single mahabhuta the classical verses give this dosha. Classically each dosha gets one element, not a pair. */ element: string; /** * The two-element pairing in general modern circulation. It carries no classical citation in this API, which is why it travels in its own field instead of inside the cited one. */ modernElementPair: string; /** * The qualities the frame chapter gives this dosha, each as its Sanskrit word and its gloss. The three sets overlap, so the twenty gunas are not partitioned three ways between them. */ qualities: Array; /** * Identifiers from the twenty gunas for the qualities the guna verse names with the SAME Sanskrit word, so this joins straight to the qualities endpoint. Where the dosha chapter uses a synonym, or a word the guna verse does not carry, the entry is absent rather than mapped by resemblance. */ qualityGunas: Array; /** * Where the dosha sits, in the requested language. */ seats: Array; /** * The seat the chapter singles out above the others. */ specialSeat: string; /** * How the second primary text reads the same list. The two are recorded side by side and never merged, because the special seat of pitta genuinely differs between them. */ seatsVariant: string; /** * What the dosha does when it is even. For vata the text states this for the dosha as a whole; for the other two it states it only through the five sub-doshas, and those are what appear here. */ functions: Array; /** * The five sub-doshas, each with its seat and its work. The five vata NAMES are carried by two texts; every seat and function of the fifteen rests on one chapter alone. */ subDoshas: Array<{ /** * Stable identifier for the sub-dosha. Always English-safe and lowercase, and never translated, so it is safe to compare against. */ id: string; /** * The same name in the standard diacritic transliteration. */ sanskritName: string; /** * The same name in Devanagari. Data rather than a translation, so it is identical under every language. */ devanagari: string; /** * Where the sub-dosha sits, in the requested language. */ seat: string; /** * Where the sub-dosha moves, where the chapter states one. Present on the five vatas and absent elsewhere, because the chapter gives a range of movement only for those. */ moves?: string; /** * What the sub-dosha does, in the requested language. */ function: string; /** * Where one claim in this response comes from. */ source: { /** * Title of the work the claim is taken from, as it should be cited. */ text: string; /** * Chapter or sthana, as printed in that edition. Use it with the verse to find the passage in any copy. */ chapter: string; /** * Verse or verse range, printed as the source prints it, so it is a string and not always numeric. Where the claim sits in an appended note or a commentary rather than in a numbered verse, this value is prose, as in "note to 20". Join it to the chapter with a dot only when it is numeric, and otherwise render it after the chapter with a comma, so the pair reads "18, note to 20" rather than "18.note to 20". */ verse: string; /** * The named translator, or null where the English shipped here was written from the Sanskrit because no public-domain translation of that work exists. */ translation: string | null; /** * Publication year of the named translation, or null where no translation is cited. Use it with publicDomain to judge what may be quoted. */ year: number | null; /** * Whether the cited translation may be quoted. When false the verse reference is the citation and the translator wording is not reproduced anywhere in this API, so a caller reproducing a source must go to the verse rather than to us. */ publicDomain: boolean; /** * A recorded disagreement between sources, or a stated limit on what the citation covers. Present only where one exists, and never resolved silently in favour of one reading. */ note?: string; }; }>; /** * The three states, as positions and qualities. */ states: { /** * The even state, described as a position and a quality rather than as an absence of complaints. */ balanced: string; /** * The first state of the seasonal cycle, described the same way. */ accumulating: string; /** * The second state of the seasonal cycle, described the same way. */ aggravated: string; /** * The qualities that bring the dosha back to even, which is the like-increases-like rule applied in reverse. */ settlesWith: string; /** * Where one claim in this response comes from. */ source: { /** * Title of the work the claim is taken from, as it should be cited. */ text: string; /** * Chapter or sthana, as printed in that edition. Use it with the verse to find the passage in any copy. */ chapter: string; /** * Verse or verse range, printed as the source prints it, so it is a string and not always numeric. Where the claim sits in an appended note or a commentary rather than in a numbered verse, this value is prose, as in "note to 20". Join it to the chapter with a dot only when it is numeric, and otherwise render it after the chapter with a comma, so the pair reads "18, note to 20" rather than "18.note to 20". */ verse: string; /** * The named translator, or null where the English shipped here was written from the Sanskrit because no public-domain translation of that work exists. */ translation: string | null; /** * Publication year of the named translation, or null where no translation is cited. Use it with publicDomain to judge what may be quoted. */ year: number | null; /** * Whether the cited translation may be quoted. When false the verse reference is the citation and the translator wording is not reproduced anywhere in this API, so a caller reproducing a source must go to the verse rather than to us. */ publicDomain: boolean; /** * A recorded disagreement between sources, or a stated limit on what the citation covers. Present only where one exists, and never resolved silently in favour of one reading. */ note?: string; }; }; /** * Where one claim in this response comes from. */ source: { /** * Title of the work the claim is taken from, as it should be cited. */ text: string; /** * Chapter or sthana, as printed in that edition. Use it with the verse to find the passage in any copy. */ chapter: string; /** * Verse or verse range, printed as the source prints it, so it is a string and not always numeric. Where the claim sits in an appended note or a commentary rather than in a numbered verse, this value is prose, as in "note to 20". Join it to the chapter with a dot only when it is numeric, and otherwise render it after the chapter with a comma, so the pair reads "18, note to 20" rather than "18.note to 20". */ verse: string; /** * The named translator, or null where the English shipped here was written from the Sanskrit because no public-domain translation of that work exists. */ translation: string | null; /** * Publication year of the named translation, or null where no translation is cited. Use it with publicDomain to judge what may be quoted. */ year: number | null; /** * Whether the cited translation may be quoted. When false the verse reference is the citation and the translator wording is not reproduced anywhere in this API, so a caller reproducing a source must go to the verse rather than to us. */ publicDomain: boolean; /** * A recorded disagreement between sources, or a stated limit on what the citation covers. Present only where one exists, and never resolved silently in favour of one reading. */ note?: string; }; }>; /** * Every work behind this response, once each. */ sources: Array<{ /** * Title of the work the claim is taken from, as it should be cited. */ text: string; /** * Chapter or sthana, as printed in that edition. Use it with the verse to find the passage in any copy. */ chapter: string; /** * Verse or verse range, printed as the source prints it, so it is a string and not always numeric. Where the claim sits in an appended note or a commentary rather than in a numbered verse, this value is prose, as in "note to 20". Join it to the chapter with a dot only when it is numeric, and otherwise render it after the chapter with a comma, so the pair reads "18, note to 20" rather than "18.note to 20". */ verse: string; /** * The named translator, or null where the English shipped here was written from the Sanskrit because no public-domain translation of that work exists. */ translation: string | null; /** * Publication year of the named translation, or null where no translation is cited. Use it with publicDomain to judge what may be quoted. */ year: number | null; /** * Whether the cited translation may be quoted. When false the verse reference is the citation and the translator wording is not reproduced anywhere in this API, so a caller reproducing a source must go to the verse rather than to us. */ publicDomain: boolean; /** * A recorded disagreement between sources, or a stated limit on what the citation covers. Present only where one exists, and never resolved silently in favour of one reading. */ note?: string; }>; /** * Scope of the response. */ meta: { /** * The scope of everything in this response, in the requested language. Present on every response from this API, and intended to be shown to the reader rather than stripped. */ disclaimer: string; }; }; }; export type ListDoshasResponse = ListDoshasResponses[keyof ListDoshasResponses]; export type GetDoshaData = { body?: never; path: { /** * Dosha identifier, case-insensitive. One of vata, pitta or kapha. */ id: 'vata' | 'pitta' | 'kapha'; }; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/ayurveda/doshas/{id}'; }; export type GetDoshaErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetDoshaError = GetDoshaErrors[keyof GetDoshaErrors]; export type GetDoshaResponses = { /** * The dosha. */ 200: { /** * One dosha with its qualities, seats, pentad and states. */ dosha: { /** * The dosha as a Sanskrit identifier: vata, pitta or kapha. Never translated in any language, because a caller switches on it, and a translated dosha name is a different concept rather than the same one in another language. */ id: string; /** * The same name in the standard diacritic transliteration. */ sanskritName: string; /** * The same name in Devanagari. Data, identical in every language. */ devanagari: string; /** * Other names the primary texts use for the same dosha. Data rather than translations, and useful when reading a verse that names one of them instead. */ alsoCalled: Array; /** * The single mahabhuta the classical verses give this dosha. Classically each dosha gets one element, not a pair. */ element: string; /** * The two-element pairing in general modern circulation. It carries no classical citation in this API, which is why it travels in its own field instead of inside the cited one. */ modernElementPair: string; /** * The qualities the frame chapter gives this dosha, each as its Sanskrit word and its gloss. The three sets overlap, so the twenty gunas are not partitioned three ways between them. */ qualities: Array; /** * Identifiers from the twenty gunas for the qualities the guna verse names with the SAME Sanskrit word, so this joins straight to the qualities endpoint. Where the dosha chapter uses a synonym, or a word the guna verse does not carry, the entry is absent rather than mapped by resemblance. */ qualityGunas: Array; /** * Where the dosha sits, in the requested language. */ seats: Array; /** * The seat the chapter singles out above the others. */ specialSeat: string; /** * How the second primary text reads the same list. The two are recorded side by side and never merged, because the special seat of pitta genuinely differs between them. */ seatsVariant: string; /** * What the dosha does when it is even. For vata the text states this for the dosha as a whole; for the other two it states it only through the five sub-doshas, and those are what appear here. */ functions: Array; /** * The five sub-doshas, each with its seat and its work. The five vata NAMES are carried by two texts; every seat and function of the fifteen rests on one chapter alone. */ subDoshas: Array<{ /** * Stable identifier for the sub-dosha. Always English-safe and lowercase, and never translated, so it is safe to compare against. */ id: string; /** * The same name in the standard diacritic transliteration. */ sanskritName: string; /** * The same name in Devanagari. Data rather than a translation, so it is identical under every language. */ devanagari: string; /** * Where the sub-dosha sits, in the requested language. */ seat: string; /** * Where the sub-dosha moves, where the chapter states one. Present on the five vatas and absent elsewhere, because the chapter gives a range of movement only for those. */ moves?: string; /** * What the sub-dosha does, in the requested language. */ function: string; /** * Where one claim in this response comes from. */ source: { /** * Title of the work the claim is taken from, as it should be cited. */ text: string; /** * Chapter or sthana, as printed in that edition. Use it with the verse to find the passage in any copy. */ chapter: string; /** * Verse or verse range, printed as the source prints it, so it is a string and not always numeric. Where the claim sits in an appended note or a commentary rather than in a numbered verse, this value is prose, as in "note to 20". Join it to the chapter with a dot only when it is numeric, and otherwise render it after the chapter with a comma, so the pair reads "18, note to 20" rather than "18.note to 20". */ verse: string; /** * The named translator, or null where the English shipped here was written from the Sanskrit because no public-domain translation of that work exists. */ translation: string | null; /** * Publication year of the named translation, or null where no translation is cited. Use it with publicDomain to judge what may be quoted. */ year: number | null; /** * Whether the cited translation may be quoted. When false the verse reference is the citation and the translator wording is not reproduced anywhere in this API, so a caller reproducing a source must go to the verse rather than to us. */ publicDomain: boolean; /** * A recorded disagreement between sources, or a stated limit on what the citation covers. Present only where one exists, and never resolved silently in favour of one reading. */ note?: string; }; }>; /** * The three states, as positions and qualities. */ states: { /** * The even state, described as a position and a quality rather than as an absence of complaints. */ balanced: string; /** * The first state of the seasonal cycle, described the same way. */ accumulating: string; /** * The second state of the seasonal cycle, described the same way. */ aggravated: string; /** * The qualities that bring the dosha back to even, which is the like-increases-like rule applied in reverse. */ settlesWith: string; /** * Where one claim in this response comes from. */ source: { /** * Title of the work the claim is taken from, as it should be cited. */ text: string; /** * Chapter or sthana, as printed in that edition. Use it with the verse to find the passage in any copy. */ chapter: string; /** * Verse or verse range, printed as the source prints it, so it is a string and not always numeric. Where the claim sits in an appended note or a commentary rather than in a numbered verse, this value is prose, as in "note to 20". Join it to the chapter with a dot only when it is numeric, and otherwise render it after the chapter with a comma, so the pair reads "18, note to 20" rather than "18.note to 20". */ verse: string; /** * The named translator, or null where the English shipped here was written from the Sanskrit because no public-domain translation of that work exists. */ translation: string | null; /** * Publication year of the named translation, or null where no translation is cited. Use it with publicDomain to judge what may be quoted. */ year: number | null; /** * Whether the cited translation may be quoted. When false the verse reference is the citation and the translator wording is not reproduced anywhere in this API, so a caller reproducing a source must go to the verse rather than to us. */ publicDomain: boolean; /** * A recorded disagreement between sources, or a stated limit on what the citation covers. Present only where one exists, and never resolved silently in favour of one reading. */ note?: string; }; }; /** * Where one claim in this response comes from. */ source: { /** * Title of the work the claim is taken from, as it should be cited. */ text: string; /** * Chapter or sthana, as printed in that edition. Use it with the verse to find the passage in any copy. */ chapter: string; /** * Verse or verse range, printed as the source prints it, so it is a string and not always numeric. Where the claim sits in an appended note or a commentary rather than in a numbered verse, this value is prose, as in "note to 20". Join it to the chapter with a dot only when it is numeric, and otherwise render it after the chapter with a comma, so the pair reads "18, note to 20" rather than "18.note to 20". */ verse: string; /** * The named translator, or null where the English shipped here was written from the Sanskrit because no public-domain translation of that work exists. */ translation: string | null; /** * Publication year of the named translation, or null where no translation is cited. Use it with publicDomain to judge what may be quoted. */ year: number | null; /** * Whether the cited translation may be quoted. When false the verse reference is the citation and the translator wording is not reproduced anywhere in this API, so a caller reproducing a source must go to the verse rather than to us. */ publicDomain: boolean; /** * A recorded disagreement between sources, or a stated limit on what the citation covers. Present only where one exists, and never resolved silently in favour of one reading. */ note?: string; }; }; /** * Every work behind this response, once each. */ sources: Array<{ /** * Title of the work the claim is taken from, as it should be cited. */ text: string; /** * Chapter or sthana, as printed in that edition. Use it with the verse to find the passage in any copy. */ chapter: string; /** * Verse or verse range, printed as the source prints it, so it is a string and not always numeric. Where the claim sits in an appended note or a commentary rather than in a numbered verse, this value is prose, as in "note to 20". Join it to the chapter with a dot only when it is numeric, and otherwise render it after the chapter with a comma, so the pair reads "18, note to 20" rather than "18.note to 20". */ verse: string; /** * The named translator, or null where the English shipped here was written from the Sanskrit because no public-domain translation of that work exists. */ translation: string | null; /** * Publication year of the named translation, or null where no translation is cited. Use it with publicDomain to judge what may be quoted. */ year: number | null; /** * Whether the cited translation may be quoted. When false the verse reference is the citation and the translator wording is not reproduced anywhere in this API, so a caller reproducing a source must go to the verse rather than to us. */ publicDomain: boolean; /** * A recorded disagreement between sources, or a stated limit on what the citation covers. Present only where one exists, and never resolved silently in favour of one reading. */ note?: string; }>; /** * Scope of the response. */ meta: { /** * The scope of everything in this response, in the requested language. Present on every response from this API, and intended to be shown to the reader rather than stripped. */ disclaimer: string; }; }; }; export type GetDoshaResponse = GetDoshaResponses[keyof GetDoshaResponses]; export type ListRasasData = { body?: never; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; /** * Maximum items to return per page. Range: 1-6, default 6. */ limit?: number; /** * Number of items to skip for pagination. Default 0. */ offset?: number; }; url: '/ayurveda/tastes'; }; export type ListRasasErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type ListRasasError = ListRasasErrors[keyof ListRasasErrors]; export type ListRasasResponses = { /** * The six tastes and the matrix. */ 200: { /** * Total number of tastes, which is always six. */ total: number; /** * Maximum tastes returned in this page. */ limit: number; /** * Number of tastes skipped before this page. */ offset: number; /** * The six in the order the verse names them, which the verse then says is the order in which they give strength, most first. The order is a claim rather than a presentation choice, so it is published separately from the page above. */ strengthOrder: Array; /** * The tastes for this page, in the order the root verse names them. */ rasas: Array<{ /** * The taste as a Sanskrit identifier. Never translated, so it stays safe to compare against and to key a lookup on. The six are madhura, amla, lavana, tikta, katu and kashaya. */ id: string; /** * The same name in the standard diacritic transliteration. */ sanskritName: string; /** * The same name in Devanagari. Data, identical in every language. */ devanagari: string; /** * The form the root verse itself uses, where it differs from the identifier. The verse spells the pungent taste one way and the rest of the literature spells it another, and both are carried so a reader checking the Sanskrit does not conclude a row is missing. */ textForm: string; /** * The taste in the requested language. This is the gloss and it does translate. */ english: string; /** * The mahabhutas the taste arises from. Single-sourced, and from an edition that is not public domain, so the reference ships and the wording does not. That edition gives the sweet taste ONE element where material in general circulation gives it a pair. */ elements: Array; /** * The doshas this taste lowers, as Sanskrit identifiers. Each taste lowers exactly three across the three doshas and raises the others, which is the structure that makes the matrix complete. */ decreases: Array; /** * The doshas this taste raises, as Sanskrit identifiers. */ increases: Array; }>; /** * The same eighteen cells indexed by dosha rather than by taste, keyed vata, pitta and kapha. Derived from the rows above rather than restated, so the two views cannot disagree. */ matrix: { [key: string]: { /** * The three tastes that lower this dosha. */ decreasedBy: Array; /** * The three tastes that raise it. */ increasedBy: Array; }; }; /** * Every work behind this response, once each. */ sources: Array<{ /** * Title of the work the claim is taken from, as it should be cited. */ text: string; /** * Chapter or sthana, as printed in that edition. Use it with the verse to find the passage in any copy. */ chapter: string; /** * Verse or verse range, printed as the source prints it, so it is a string and not always numeric. Where the claim sits in an appended note or a commentary rather than in a numbered verse, this value is prose, as in "note to 20". Join it to the chapter with a dot only when it is numeric, and otherwise render it after the chapter with a comma, so the pair reads "18, note to 20" rather than "18.note to 20". */ verse: string; /** * The named translator, or null where the English shipped here was written from the Sanskrit because no public-domain translation of that work exists. */ translation: string | null; /** * Publication year of the named translation, or null where no translation is cited. Use it with publicDomain to judge what may be quoted. */ year: number | null; /** * Whether the cited translation may be quoted. When false the verse reference is the citation and the translator wording is not reproduced anywhere in this API, so a caller reproducing a source must go to the verse rather than to us. */ publicDomain: boolean; /** * A recorded disagreement between sources, or a stated limit on what the citation covers. Present only where one exists, and never resolved silently in favour of one reading. */ note?: string; }>; /** * Scope of the response. */ meta: { /** * The scope of everything in this response, in the requested language. Present on every response from this API, and intended to be shown to the reader rather than stripped. */ disclaimer: string; }; }; }; export type ListRasasResponse = ListRasasResponses[keyof ListRasasResponses]; export type ListGunasData = { body?: never; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; /** * Maximum items to return per page. Range: 1-10, default 10. */ limit?: number; /** * Number of items to skip for pagination. Default 0. */ offset?: number; }; url: '/ayurveda/qualities'; }; export type ListGunasErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type ListGunasError = ListGunasErrors[keyof ListGunasErrors]; export type ListGunasResponses = { /** * The ten pairs and the rule they operate under. */ 200: { /** * Total number of pairs, which is always ten, covering twenty qualities. */ total: number; /** * Maximum pairs returned in this page. */ limit: number; /** * Number of pairs skipped before this page. */ offset: number; /** * The half-verse the whole domain turns on, translated in place. It is stated of ALL things rather than of food, which is why the same sentence governs the dosha states, the taste matrix, the seasonal regimen and the daily routine alike. */ rule: string; /** * The pairs for this page. The root verse names only the first member of each and then says twenty counting their opposites; the opposites and every action word come from the commentaries. */ pairs: Array<{ /** * Position of the pair, 1 to 10, in the order the root verse names the first member of each. */ number: number; /** * One of the twenty qualities. */ a: { /** * The quality as a Sanskrit identifier. Never translated, so it stays safe to compare against and joins straight to the qualityGunas array on each dosha. */ id: string; /** * The same name in the standard diacritic transliteration. */ sanskritName: string; /** * The quality in the requested language. This is the gloss and it does translate. */ english: string; /** * What this quality does, from the one action word the commentary gives each of the twenty. This is what turns the list from a glossary into the mechanism the rest of the domain runs on. */ action: string; /** * The same action word in Sanskrit. Data rather than a translation, so a reader can find the clause it comes from. */ actionSanskrit: string; /** * Which doshas carry this quality, as Sanskrit identifiers, taken from the dosha catalogue rather than restated here. Empty where no dosha carries it under the same Sanskrit word, and note that the three dosha sets overlap, so the twenty are not partitioned three ways. */ doshas: Array; }; /** * One of the twenty qualities. */ b: { /** * The quality as a Sanskrit identifier. Never translated, so it stays safe to compare against and joins straight to the qualityGunas array on each dosha. */ id: string; /** * The same name in the standard diacritic transliteration. */ sanskritName: string; /** * The quality in the requested language. This is the gloss and it does translate. */ english: string; /** * What this quality does, from the one action word the commentary gives each of the twenty. This is what turns the list from a glossary into the mechanism the rest of the domain runs on. */ action: string; /** * The same action word in Sanskrit. Data rather than a translation, so a reader can find the clause it comes from. */ actionSanskrit: string; /** * Which doshas carry this quality, as Sanskrit identifiers, taken from the dosha catalogue rather than restated here. Empty where no dosha carries it under the same Sanskrit word, and note that the three dosha sets overlap, so the twenty are not partitioned three ways. */ doshas: Array; }; /** * A recorded disagreement about this pair, present only where one exists. It is stated rather than resolved silently because the choice changes which dosha the pair joins to. */ note?: string; }>; /** * Every work behind this response, once each. */ sources: Array<{ /** * Title of the work the claim is taken from, as it should be cited. */ text: string; /** * Chapter or sthana, as printed in that edition. Use it with the verse to find the passage in any copy. */ chapter: string; /** * Verse or verse range, printed as the source prints it, so it is a string and not always numeric. Where the claim sits in an appended note or a commentary rather than in a numbered verse, this value is prose, as in "note to 20". Join it to the chapter with a dot only when it is numeric, and otherwise render it after the chapter with a comma, so the pair reads "18, note to 20" rather than "18.note to 20". */ verse: string; /** * The named translator, or null where the English shipped here was written from the Sanskrit because no public-domain translation of that work exists. */ translation: string | null; /** * Publication year of the named translation, or null where no translation is cited. Use it with publicDomain to judge what may be quoted. */ year: number | null; /** * Whether the cited translation may be quoted. When false the verse reference is the citation and the translator wording is not reproduced anywhere in this API, so a caller reproducing a source must go to the verse rather than to us. */ publicDomain: boolean; /** * A recorded disagreement between sources, or a stated limit on what the citation covers. Present only where one exists, and never resolved silently in favour of one reading. */ note?: string; }>; /** * Scope of the response. */ meta: { /** * The scope of everything in this response, in the requested language. Present on every response from this API, and intended to be shown to the reader rather than stripped. */ disclaimer: string; }; }; }; export type ListGunasResponse = ListGunasResponses[keyof ListGunasResponses]; export type GetDailyHexagramData = { body?: { /** * Optional seed for reproducible readings. Same seed + same date = same hexagram every time. Pass any unique identifier (userId, email hash, session token). Omit for anonymous daily readings. */ seed?: string; /** * Date for the reading in YYYY-MM-DD format. Defaults to today (UTC). Useful for viewing past daily readings or pre-generating future ones. */ date?: string; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/iching/daily'; }; export type GetDailyHexagramErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetDailyHexagramError = GetDailyHexagramErrors[keyof GetDailyHexagramErrors]; export type GetDailyHexagramResponses = { /** * Daily hexagram reading with full interpretation */ 200: { /** * Date this daily hexagram is for (YYYY-MM-DD, UTC). */ date: string; /** * Computed seed used for this reading. Same seed always produces the same hexagram. */ seed: string; hexagram: { /** * Hexagram number in King Wen sequence (1-64). */ number: number; /** * Unicode hexagram symbol for display. */ symbol: string; /** * Original Chinese name. */ chinese: string; /** * English translation of the hexagram name. */ english: string; /** * Pinyin romanization with tone marks. */ pinyin: string; /** * Upper trigram (lines 4-6). */ upperTrigram: string; /** * Lower trigram (lines 1-3). */ lowerTrigram: string; /** * The Judgment (Tuan) text, the primary oracle statement of the hexagram offering core guidance. */ judgment: string; /** * The Image (Xiang) text, symbolic guidance derived from the trigram combination describing the ideal action. */ image: string; /** * Modern interpretations across life areas based on ancient I-Ching wisdom. */ interpretation: { /** * General life situation interpretation. */ general: string; /** * Love and relationship guidance. */ love: string; /** * Career and professional interpretation. */ career: string; /** * Decision-making guidance for whether to act, wait, or change course. */ decision: string; /** * Practical wisdom and actionable advice. */ advice: string; }; }; /** * Concise daily message summarizing the hexagram guidance */ dailyMessage: string; }; }; export type GetDailyHexagramResponse = GetDailyHexagramResponses[keyof GetDailyHexagramResponses]; export type CastDailyReadingData = { body?: { /** * Optional seed for reproducible readings. Same seed + same date = same hexagram every time. Pass any unique identifier (userId, email hash, session token). Omit for anonymous daily readings. */ seed?: string; /** * Date for the reading in YYYY-MM-DD format. Defaults to today (UTC). Useful for viewing past daily readings or pre-generating future ones. */ date?: string; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/iching/daily/cast'; }; export type CastDailyReadingErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type CastDailyReadingError = CastDailyReadingErrors[keyof CastDailyReadingErrors]; export type CastDailyReadingResponses = { /** * Complete daily casting with primary and resulting hexagrams */ 200: { /** * Date this daily casting is for (YYYY-MM-DD, UTC). */ date: string; /** * Computed seed for reproducible castings. */ seed: string; hexagram?: { /** * Hexagram number in King Wen sequence (1-64). */ number: number; /** * Unicode hexagram symbol for display. */ symbol: string; /** * Original Chinese name. */ chinese: string; /** * English translation of the hexagram name. */ english: string; /** * Pinyin romanization with tone marks. */ pinyin: string; /** * Upper trigram (lines 4-6). */ upperTrigram: string; /** * Lower trigram (lines 1-3). */ lowerTrigram: string; /** * The Judgment (Tuan) text, the primary oracle statement of the hexagram offering core guidance. */ judgment: string; /** * The Image (Xiang) text, symbolic guidance derived from the trigram combination describing the ideal action. */ image: string; /** * Modern interpretations across life areas based on ancient I-Ching wisdom. */ interpretation: { /** * General life situation interpretation. */ general: string; /** * Love and relationship guidance. */ love: string; /** * Career and professional interpretation. */ career: string; /** * Decision-making guidance for whether to act, wait, or change course. */ decision: string; /** * Practical wisdom and actionable advice. */ advice: string; }; }; /** * Line values (6-9) from bottom to top. 6=old yin (changing), 7=young yang, 8=young yin, 9=old yang (changing). */ lines: Array; /** * Positions of changing lines (1-6, bottom to top). These lines transform yin to yang or vice versa. */ changingLinePositions: Array; /** * The oracle statement and meaning of each line that came up CHANGING, and only those. The changing lines are what the cast is actually about, so this saves a second call to read them and stops a consuming agent from having to invent them. */ changingLines?: Array; /** * Hexagram after transformation (if changing lines present) */ resultingHexagram?: { /** * Hexagram number in King Wen sequence (1-64). */ number: number; /** * Unicode hexagram symbol for display. */ symbol: string; /** * Original Chinese name. */ chinese: string; /** * English translation of the hexagram name. */ english: string; /** * Pinyin romanization with tone marks. */ pinyin: string; /** * Upper trigram (lines 4-6). */ upperTrigram: string; /** * Lower trigram (lines 1-3). */ lowerTrigram: string; /** * The Judgment (Tuan) text, the primary oracle statement of the hexagram offering core guidance. */ judgment: string; /** * The Image (Xiang) text, symbolic guidance derived from the trigram combination describing the ideal action. */ image: string; /** * Modern interpretations across life areas based on ancient I-Ching wisdom. */ interpretation: { /** * General life situation interpretation. */ general: string; /** * Love and relationship guidance. */ love: string; /** * Career and professional interpretation. */ career: string; /** * Decision-making guidance for whether to act, wait, or change course. */ decision: string; /** * Practical wisdom and actionable advice. */ advice: string; }; }; }; }; export type CastDailyReadingResponse = CastDailyReadingResponses[keyof CastDailyReadingResponses]; export type ListHexagramsData = { body?: never; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; /** * Maximum items to return per page. Range: 1-64, default 20. */ limit?: number; /** * Number of items to skip for pagination. Default 0. */ offset?: number; }; url: '/iching/hexagrams'; }; export type ListHexagramsErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type ListHexagramsError = ListHexagramsErrors[keyof ListHexagramsErrors]; export type ListHexagramsResponses = { /** * List of hexagrams with basic information. */ 200: { /** * Total number of I-Ching hexagrams (always 64). */ total: number; /** * Page size used for this response. */ limit: number; /** * Number of hexagrams skipped. Use with limit for pagination. */ offset: number; /** * Hexagrams for the current page. Use /hexagrams/{number} for full details. */ hexagrams: Array; }; }; export type ListHexagramsResponse = ListHexagramsResponses[keyof ListHexagramsResponses]; export type GetRandomHexagramData = { body?: never; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/iching/hexagrams/random'; }; export type GetRandomHexagramErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * No hexagrams available. */ 404: { /** * Human-readable error message. The wording may change, so do not parse it programmatically. Switch on the stable code instead. */ error: string; /** * Machine-readable error code. Stable identifier for programmatic error handling. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself. The same URL in every environment, so it is safe to log, print in a CLI, or paste into a bug report. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetRandomHexagramError = GetRandomHexagramErrors[keyof GetRandomHexagramErrors]; export type GetRandomHexagramResponses = { /** * A random hexagram with full details. */ 200: Hexagram; }; export type GetRandomHexagramResponse = GetRandomHexagramResponses[keyof GetRandomHexagramResponses]; export type LookupHexagramData = { body?: never; path?: never; query: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; /** * Six-digit binary pattern (0=yin/broken, 1=yang/solid) from bottom to top. */ lines: string; }; url: '/iching/hexagrams/lookup'; }; export type LookupHexagramErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * No hexagram found for pattern. */ 404: { /** * Human-readable error message. The wording may change, so do not parse it programmatically. Switch on the stable code instead. */ error: string; /** * Machine-readable error code. Stable identifier for programmatic error handling. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself. The same URL in every environment, so it is safe to log, print in a CLI, or paste into a bug report. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type LookupHexagramError = LookupHexagramErrors[keyof LookupHexagramErrors]; export type LookupHexagramResponses = { /** * Matching hexagram. */ 200: Hexagram; }; export type LookupHexagramResponse = LookupHexagramResponses[keyof LookupHexagramResponses]; export type GetHexagramData = { body?: never; path: { /** * Hexagram number in King Wen sequence (1-64). */ number: number; }; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/iching/hexagrams/{number}'; }; export type GetHexagramErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Hexagram not found. */ 404: { /** * Human-readable error message. The wording may change, so do not parse it programmatically. Switch on the stable code instead. */ error: string; /** * Machine-readable error code. Stable identifier for programmatic error handling. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself. The same URL in every environment, so it is safe to log, print in a CLI, or paste into a bug report. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetHexagramError = GetHexagramErrors[keyof GetHexagramErrors]; export type GetHexagramResponses = { /** * Full hexagram details. */ 200: Hexagram; }; export type GetHexagramResponse = GetHexagramResponses[keyof GetHexagramResponses]; export type CastReadingData = { body?: never; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; /** * Optional seed for reproducible castings. Same seed = same casting every time. Pass any unique identifier (userId, session token, question hash). Omit for random casting. */ seed?: string; }; url: '/iching/cast'; }; export type CastReadingErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type CastReadingError = CastReadingErrors[keyof CastReadingErrors]; export type CastReadingResponses = { /** * Complete I-Ching reading with primary and resulting hexagrams. */ 200: { /** * The seed used for this casting (if provided) */ seed?: string; hexagram?: Hexagram & unknown; /** * Line values (6-9) from bottom to top. 6=old yin (changing), 7=young yang, 8=young yin, 9=old yang (changing) */ lines: Array; /** * Positions of changing lines (1-6, bottom to top) */ changingLinePositions: Array; resultingHexagram?: Hexagram & unknown; }; }; export type CastReadingResponse = CastReadingResponses[keyof CastReadingResponses]; export type ListTrigramsData = { body?: never; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/iching/trigrams'; }; export type ListTrigramsErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type ListTrigramsError = ListTrigramsErrors[keyof ListTrigramsErrors]; export type ListTrigramsResponses = { /** * List of all 8 trigrams with basic information. */ 200: { /** * Total number of I-Ching trigrams (always 8). */ total: number; /** * All 8 trigrams (bagua) with basic details. */ trigrams: Array; }; }; export type ListTrigramsResponse = ListTrigramsResponses[keyof ListTrigramsResponses]; export type GetTrigramData = { body?: never; path: { /** * Trigram number (1-8) or English name (Heaven, Earth, Thunder, Wind, Water, Fire, Mountain, Lake). */ id: string; }; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/iching/trigrams/{id}'; }; export type GetTrigramErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Trigram not found. */ 404: { /** * Human-readable error message. The wording may change, so do not parse it programmatically. Switch on the stable code instead. */ error: string; /** * Machine-readable error code. Stable identifier for programmatic error handling. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself. The same URL in every environment, so it is safe to log, print in a CLI, or paste into a bug report. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetTrigramError = GetTrigramErrors[keyof GetTrigramErrors]; export type GetTrigramResponses = { /** * Trigram details. */ 200: Trigram; }; export type GetTrigramResponse = GetTrigramResponses[keyof GetTrigramResponses]; export type GetCrystalsByZodiacData = { body?: never; path: { /** * Zodiac sign name, case-insensitive (e.g., pisces, Pisces, PISCES all work). Valid: aries, taurus, gemini, cancer, leo, virgo, libra, scorpio, sagittarius, capricorn, aquarius, pisces. */ sign: 'aries' | 'taurus' | 'gemini' | 'cancer' | 'leo' | 'virgo' | 'libra' | 'scorpio' | 'sagittarius' | 'capricorn' | 'aquarius' | 'pisces'; }; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; /** * Maximum items to return per page. Range: 1-30, default 20. */ limit?: number; /** * Number of items to skip for pagination. Default 0. */ offset?: number; }; url: '/crystals/zodiac/{sign}'; }; export type GetCrystalsByZodiacErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetCrystalsByZodiacError = GetCrystalsByZodiacErrors[keyof GetCrystalsByZodiacErrors]; export type GetCrystalsByZodiacResponses = { /** * Paginated list of crystals associated with the zodiac sign */ 200: { /** * The zodiac sign that was queried. */ sign: string; /** * Total number of crystals associated with this zodiac sign. */ total: number; /** * Maximum crystals returned per page. */ limit: number; /** * Number of crystals skipped. */ offset: number; /** * Crystal summaries for this zodiac sign. Call /crystals/{id} for full healing properties. */ crystals: Array<{ /** * Crystal display name. */ name: string; /** * URL-safe crystal identifier for detail lookup. */ id: string; /** * URL to crystal photograph for visual identification. */ imageUrl: string | null; /** * Primary colors of this crystal variety. Null when color data is unavailable. */ colors: Array | null; }>; }; }; export type GetCrystalsByZodiacResponse = GetCrystalsByZodiacResponses[keyof GetCrystalsByZodiacResponses]; export type GetCrystalsByChakraData = { body?: never; path: { /** * Chakra name, case-insensitive (e.g., heart, Heart, HEART all work). Valid: Root, Sacral, Solar Plexus, Heart, Throat, Third Eye, Crown. */ chakra: 'Root' | 'Sacral' | 'Solar Plexus' | 'Heart' | 'Throat' | 'Third Eye' | 'Crown'; }; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; /** * Maximum items to return per page. Range: 1-30, default 20. */ limit?: number; /** * Number of items to skip for pagination. Default 0. */ offset?: number; }; url: '/crystals/chakra/{chakra}'; }; export type GetCrystalsByChakraErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetCrystalsByChakraError = GetCrystalsByChakraErrors[keyof GetCrystalsByChakraErrors]; export type GetCrystalsByChakraResponses = { /** * Paginated list of crystals for the specified chakra */ 200: { /** * The chakra energy center that was queried. */ chakra: string; /** * Total number of crystals associated with this chakra. */ total: number; /** * Maximum crystals returned per page. */ limit: number; /** * Number of crystals skipped. */ offset: number; /** * Crystal summaries for this chakra. Call /crystals/{id} for full healing properties. */ crystals: Array<{ /** * Crystal display name. */ name: string; /** * URL-safe crystal identifier for detail lookup. */ id: string; /** * URL to crystal photograph for visual identification. */ imageUrl: string | null; /** * Primary colors of this crystal variety. Null when color data is unavailable. */ colors: Array | null; }>; }; }; export type GetCrystalsByChakraResponse = GetCrystalsByChakraResponses[keyof GetCrystalsByChakraResponses]; export type GetCrystalsByElementData = { body?: never; path: { /** * Element name, case-insensitive (e.g., water, Water, WATER all work). Valid: Earth, Water, Fire, Air, Storm. */ element: 'Earth' | 'Water' | 'Fire' | 'Air' | 'Storm'; }; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; /** * Maximum items to return per page. Range: 1-30, default 20. */ limit?: number; /** * Number of items to skip for pagination. Default 0. */ offset?: number; }; url: '/crystals/element/{element}'; }; export type GetCrystalsByElementErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetCrystalsByElementError = GetCrystalsByElementErrors[keyof GetCrystalsByElementErrors]; export type GetCrystalsByElementResponses = { /** * Paginated list of crystals for the specified element */ 200: { /** * The element that was queried. */ element: string; /** * Total number of crystals associated with this element. */ total: number; /** * Maximum crystals returned per page. */ limit: number; /** * Number of crystals skipped. */ offset: number; /** * Crystal summaries for this element. Call /crystals/{id} for full healing properties. */ crystals: Array<{ /** * Crystal display name. */ name: string; /** * URL-safe crystal identifier for detail lookup. */ id: string; /** * URL to crystal photograph for visual identification. */ imageUrl: string | null; /** * Primary colors of this crystal variety. Null when color data is unavailable. */ colors: Array | null; }>; }; }; export type GetCrystalsByElementResponse = GetCrystalsByElementResponses[keyof GetCrystalsByElementResponses]; export type GetBirthstonesData = { body?: never; path: { /** * Birth month as a number from 1 (January) to 12 (December). */ month: number; }; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/crystals/birthstone/{month}'; }; export type GetBirthstonesErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetBirthstonesError = GetBirthstonesErrors[keyof GetBirthstonesErrors]; export type GetBirthstonesResponses = { /** * Birthstone crystals for the specified month */ 200: { /** * The month number that was queried (1-12). */ month: number; /** * Full name of the queried month. */ monthName: string; /** * Number of birthstone crystals for this month. */ total: number; /** * Birthstone crystals for this month. Call /crystals/{id} for full healing properties. */ crystals: Array<{ /** * Crystal display name. */ name: string; /** * URL-safe crystal identifier for detail lookup. */ id: string; /** * URL to crystal photograph for visual identification. */ imageUrl: string | null; /** * Primary colors of this crystal variety. Null when color data is unavailable. */ colors: Array | null; }>; }; }; export type GetBirthstonesResponse = GetBirthstonesResponses[keyof GetBirthstonesResponses]; export type SearchCrystalsData = { body?: never; path?: never; query: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; /** * Search query (2-50 characters). Matches against crystal names, keywords, descriptions, and meaning fields. Case-insensitive partial matching. */ q: string; /** * Maximum items to return per page. Range: 1-50, default 20. */ limit?: number; /** * Number of items to skip for pagination. Default 0. */ offset?: number; }; url: '/crystals/search'; }; export type SearchCrystalsErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type SearchCrystalsError = SearchCrystalsErrors[keyof SearchCrystalsErrors]; export type SearchCrystalsResponses = { /** * Crystals matching the search query */ 200: { /** * The search query that was used. */ query: string; /** * Total number of crystals matching the query. */ total: number; /** * Maximum crystals returned per page. */ limit: number; /** * Number of crystals skipped. */ offset: number; /** * Matching crystal summaries. Call /crystals/{id} for full healing properties. */ crystals: Array<{ /** * Crystal display name. */ name: string; /** * URL-safe crystal identifier for detail lookup. */ id: string; /** * URL to crystal photograph for visual identification. */ imageUrl: string | null; /** * Primary colors of this crystal variety. Null when color data is unavailable. */ colors: Array | null; }>; }; }; export type SearchCrystalsResponse = SearchCrystalsResponses[keyof SearchCrystalsResponses]; export type GetCrystalPairingsData = { body?: never; path: { /** * URL-safe crystal identifier to find pairings for, case-insensitive (e.g., "amethyst", "Amethyst", "rose-quartz" all resolve). */ id: string; }; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/crystals/pairings/{id}'; }; export type GetCrystalPairingsErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Crystal not found in database */ 404: { /** * Human-readable error message. The wording may change, so do not parse it programmatically. Switch on the stable code instead. */ error: string; /** * Machine-readable error code. Stable identifier for programmatic error handling. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself. The same URL in every environment, so it is safe to log, print in a CLI, or paste into a bug report. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetCrystalPairingsError = GetCrystalPairingsErrors[keyof GetCrystalPairingsErrors]; export type GetCrystalPairingsResponses = { /** * Crystal pairing recommendations */ 200: { /** * The crystal identifier that pairings were requested for. */ crystal: string; /** * Display name of the source crystal. */ name: string; /** * Number of recommended crystal pairings. */ count: number; /** * Crystals recommended for use alongside the source crystal for synergistic healing. */ pairings: Array<{ /** * Paired crystal display name. */ name: string; /** * URL-safe identifier for the paired crystal. */ id: string; /** * URL to paired crystal photograph. */ imageUrl: string | null; /** * Brief overview of the paired crystal. */ description: string; /** * Chakra associations for the paired crystal. */ chakras: Array; /** * Healing property keywords for the paired crystal. Null when keyword data is unavailable. */ keywords: Array | null; }>; }; }; export type GetCrystalPairingsResponse = GetCrystalPairingsResponses[keyof GetCrystalPairingsResponses]; export type GetDailyCrystalData = { body?: { /** * Optional seed for reproducible readings. Same seed + same date = same crystal every time. Pass any unique identifier (userId, email hash, session token). Omit for anonymous daily readings. */ seed?: string; /** * Date for the reading in YYYY-MM-DD format. Defaults to today (UTC). Useful for viewing past daily readings or pre-generating future ones. */ date?: string; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/crystals/daily'; }; export type GetDailyCrystalErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetDailyCrystalError = GetDailyCrystalErrors[keyof GetDailyCrystalErrors]; export type GetDailyCrystalResponses = { /** * Daily crystal teaser with summary information */ 200: { /** * The date used for crystal selection (UTC). */ date: string; /** * Computed seed used for this reading. Same seed always produces the same crystal. */ seed: string; /** * Display name of the crystal selected for this date. */ name: string; /** * URL-safe identifier. Call /crystals/{id} for full healing properties. */ id: string; /** * URL to crystal photograph. Use for daily crystal card display and visual features. */ imageUrl: string | null; /** * Overview of the crystal covering primary healing purpose and benefits. */ description: string; /** * Chakra energy centers this crystal resonates with for energy healing practice. */ chakras: Array; /** * Zodiac signs this crystal is traditionally associated with. Null when zodiac data is unavailable. */ zodiacSigns: Array | null; /** * Positive affirmation aligned with the selected crystal. Use for daily affirmation features and meditation guidance. */ affirmation: string; }; }; export type GetDailyCrystalResponse = GetDailyCrystalResponses[keyof GetDailyCrystalResponses]; export type GetRandomCrystalData = { body?: never; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/crystals/random'; }; export type GetRandomCrystalErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetRandomCrystalError = GetRandomCrystalErrors[keyof GetRandomCrystalErrors]; export type GetRandomCrystalResponses = { /** * A randomly selected crystal with summary information */ 200: { /** * Display name of the randomly selected crystal. */ name: string; /** * URL-safe identifier. Call /crystals/{id} for full healing properties. */ id: string; /** * URL to crystal photograph for visual display. */ imageUrl: string | null; /** * Overview of the crystal covering primary healing purpose and benefits. */ description: string; /** * Chakra energy centers this crystal resonates with. */ chakras: Array; /** * Zodiac signs this crystal is traditionally associated with. Null when zodiac data is unavailable. */ zodiacSigns: Array | null; /** * Positive affirmation aligned with the selected crystal energy. */ affirmation: string; }; }; export type GetRandomCrystalResponse = GetRandomCrystalResponses[keyof GetRandomCrystalResponses]; export type ListCrystalColorsData = { body?: never; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/crystals/colors'; }; export type ListCrystalColorsErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type ListCrystalColorsError = ListCrystalColorsErrors[keyof ListCrystalColorsErrors]; export type ListCrystalColorsResponses = { /** * All unique crystal colors sorted alphabetically */ 200: { /** * Total number of unique color values in the database. */ count: number; /** * Alphabetically sorted list of all unique crystal colors. Pass any value to the color filter on GET /crystals. */ colors: Array; }; }; export type ListCrystalColorsResponse = ListCrystalColorsResponses[keyof ListCrystalColorsResponses]; export type ListCrystalPlanetsData = { body?: never; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/crystals/planets'; }; export type ListCrystalPlanetsErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type ListCrystalPlanetsError = ListCrystalPlanetsErrors[keyof ListCrystalPlanetsErrors]; export type ListCrystalPlanetsResponses = { /** * All unique planetary associations sorted alphabetically */ 200: { /** * Total number of unique planetary values in the database. */ count: number; /** * Alphabetically sorted list of all unique planetary associations. Pass any value to the planet filter on GET /crystals. */ planets: Array; }; }; export type ListCrystalPlanetsResponse = ListCrystalPlanetsResponses[keyof ListCrystalPlanetsResponses]; export type ListCrystalsData = { body?: never; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; /** * Filter by chakra association, case-insensitive. Valid values: Root, Sacral, Solar Plexus, Heart, Throat, Third Eye, Crown. */ chakra?: 'Root' | 'Sacral' | 'Solar Plexus' | 'Heart' | 'Throat' | 'Third Eye' | 'Crown'; /** * Filter by zodiac sign, case-insensitive. Valid values: aries, taurus, gemini, cancer, leo, virgo, libra, scorpio, sagittarius, capricorn, aquarius, pisces. */ zodiac?: 'aries' | 'taurus' | 'gemini' | 'cancer' | 'leo' | 'virgo' | 'libra' | 'scorpio' | 'sagittarius' | 'capricorn' | 'aquarius' | 'pisces'; /** * Filter by elemental association, case-insensitive. Valid values: Earth, Water, Fire, Air, Storm. */ element?: 'Earth' | 'Water' | 'Fire' | 'Air' | 'Storm'; /** * Filter by crystal color (partial match, case-insensitive). E.g., "pink", "green", "blue", "purple". Use GET /colors for valid values. */ color?: string; /** * Filter by planetary association (partial match, case-insensitive). E.g., "Venus", "Moon", "Jupiter". Use GET /planets for valid values. */ planet?: string; /** * Maximum items to return per page. Range: 1-100, default 20. */ limit?: number; /** * Number of items to skip for pagination. Default 0. */ offset?: number; }; url: '/crystals'; }; export type ListCrystalsErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type ListCrystalsError = ListCrystalsErrors[keyof ListCrystalsErrors]; export type ListCrystalsResponses = { /** * Paginated list of crystals with summary information */ 200: { /** * Total number of crystals matching the filter criteria. */ total: number; /** * Maximum crystals returned per page. */ limit: number; /** * Number of crystals skipped. */ offset: number; /** * Crystal summaries for the current page. */ crystals: Array<{ /** * Crystal display name. */ name: string; /** * URL-safe crystal identifier for detail lookup. */ id: string; /** * URL to crystal photograph for visual identification. */ imageUrl: string | null; /** * Primary colors of this crystal variety. Null when color data is unavailable. */ colors: Array | null; /** * Chakra energy centers this crystal resonates with. One of: Root, Sacral, Solar Plexus, Heart, Throat, Third Eye, Crown. */ chakras: Array; }>; }; }; export type ListCrystalsResponse = ListCrystalsResponses[keyof ListCrystalsResponses]; export type GetCrystalData = { body?: never; path: { /** * URL-safe crystal identifier, case-insensitive (e.g., "amethyst", "Amethyst", "rose-quartz" all resolve). Must match an entry in the database. */ id: string; }; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/crystals/{id}'; }; export type GetCrystalErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Crystal not found in database */ 404: { /** * Human-readable error message. The wording may change, so do not parse it programmatically. Switch on the stable code instead. */ error: string; /** * Machine-readable error code. Stable identifier for programmatic error handling. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself. The same URL in every environment, so it is safe to log, print in a CLI, or paste into a bug report. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetCrystalError = GetCrystalErrors[keyof GetCrystalErrors]; export type GetCrystalResponses = { /** * Complete crystal healing properties with all associations */ 200: { /** * Display name of the crystal or healing stone. */ name: string; /** * URL-safe identifier for the crystal. */ id: string; /** * URL to a high-quality crystal photograph. Use for visual crystal guides, product listings, and crystal identification features. */ imageUrl: string | null; /** * Overview of the crystal covering its primary healing purpose, spiritual significance, and key benefits. */ description: string; /** * Detailed healing interpretations across three areas: spiritual and metaphysical, emotional and psychological, and physical body associations. */ meaning: { /** * Spiritual and metaphysical healing properties including energy work, meditation benefits, and higher consciousness connections. Null when spiritual interpretation is unavailable. */ spiritual: string | null; /** * Emotional healing properties including stress relief, relationship support, and emotional balance benefits. */ emotional: string; /** * Physical healing associations traditionally attributed to this crystal in crystal healing practice. Null when physical healing data is unavailable. */ physical: string | null; }; /** * Chakra energy centers this crystal resonates with. One of: Root, Sacral, Solar Plexus, Heart, Throat, Third Eye, Crown. */ chakras: Array; /** * Zodiac signs this crystal is traditionally associated with. Null when zodiac data is unavailable. Useful for personalized crystal recommendations based on birth chart. */ zodiacSigns: Array | null; /** * Ruling planet or celestial body associated with this crystal in astrological tradition. Null when planetary association is unavailable. */ planet: string | null; /** * Elemental associations (Earth, Water, Fire, Air, Storm) connecting the crystal to natural forces and energy types. Null when elemental data is unavailable. */ elements: Array | null; /** * Primary colors of this crystal variety. Null when color data is unavailable. Useful for color-based crystal selection and filtering. */ colors: Array | null; /** * Mohs hardness scale rating (1-10). Indicates durability for jewelry use. Quartz family is 7, Diamond is 10, Selenite is 2. */ hardness: number; /** * Numerological vibration number linking this crystal to numerology meanings. Connects crystal healing with numerology practice. */ numericalVibration: number; /** * Keywords capturing the core healing properties and spiritual themes of this crystal. The count varies by stone, from a single keyword up to twenty. Null when keyword data is unavailable. */ keywords: Array | null; /** * Birth month (1-12) if this crystal is a traditional birthstone. Null if not a birthstone. January is 1, December is 12. */ birthMonth: number | null; /** * Positive affirmation aligned with this crystal energy. Use for meditation, journaling, or daily affirmation features. */ affirmation: string; /** * Crystal identifiers that pair well with this stone for enhanced healing combinations. Use for crystal grid and pairing recommendations. */ pairsWith: Array; }; }; export type GetCrystalResponse = GetCrystalResponses[keyof GetCrystalResponses]; export type SearchDreamSymbolsData = { body?: never; path?: never; query?: { /** * Search query to match against symbol names and meanings. Case-insensitive. */ q?: string; /** * Filter symbols by starting letter (a-z). Case-insensitive. */ letter?: string; /** * Maximum items to return per page. Range: 1-50, default 20. */ limit?: number; /** * Number of items to skip for pagination. Default 0. */ offset?: number; }; url: '/dreams/symbols'; }; export type SearchDreamSymbolsErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type SearchDreamSymbolsError = SearchDreamSymbolsErrors[keyof SearchDreamSymbolsErrors]; export type SearchDreamSymbolsResponses = { /** * Paginated list of dream symbols with basic information. */ 200: { /** * Total number of dream symbols matching your search or filter criteria. */ total: number; /** * Page size used for this response. */ limit: number; /** * Number of symbols skipped. Use with limit for pagination. */ offset: number; /** * Dream symbols for the current page. Use /symbols/{id} to get full interpretation. */ symbols: Array; }; }; export type SearchDreamSymbolsResponse = SearchDreamSymbolsResponses[keyof SearchDreamSymbolsResponses]; export type GetRandomSymbolsData = { body?: never; path?: never; query?: { /** * Number of random symbols to return (1-10). Default: 1. */ count?: number; }; url: '/dreams/symbols/random'; }; export type GetRandomSymbolsErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetRandomSymbolsError = GetRandomSymbolsErrors[keyof GetRandomSymbolsErrors]; export type GetRandomSymbolsResponses = { /** * Random dream symbol(s) with full interpretations. */ 200: { symbols: Array; }; }; export type GetRandomSymbolsResponse = GetRandomSymbolsResponses[keyof GetRandomSymbolsResponses]; export type GetSymbolLetterCountsData = { body?: never; path?: never; query?: never; url: '/dreams/symbols/letters'; }; export type GetSymbolLetterCountsErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetSymbolLetterCountsError = GetSymbolLetterCountsErrors[keyof GetSymbolLetterCountsErrors]; export type GetSymbolLetterCountsResponses = { /** * Symbol counts organized by starting letter. */ 200: { /** * Map of starting letter to symbol count. Use to build A-Z dream dictionary navigation showing how many dream meanings exist per letter. */ letters: { [key: string]: number; }; /** * Total number of dream symbols in the complete dream interpretation database. */ total: number; }; }; export type GetSymbolLetterCountsResponse = GetSymbolLetterCountsResponses[keyof GetSymbolLetterCountsResponses]; export type GetDreamSymbolData = { body?: never; path: { /** * Unique symbol identifier in kebab-case (e.g., "snake", "being-chased", "teeth-falling-out"). */ id: string; }; query?: never; url: '/dreams/symbols/{id}'; }; export type GetDreamSymbolErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Symbol not found. */ 404: { /** * Human-readable error message. The wording may change, so do not parse it programmatically. Switch on the stable code instead. */ error: string; /** * Machine-readable error code. Stable identifier for programmatic error handling. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself. The same URL in every environment, so it is safe to log, print in a CLI, or paste into a bug report. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetDreamSymbolError = GetDreamSymbolErrors[keyof GetDreamSymbolErrors]; export type GetDreamSymbolResponses = { /** * Full dream symbol with interpretation. */ 200: DreamSymbol; }; export type GetDreamSymbolResponse = GetDreamSymbolResponses[keyof GetDreamSymbolResponses]; export type GetDailyDreamSymbolData = { body?: { /** * Optional seed for reproducible readings. Same seed + same date = same symbol every time. Pass any unique identifier (userId, email hash, session token). Omit for anonymous daily readings. */ seed?: string; /** * Date for the reading in YYYY-MM-DD format. Defaults to today (UTC). Useful for viewing past daily readings or pre-generating future ones. */ date?: string; }; path?: never; query?: never; url: '/dreams/daily'; }; export type GetDailyDreamSymbolErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetDailyDreamSymbolError = GetDailyDreamSymbolErrors[keyof GetDailyDreamSymbolErrors]; export type GetDailyDreamSymbolResponses = { /** * Daily dream symbol with interpretation */ 200: { /** * Date of the daily dream symbol in YYYY-MM-DD format (UTC). Determines which symbol is selected for seeded readings. */ date: string; /** * Seed used for this daily reading. Same seed on the same date always produces the identical symbol. */ seed: string; symbol: { /** * Unique symbol identifier in kebab-case. Use this to fetch full details via /symbols/{id}. */ id: string; /** * Display name of the dream symbol. */ name: string; /** * Starting letter (a-z) for alphabetical navigation. */ letter: string; /** * Full psychological dream interpretation explaining the subconscious symbolism, emotional significance, and waking-life connections. */ meaning: string; }; /** * Concise daily message summarizing the dream symbol and its key themes for quick reflection. */ dailyMessage: string; }; }; export type GetDailyDreamSymbolResponse = GetDailyDreamSymbolResponses[keyof GetDailyDreamSymbolResponses]; export type ListAngelNumbersData = { body?: never; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; /** * Maximum items to return per page. Range: 1-50, default 20. */ limit?: number; /** * Number of items to skip for pagination. Default 0. */ offset?: number; /** * Filter results by angel number pattern type. "repeating" returns numbers like 111, 444, 7777. "sequential" returns patterns like 1234. "mirror" returns palindrome or alternating patterns like 1212, 717. "master" returns 11, 22, 33. "root" returns single digits 0-9. "compound" returns mixed sequences with no pure pattern like 911, 1122. */ type?: 'repeating' | 'sequential' | 'mirror' | 'master' | 'root' | 'compound'; }; url: '/angel-numbers/numbers'; }; export type ListAngelNumbersErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type ListAngelNumbersError = ListAngelNumbersErrors[keyof ListAngelNumbersErrors]; export type ListAngelNumbersResponses = { /** * List of angel numbers with summary information */ 200: { /** * Total number of angel numbers matching the applied filters. The full catalog size when unfiltered, fewer when filtered by type. */ total: number; /** * Maximum items returned per page. */ limit: number; /** * Number of items skipped from the start of the result set. */ offset: number; /** * Array of angel number summaries for the current page. */ numbers: Array<{ /** * Angel number sequence as a string. Common patterns include triple repeating (111-999), quad repeating (1111-9999), master numbers (11, 22, 33), mirror patterns (1212), and sequential numbers (1234). */ number: string; /** * Short descriptive title capturing the core theme and spiritual significance of this angel number. */ title: string; /** * One to two sentence summary of the divine message. Ideal for push notifications, daily guidance widgets, and quick reference lookups. */ coreMessage: string; /** * Pattern classification of the angel number. "repeating" means all digits are the same (111, 4444). "sequential" means consecutive digits (1234). "mirror" means palindrome or alternating pattern (1212, 1221). "master" means numerology master number (11, 22, 33). "root" means single digit (0-9). "compound" means a mixed sequence with no pure pattern (911, 1122). */ type: string; /** * Numerology digit root calculated by summing all digits and reducing to a single digit. Links each angel number to foundational numerology meaning. Master numbers 11, 22, 33 are preserved without further reduction. */ digitRoot: number; /** * Five to eight keywords capturing the spiritual themes and energy of this angel number. Useful for search, filtering, and content generation. */ keywords: Array; /** * Overall energy classification. "positive" indicates encouraging, uplifting energy. "neutral" indicates transitional energy (neither purely positive nor cautionary). "cautionary" indicates a gentle warning to rebalance or pay attention. */ energy: string; }>; }; }; export type ListAngelNumbersResponse = ListAngelNumbersResponses[keyof ListAngelNumbersResponses]; export type GetAngelNumberData = { body?: never; path: { /** * Angel number sequence to look up (e.g., "111", "444", "1212", "1234"). Must match an entry in the database. */ number: string; }; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/angel-numbers/numbers/{number}'; }; export type GetAngelNumberErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Angel number not found in database */ 404: { /** * Human-readable error message. The wording may change, so do not parse it programmatically. Switch on the stable code instead. */ error: string; /** * Machine-readable error code. Stable identifier for programmatic error handling. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself. The same URL in every environment, so it is safe to log, print in a CLI, or paste into a bug report. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetAngelNumberError = GetAngelNumberErrors[keyof GetAngelNumberErrors]; export type GetAngelNumberResponses = { /** * Complete angel number meaning with all interpretations */ 200: { /** * Angel number sequence as a string. Common patterns include triple repeating (111-999), quad repeating (1111-9999), master numbers (11, 22, 33), mirror patterns (1212), and sequential numbers (1234). */ number: string; /** * Short descriptive title capturing the core theme and spiritual significance of this angel number. */ title: string; /** * One to two sentence summary of the divine message. Ideal for push notifications, daily guidance widgets, and quick reference lookups. */ coreMessage: string; /** * Pattern classification of the angel number. "repeating" means all digits are the same (111, 4444). "sequential" means consecutive digits (1234). "mirror" means palindrome or alternating pattern (1212, 1221). "master" means numerology master number (11, 22, 33). "root" means single digit (0-9). "compound" means a mixed sequence with no pure pattern (911, 1122). */ type: string; /** * Numerology digit root calculated by summing all digits and reducing to a single digit. Links each angel number to foundational numerology meaning. Master numbers 11, 22, 33 are preserved without further reduction. */ digitRoot: number; /** * Five to eight keywords capturing the spiritual themes and energy of this angel number. Useful for search, filtering, and content generation. */ keywords: Array; /** * Overall energy classification. "positive" indicates encouraging, uplifting energy. "neutral" indicates transitional energy (neither purely positive nor cautionary). "cautionary" indicates a gentle warning to rebalance or pay attention. */ energy: string; meaning: { /** * Two to three paragraph spiritual interpretation covering divine guidance, higher purpose, and the metaphysical significance of this angel number sequence. */ spiritual: string; /** * Love and relationship interpretation covering singles, couples, and those healing from past relationships. Includes romantic guidance and partnership advice. */ love: string; /** * Career and vocation guidance: professional opportunities, calling, and practical work advice aligned with this angel number energy. Money and finances are returned separately in the money field. */ career: string; /** * Money, finances, and material abundance guidance, kept distinct from career and vocation. Covers income, spending, debt, and prosperity mindset for this angel number. */ money: string; /** * Twin flame connection interpretation covering union, separation, and spiritual growth within the twin flame journey. */ twinFlame: string; }; /** * Biblical and religious perspective on the sequence, framed honestly. States plainly when a number is not a scriptural concept rather than inventing scripture. */ biblical: string; /** * Shadow or cautionary reading: the misuse, over-reliance, or imbalance this sequence can signal. Complements the energy classification. */ shadow: string; /** * Positive affirmation aligned with this angel number. Can be used for daily affirmation features, meditation guidance, or spiritual journal prompts. */ affirmation: string; /** * Three to five specific, actionable steps to take when you see this angel number. Practical spiritual guidance for daily life. */ actionSteps: Array; }; }; export type GetAngelNumberResponse = GetAngelNumberResponses[keyof GetAngelNumberResponses]; export type AnalyzeNumberSequenceData = { body?: never; path?: never; query: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; /** * Number sequence to analyze (1-8 digits). Can be any number the user has encountered: clock times (1111), addresses (717), receipts (888), license plates (4444), or any repeating pattern. */ number: string; /** * Where the number was seen. When supplied, the response adds a contextNote tailoring the reading to the sighting: clock (a glanced time), receipt (a purchase), license-plate (in transit), phone (a call or notification), address (a home or place), price (a total or amount). */ context?: 'clock' | 'receipt' | 'license-plate' | 'phone' | 'address' | 'price'; }; url: '/angel-numbers/lookup'; }; export type AnalyzeNumberSequenceErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type AnalyzeNumberSequenceError = AnalyzeNumberSequenceErrors[keyof AnalyzeNumberSequenceErrors]; export type AnalyzeNumberSequenceResponses = { /** * Complete analysis of the number sequence with pattern classification and meaning */ 200: { /** * The number sequence that was analyzed. */ number: string; /** * Pattern classification detected for this number. "repeating" means all same digits. "sequential" means consecutive ascending or descending. "mirror" means palindrome or alternating pattern. "master" means numerology master number. "root" means single digit. "compound" means a multi-digit sequence with no pure pattern (e.g. 911, 1122). */ type: string; /** * Numerology digit root from summing and reducing all digits. Links to foundational single-digit meaning. Master numbers 11, 22, 33 are preserved. */ digitRoot: number; /** * Total number of digits in the sequence. */ digits: number; /** * Count of unique digits. A repeating number like 111 has 1 unique digit; 1234 has 4. */ uniqueDigits: number; /** * Whether the number reads the same forwards and backwards (e.g., 1221, 1001). */ isPalindrome: boolean; /** * Whether all digits are identical (e.g., 111, 4444, 777). */ isRepeating: boolean; /** * Full angel number meaning if this number exists in the curated database (75+ known sequences). Null if the number is not in the database, in which case use the analysis fields (type, digitRoot) and the digitRootMeaning fallback for interpretation. */ knownMeaning: { /** * Title of the matched angel number meaning. */ title: string; /** * Core message summary. */ coreMessage: string; /** * Energy classification (positive, neutral, cautionary). */ energy: string; /** * Keywords for this angel number. */ keywords: Array; /** * Detailed interpretations across life areas. */ meaning: { /** * Spiritual interpretation covering divine guidance, higher purpose, and metaphysical significance. */ spiritual: string; /** * Love and relationship interpretation for singles, couples, and those healing from past relationships. */ love: string; /** * Career and vocation guidance. Money and finances are returned separately in the money field. */ career: string; /** * Money, finances, and material abundance guidance, distinct from career. */ money: string; /** * Twin flame connection interpretation covering union, separation, and spiritual growth. */ twinFlame: string; }; /** * Biblical and religious perspective, framed honestly. */ biblical: string; /** * Shadow or cautionary reading for this number. */ shadow: string; /** * Positive affirmation for this number. */ affirmation: string; /** * Actionable steps when you see this number. */ actionSteps: Array; } | null; /** * The foundational meaning of this number based on its digit root. Every number reduces to a root digit (0-9) or master number (11, 22, 33), which provides the base interpretation even for unknown sequences. */ digitRootMeaning: { /** * Root digit number (0-9) or master number (11, 22, 33). */ number: string; /** * Title of the root digit meaning in numerology. */ title: string; /** * Core message of the foundational root digit. */ coreMessage: string; /** * Full life-area interpretation of the underlying root digit. For an unknown sequence this is the substantive reading to display, so a synchronicity app never dead-ends on an arbitrary number. */ meaning: { /** * Spiritual interpretation of the root digit, covering divine guidance, higher purpose, and metaphysical significance. */ spiritual: string; /** * Love and relationship interpretation of the root digit, for singles, couples, and those healing from past relationships. */ love: string; /** * Career and vocation guidance for the root digit. Money and finances are returned separately in the money field. */ career: string; /** * Money, finances, and material abundance guidance for the root digit, kept distinct from career. */ money: string; /** * Twin flame interpretation of the root digit, covering union, separation, and spiritual growth. */ twinFlame: string; }; /** * Keywords for the root digit. */ keywords: Array; /** * Affirmation for the root digit. */ affirmation: string; } | null; /** * Present only when the context query parameter is supplied. A short reading layered on top of the meaning that accounts for WHERE the number was seen (clock, receipt, license plate, phone, address, price), since the place of a sighting shifts its emphasis. */ contextNote?: string; }; }; export type AnalyzeNumberSequenceResponse = AnalyzeNumberSequenceResponses[keyof AnalyzeNumberSequenceResponses]; export type GetDailyAngelNumberData = { body?: { /** * Optional seed for reproducible readings. Same seed + same date = same angel number every time. Pass any unique identifier (userId, email hash, session token). Omit for anonymous daily readings. */ seed?: string; /** * Date for the reading in YYYY-MM-DD format. Defaults to today (UTC). Useful for viewing past daily readings or pre-generating future ones. */ date?: string; }; path?: never; query?: { /** * Response language (BCP 47). Supported: en, tr, de, es, hi, pt, fr, ru, zh-Hans, zh-Hant. Defaults to en. Coverage varies by domain, and a field with no translation in the requested language returns English. */ lang?: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; }; url: '/angel-numbers/daily'; }; export type GetDailyAngelNumberErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetDailyAngelNumberError = GetDailyAngelNumberErrors[keyof GetDailyAngelNumberErrors]; export type GetDailyAngelNumberResponses = { /** * Daily angel number with complete interpretation */ 200: { /** * The date used for angel number selection (UTC). */ date: string; /** * Computed seed used for this reading. Same seed always produces the same angel number. */ seed: string; /** * Angel number sequence selected for today. Three or more digit repeating, sequential, or mirror pattern (e.g., 111, 444, 1212). */ number: string; /** * Short descriptive title capturing the core theme and spiritual significance of the daily angel number. */ title: string; /** * One to two sentence summary of the divine message for today. Ideal for push notifications, daily guidance widgets, and quick reference. */ coreMessage: string; /** * Pattern classification of the daily angel number. "repeating" means all digits are the same (111, 4444). "sequential" means consecutive digits (1234). "mirror" means palindrome or alternating pattern (1212, 1221). */ type: string; /** * Numerology digit root calculated by summing all digits and reducing to a single digit. Links the daily angel number to its foundational numerology meaning. */ digitRoot: number; /** * Overall energy classification. "positive" indicates encouraging, uplifting energy. "neutral" indicates transitional energy. "cautionary" indicates a gentle warning to rebalance or pay attention. */ energy: string; /** * Detailed interpretations across life areas for the daily angel number. */ meaning: { /** * Two to three paragraph spiritual interpretation covering divine guidance, higher purpose, and the metaphysical significance of the angel number selected for this date. */ spiritual: string; /** * Love and relationship interpretation covering singles, couples, and those healing from past relationships. Includes romantic guidance and partnership advice. */ love: string; /** * Career and vocation guidance: professional opportunities, calling, and practical work advice. Money and finances are returned separately in the money field. */ career: string; /** * Money, finances, and material abundance guidance, kept distinct from career and vocation. */ money: string; /** * Twin flame connection interpretation covering union, separation, and spiritual growth within the twin flame journey. */ twinFlame: string; }; /** * Biblical and religious perspective on the daily sequence, framed honestly. */ biblical: string; /** * Shadow or cautionary reading for the daily sequence. Complements the energy classification. */ shadow: string; /** * Five to eight keywords capturing the spiritual themes and energy of the daily angel number. Useful for search, filtering, and content generation. */ keywords: Array; /** * Positive affirmation aligned with the daily angel number. Use for daily affirmation features, meditation guidance, or spiritual journal prompts. */ affirmation: string; /** * Three to five specific, actionable steps to take today based on the angel number guidance. Practical spiritual advice for daily life. */ actionSteps: Array; }; }; export type GetDailyAngelNumberResponse = GetDailyAngelNumberResponses[keyof GetDailyAngelNumberResponses]; export type SearchCitiesData = { body?: never; path?: never; query: { /** * Place to search for, written the way a person would. Accepts a bare city (berlin), a city plus country (berlin germany), a comma-qualified place (richfield, utah), a fully qualified place (richfield, utah, united states), or a historic name (bombay, peking, constantinople). Commas are optional, and a qualifier the dataset spells differently, such as USA for United States, still resolves. Matched against city name, alternate names, state or province, and country. Add the state or country whenever the name is common, since that is what separates the six Springfields, and Richfield, Utah from Richfield, Minnesota. */ q: string; /** * Maximum items to return per page. Range: 1-50, default 10. */ limit?: number; /** * Number of items to skip for pagination. Default 0. */ offset?: number; }; url: '/location/search'; }; export type SearchCitiesErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type SearchCitiesError = SearchCitiesErrors[keyof SearchCitiesErrors]; export type SearchCitiesResponses = { /** * Matching places, best match first, with coordinates, IANA timezone and UTC offset */ 200: { /** * Number of places matching the query across all pages, not the number returned in this response. Greater than 1 means the name is ambiguous, so show province and country and let the user confirm before using the result for a chart. */ total: number; /** * Page size used for this response. */ limit: number; /** * Number of places skipped. Use with limit to page through results. */ offset: number; /** * Matching places for the current page, best match first. Ordered by match quality, then population within equal quality: an exact name beats a qualified name such as richfield, utah, which beats a name merely starting with the query, which beats an incidental match on state or country. Take the first entry when total is 1, otherwise disambiguate on province and country. */ cities: Array<{ /** * City name as commonly used. Matches the local or internationally recognized name for the location. */ city: string; /** * State, province, canton, or administrative region. Show it whenever more than one result comes back: it is what separates Richfield, Utah from Richfield, Minnesota, and the six US Springfields from each other. Empty for the small number of places with no administrative division recorded. */ province: string; /** * Full country name in English. */ country: string; /** * ISO 3166-1 alpha-2 country code. Use for filtering cities by country or building country-specific location pickers. */ iso2: string; /** * Geographic latitude in decimal degrees (-90 to 90). Pass directly to birth chart, natal chart, horoscope, synastry, transit, kundli, and panchang API endpoints as the latitude parameter. */ latitude: number; /** * Geographic longitude in decimal degrees (-180 to 180). Pass directly to astrology, horoscope, and panchang API endpoints alongside latitude. */ longitude: number; /** * IANA timezone identifier following the tz database standard (e.g. Europe/Berlin, America/New_York, Asia/Tokyo). Always present. Pass THIS, not the numeric offset, into any chart or panchang request for a past date: the calculation endpoints resolve it to the offset that was actually in force on that date, including historical daylight saving. Also works directly with JavaScript Date, Luxon, day.js, or any date library. */ timezone: string; /** * UTC offset in decimal hours for TODAY at this place, already adjusted for daylight saving. Convenient for displaying local time now. For a birth date or any past date use the `timezone` field instead, since the offset in force then may differ. Examples: 1 for CET, 2 for CEST, -5 for EST, 5.5 for IST, 5.75 for Nepal. */ utcOffset: number; /** * Population estimate for the place. Breaks ties between results of equal match quality, so among several places matching equally well the largest leads. It never outranks a better match, which is why a small town still wins when its name is typed exactly. May be 0 for a hamlet or administrative seat that carries no published figure. */ population: number; }>; }; }; export type SearchCitiesResponse = SearchCitiesResponses[keyof SearchCitiesResponses]; export type ListCountriesData = { body?: never; path?: never; query?: { /** * Maximum items to return per page. Range: 1-250, default 50. */ limit?: number; /** * Number of items to skip for pagination. Default 0. */ offset?: number; }; url: '/location/countries'; }; export type ListCountriesErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type ListCountriesError = ListCountriesErrors[keyof ListCountriesErrors]; export type ListCountriesResponses = { /** * Alphabetically sorted list of all countries with ISO codes and city counts */ 200: { /** * Total number of countries with at least one place in the dataset. */ total: number; /** * Page size used for this response. */ limit: number; /** * Number of countries skipped. Use with limit for pagination. */ offset: number; /** * Countries for the current page, sorted alphabetically by name. */ countries: Array<{ /** * Full country name in English. Use for display in location pickers and dropdown menus. */ name: string; /** * ISO 3166-1 alpha-2 country code. Use as the identifier when fetching cities for a specific country via the /countries/{iso2} endpoint. */ iso2: string; /** * ISO 3166-1 alpha-3 country code. Three-letter standard used in international data exchange. */ iso3: string; /** * Number of searchable places in this country, including small towns and administrative seats. Useful for showing coverage in a UI or sizing a dependent city dropdown. */ cityCount: number; }>; }; }; export type ListCountriesResponse = ListCountriesResponses[keyof ListCountriesResponses]; export type GetCitiesByCountryData = { body?: never; path: { /** * ISO 3166-1 alpha-2 country code, case-insensitive. Common codes: DE (Germany), FR (France), GB (United Kingdom), US (United States), ES (Spain), IT (Italy), NL (Netherlands), IN (India), BR (Brazil), JP (Japan). */ iso2: string; }; query?: { /** * Maximum items to return per page. Range: 1-100, default 20. */ limit?: number; /** * Number of items to skip for pagination. Default 0. */ offset?: number; }; url: '/location/countries/{iso2}'; }; export type GetCitiesByCountryErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetCitiesByCountryError = GetCitiesByCountryErrors[keyof GetCitiesByCountryErrors]; export type GetCitiesByCountryResponses = { /** * Cities in the specified country, sorted by population (largest first) */ 200: { /** * Total number of places available for this country across all pages. */ total: number; /** * Page size used for this response. */ limit: number; /** * Number of cities skipped. Use with limit for pagination. */ offset: number; /** * Cities for the current page, sorted by population (largest first). */ cities: Array<{ /** * City name as commonly used. Matches the local or internationally recognized name for the location. */ city: string; /** * State, province, canton, or administrative region. Show it whenever more than one result comes back: it is what separates Richfield, Utah from Richfield, Minnesota, and the six US Springfields from each other. Empty for the small number of places with no administrative division recorded. */ province: string; /** * Full country name in English. */ country: string; /** * ISO 3166-1 alpha-2 country code. Use for filtering cities by country or building country-specific location pickers. */ iso2: string; /** * Geographic latitude in decimal degrees (-90 to 90). Pass directly to birth chart, natal chart, horoscope, synastry, transit, kundli, and panchang API endpoints as the latitude parameter. */ latitude: number; /** * Geographic longitude in decimal degrees (-180 to 180). Pass directly to astrology, horoscope, and panchang API endpoints alongside latitude. */ longitude: number; /** * IANA timezone identifier following the tz database standard (e.g. Europe/Berlin, America/New_York, Asia/Tokyo). Always present. Pass THIS, not the numeric offset, into any chart or panchang request for a past date: the calculation endpoints resolve it to the offset that was actually in force on that date, including historical daylight saving. Also works directly with JavaScript Date, Luxon, day.js, or any date library. */ timezone: string; /** * UTC offset in decimal hours for TODAY at this place, already adjusted for daylight saving. Convenient for displaying local time now. For a birth date or any past date use the `timezone` field instead, since the offset in force then may differ. Examples: 1 for CET, 2 for CEST, -5 for EST, 5.5 for IST, 5.75 for Nepal. */ utcOffset: number; /** * Population estimate for the place. Breaks ties between results of equal match quality, so among several places matching equally well the largest leads. It never outranks a better match, which is why a small town still wins when its name is typed exactly. May be 0 for a hamlet or administrative seat that carries no published figure. */ population: number; }>; }; }; export type GetCitiesByCountryResponse = GetCitiesByCountryResponses[keyof GetCitiesByCountryResponses]; export type GetUsageStatsData = { body?: never; path?: never; query?: never; url: '/usage'; }; export type GetUsageStatsErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Subscription not found */ 404: { error: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type GetUsageStatsError = GetUsageStatsErrors[keyof GetUsageStatsErrors]; export type GetUsageStatsResponses = { /** * Usage statistics retrieved */ 200: { /** * Name of the subscription plan the API key belongs to. One flat plan covers every domain and the Remote MCP servers, so this is a quota tier, never a per product entitlement. */ plan: string; /** * Billable requests counted against the current calendar month. The quota window is the UTC calendar month and resets on the 1st at 12:00 AM UTC, never on your renewal date, so an annual plan refills every month and a plan bought mid month still refills on the 1st. Read from the durable request ledger, which can trail the live limiter by up to 5 minutes; for the exact live position read the X-RateLimit-Used header on any response, including this one. Cached responses still count. */ usedThisMonth: number; /** * Monthly request allowance for the plan. One request, API or MCP, equals one unit: there is no credit weighting and no per domain fee. */ requestsPerMonth: number; /** * Requests left before the monthly allowance is exhausted, floored at zero. Equal to requestsPerMonth minus usedThisMonth. Refills at the calendar month rollover, whose exact instant every API response carries as a Unix timestamp in the X-RateLimit-Reset header. */ remainingThisMonth: number; /** * Billing email the subscription is registered under. */ email: string; /** * Subscription lifecycle state. Values: active, cancelled (no longer renewing but usable until endDate), suspended (payment failed, usable until endDate), expired (past endDate), pending (checkout started, payment not captured). */ status: string; /** * ISO 8601 timestamp when the current billing period ends. A renewal extends this date in place. API access survives a cancelled or suspended status until this moment passes. This is a BILLING date, not a quota date: the monthly allowance resets on the 1st of each month independently of it. */ endDate: string; }; }; export type GetUsageStatsResponse = GetUsageStatsResponses[keyof GetUsageStatsResponses]; export type ListLanguagesData = { body?: never; path?: never; query?: never; url: '/languages'; }; export type ListLanguagesErrors = { /** * Validation error. `issues[]` lists every failed field. */ 400: { /** * First issue summary. */ error: string; code: 'validation_error'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Every validation failure. Use this to rebuild a valid request. */ issues: Array<{ /** * Dot-separated field path, or "(root)" for top-level. */ path: string; message: string; /** * Zod issue code (invalid_type, too_small, too_big, invalid_string, ...). */ code?: string; /** * Expected type for invalid_type. */ expected?: string; /** * Minimum bound for too_small issues. */ minimum?: number | string; /** * Maximum bound for too_big issues. */ maximum?: number | string; inclusive?: boolean; /** * Format name for string issues (regex, email, url, uuid). */ format?: string; /** * Regex pattern when format is regex. */ pattern?: string; }>; }; /** * Invalid or missing API key */ 401: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Method not allowed. The path exists but only responds to the methods listed in `allow[]` and the `Allow` response header. */ 405: { error: string; code: 'method_not_allowed'; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; /** * Allowed HTTP methods for this path. Mirrors the Allow response header. */ allow: Array; /** * Link to the product page for this domain. */ docs?: string; }; /** * Monthly rate limit exceeded */ 429: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; /** * Internal server error */ 500: { /** * Human-readable error message. May change wording. */ error: string; /** * Machine-readable error code. Stable identifier. */ code: string; /** * Absolute URL of the documented explanation of this code, anchored at the code itself, for example https://roxyapi.com/docs/errors#not_found. */ doc_url: string; }; }; export type ListLanguagesError = ListLanguagesErrors[keyof ListLanguagesErrors]; export type ListLanguagesResponses = { /** * Supported languages */ 200: { /** * All language codes accepted by the `lang` query parameter. */ languages: Array<{ /** * ISO 639-1 language code. Pass this value as the `lang` query parameter. */ code: 'en' | 'tr' | 'de' | 'es' | 'hi' | 'pt' | 'fr' | 'ru' | 'zh-Hans' | 'zh-Hant'; /** * Language name in English. */ name: string; /** * Language name written in the language itself. */ nativeName: string; }>; }; }; export type ListLanguagesResponse = ListLanguagesResponses[keyof ListLanguagesResponses]; //# sourceMappingURL=types.gen.d.ts.map