Skip to content
AstroWay/api v2.19.0 · docs
all systems operational
UA EN

Calculation Accuracy

AstroWay API uses Swiss Ephemeris (the official C code by Astrodienst, creators of astro.com) — the same engine professional astrologers have trusted for 30+ years inside Solar Fire ($495), Kepler ($995), Astro Gold ($29.99/mo), and Janus. We compile it to WebAssembly and expose it as a REST API, without the middleman markup. Every core calculation endpoint is covered by regression snapshot tests; engine precision is verified through triangulation against three independent sources, plus NASA 5-Millennium Eclipse Catalog:

  • Planet positions: < 0.1 arcsec vs official swetest CGI at Astrodienst
  • Placidus house cusps: 0.000" exact match
  • Eclipses: < 1 minute vs NASA 5-Millennium Eclipse Catalog
  • ACG lines: < 1.5 km at the equator vs swetest
  • Sunrise/sunset: < 10 seconds vs timeanddate.com
  • Moon VOC, ingresses, planet conjunctions: sub-second precision
ComponentValue
LibrarySwiss Ephemeris C code (aloistr/swisseph)
Versionupstream Astrodienst C code
Bindingsswisseph-wasm (WebAssembly, Node.js)
EphemerisDE431 JPL ephemeris (via .se1 files)
FallbackMoshier analytical (for dates outside 1800-2399)
Code sharingShared @/core with app.astroway.info — one engine, two transports

Accuracy is verified through triangulation — comparison against three independent sources:

The official Swiss Ephemeris reference implementation hosted by Astrodienst — the team behind Astro.com, which serves millions of astrologers worldwide. The most authoritative public reference. Our engine is identical (0.00–0.07 arcsec drift).

An independent Python library using pyswisseph bindings instead of our WASM. Confirms that our WASM layer does not distort the data.

A remote Swiss Ephemeris API (sidereal Lahiri). Systemic drift of 8–17 arcsec is caused by different Lahiri ayanamsa formula versions — not by engine accuracy.

Chartvs swetest (Astrodienst)vs Kerykeion (Python)vs Prokerala API
Monroe 19260.00”0.19”16.95” (systemic)
Diana 19610.00”0.69”8.18” (systemic)
Einstein 18790.07”Kerykeion LMT artifact14.96” (systemic)

Each of the core calculation endpoints is covered by frozen snapshot tests on 3 reference charts (Monroe / Diana / Einstein) = 561 snapshots.

The snapshot suite catches:

  • Input-mapping bugs — wrong planet id, UT, house system
  • Post-processing — rounding, unit conversion, sign loss
  • Defaults divergence — mean vs true node, geocentric vs topocentric
  • Schema drift — validation let through a wrong shape
  • Stale deploy — prod dist out of sync with code

Default tolerance: 5e-5° (≈0.18 arcsec) for all numeric fields.

ChartDateMax drift
Marilyn Monroe1926-06-010.00”
Princess Diana1961-07-010.00”
Albert Einstein1879-03-140.07”
ChartASC driftMC driftMax cusp drift
Monroe0.000”0.000”0.000”
Diana0.000”0.000”0.000”
EventNASA maxOurs maxDrift
2025-03-14 Lunar Total06:58 UT06:58 UT0.8 min
2025-03-29 Solar Partial10:47 UT10:47 UT0.5 min
2025-09-07 Lunar Total18:11 UT18:11 UT0.8 min
2025-09-21 Solar Partial19:41 UT19:42 UT1.0 min

All MC/IC/ASC/DSC lines use the correct longitude = RA - GMST formula (Kenneth Bowser standard). Drift from authoritative: < 1.5 km at the equator for all planets.

LocationDateParameterDrift
London2026-04-15Sunrise0.6 sec
London2026-04-15Sunset9 sec

Polar locations (|lat| > 66.5°) automatically return polarState + a warning that regular planetary hours are undefined.

AstroWay uses variable per-planet orbs (MIN-of-two-planets rule), as in ZET9 and astro.com. Default orbs (natal chart):

AspectSunMoonInnerJupiterOuter
Conjunction12°10°
Sextile6.5°
Square10°
Trine12°
Opposition12°10°

Minor aspects (36°, 40°, 45°, 72°, 108°, 135°, 144°) are off by default. Enable explicitly via ALL_ASPECTS.

For |lat| > 66.5° the Placidus/Koch/Regiomontanus systems are mathematically undefined. In that case Swiss Ephemeris automatically falls back to Porphyry, and our API adds a warning:

{
"system": "P",
"warning": "Placidus system is undefined for lat=68.96° (> 66.5°). Swiss Ephemeris fell back to Porphyry..."
}

Regression is checked on every PR through CI:

  • api-calc/tests/endpoints/ — 561 snapshots against reference charts (Monroe / Diana / Einstein) + synastry / composite / davison
  • .github/workflows/api-accuracy.yml — auto-run on PR
  • Triangulation against swetest CGI + Kerykeion — weekly
  • Upstream Swiss Ephemeris monitoring via Dependabot
  • Extreme dates (before 1800 and after 2399): uses Moshier analytical, precision ~0.1” (vs < 0.01” for SWIEPH with DE431 files)
  • True Lilith (id=13) vs Mean Lilith (id=12): up to 12° difference — the default is Mean Lilith (stable behavior), True Lilith is available via planetIds: [13]
  • Topocentric vs geocentric: geocentric by default

Accuracy issues: report via support@astroway.info with chart data + expected reference (from astro.com or similar authoritative source).

Was this helpful?
Suggest an edit

Last updated: