Accuracy
Accuracy and calculation method
Summary
0.24″
Largest difference from JPL
any body, Swiss Ephemeris files
201
Moments compared
per body, 1900 to 2100
0.68 s
Delta T against JPL
past dates, largest
Method
How positions are calculated
Ephemeris
Planet positions come from the Swiss Ephemeris (version 2.10.03, through pyswisseph 2.10.3.2), used under its Professional licence. Positions are apparent and geocentric: corrected for light-time, aberration and light deflection, on the true ecliptic and equinox of date (with nutation). Planets are the centres of mass of their systems, the Swiss Ephemeris default.
Time
You send a local date-time and an IANA time zone. We resolve the zone's historical offset and daylight saving for that date (and report an ambiguous or skipped local time) to get Universal Time, then add Delta T to get the Terrestrial Time the ephemeris runs on. Delta T comes from the Swiss Ephemeris model.
Ayanamsha
A sidereal longitude is the tropical longitude minus the ayanamsha of your request. Chart capabilities accept 51 sidereal ayanamshas plus tropical (Sayana); Lahiri (Chitrapaksha) is the default and KP uses Krishnamurti. House cusps follow the same ayanamsha as the planets. An unknown ayanamsha is refused with a
422, never silently replaced. The ayanamsha is a definition, not something a reference ephemeris can measure, so the comparison below is in tropical longitude.Lunar nodes
Rahu is the true (osculating) node by default; send
"node": "mean"for the mean node. Ketu is always opposite Rahu. Horizons publishes no lunar node, so the nodes are not part of the comparison.Geocentric by default
Charts use geocentric positions, as classical practice does. The relocation capabilities of the location astrology family can compute topocentric positions (corrected for parallax at the observer) when you set
topocentric.
Comparison
Compared with NASA JPL Horizons
We compared the geocentric apparent ecliptic longitude of the Sun, the Moon and the planets from Mercury to Pluto with JPL Horizons (quantity 31, "ObsEcLon", geocentre), at one moment in each year from 1900 to 2100. The day and hour in each year are drawn from a fixed seed, so every run uses the same moments. Both sides are evaluated at the same Terrestrial Time, so the figures measure the ephemeris and the apparent-place reduction; Delta T is checked separately below. Reference values fetched 27 October 2026.
Swiss Ephemeris files (sepl_18.se1, semo_18.se1)
The data files the deployed API uses (see below).
| Body | Largest | Mean | RMS |
|---|---|---|---|
| Sun | 0.24″ | 0.09″ | 0.11″ |
| Moon | 0.24″ | 0.09″ | 0.11″ |
| Mercury | 0.24″ | 0.09″ | 0.11″ |
| Venus | 0.24″ | 0.09″ | 0.11″ |
| Mars | 0.24″ | 0.09″ | 0.11″ |
| Jupiter | 0.24″ | 0.09″ | 0.11″ |
| Saturn | 0.24″ | 0.09″ | 0.11″ |
| Uranus | 0.24″ | 0.09″ | 0.11″ |
| Neptune | 0.24″ | 0.09″ | 0.11″ |
| Pluto | 0.24″ | 0.09″ | 0.11″ |
JPL DE441 read by the Swiss Ephemeris
NASA's DE441 read by the Swiss Ephemeris itself.
| Body | Largest | Mean | RMS |
|---|---|---|---|
| Sun | 0.24″ | 0.09″ | 0.11″ |
| Moon | 0.24″ | 0.09″ | 0.11″ |
| Mercury | 0.24″ | 0.09″ | 0.11″ |
| Venus | 0.24″ | 0.09″ | 0.11″ |
| Mars | 0.24″ | 0.09″ | 0.11″ |
| Jupiter | 0.24″ | 0.09″ | 0.11″ |
| Saturn | 0.24″ | 0.09″ | 0.11″ |
| Uranus | 0.24″ | 0.09″ | 0.11″ |
| Neptune | 0.24″ | 0.09″ | 0.11″ |
| Pluto | 0.24″ | 0.09″ | 0.11″ |
Moshier (built-in analytic ephemeris)
The built-in fallback when no data files are installed.
| Body | Largest | Mean | RMS |
|---|---|---|---|
| Sun | 0.32″ | 0.09″ | 0.11″ |
| Moon | 2.10″ | 0.54″ | 0.69″ |
| Mercury | 0.30″ | 0.09″ | 0.11″ |
| Venus | 0.44″ | 0.10″ | 0.12″ |
| Mars | 0.52″ | 0.11″ | 0.15″ |
| Jupiter | 0.42″ | 0.13″ | 0.16″ |
| Saturn | 0.50″ | 0.15″ | 0.19″ |
| Uranus | 0.51″ | 0.21″ | 0.24″ |
| Neptune | 2.16″ | 0.61″ | 0.94″ |
| Pluto | 1.33″ | 0.40″ | 0.51″ |
Reading the figures
- One arc-second is 1/3600 of a degree. A nakshatra pada spans 3°20′, which is 12,000″; the Moon moves about half an arc-second every second of time.
- With the Swiss Ephemeris files and with JPL's own DE441 file the residual is the same for every body (at most 0.24″ and 0.24″), and it is largest at the start of the range, in 1900. Because the DE441 run reads the same planetary data Horizons uses, this common residual comes from the reduction to apparent place rather than from the positions: Horizons states IAU 1976/1980 precession and nutation for this quantity, and the Swiss Ephemeris uses newer models.
- The Moshier fallback stays within 2.16″. The Swiss Ephemeris switches to it silently when its data files are missing, which is why we check which one the deployed API uses.
Which ephemeris the live API uses
On 27 October 2026 we asked the live API (capability planet-positions, tropical) for the Moon and Neptune at 2 moments where the Swiss Ephemeris files and the Moshier fallback disagree by more than the API's four-decimal output. Every answer matched the Swiss Ephemeris data files. The check is tools/accuracy/probe_deployed.py.
Delta T
Dates you send are civil time, so every result also depends on Delta T, the difference between Terrestrial Time and Universal Time. For the 127 past moments in the set, the Swiss Ephemeris value differs from the one Horizons uses by 0.13 s on average and 0.68 s at most, which moves the Moon by at most about 0.37″. For future dates Delta T is a prediction in every ephemeris (Horizons holds its last prediction constant), so we do not compare it there.
What this does not measure
These figures check planetary positions. They do not check the astrological rules built on them: dashas, yogas, matching scores and the rest. Those are covered by the calculation engine's own test suite and by an audit we ran while mapping every engine operation to this API in October 2026. It logged 39 findings, from misread fields and silently substituted defaults to tables with wrong entries. One example: a packed degrees-and-minutes field was read as decimal degrees in many derived calculations (upagrahas, special lagnas, KP sub-lords, sahams), an error of up to 0.4°. Every finding was either fixed in the engine with a regression test or kept out of the public API until it was; planet positions, divisional charts and dashas did not change in the fix of that field. Changes that alter results are listed in the changelog.
Run it yourself
The script needs Python and pyswisseph, and downloads the JPL values once (they are also committed next to it, so a re-run can be checked offline):
python tools/accuracy/compare_jpl.py --se1-dir path/to/ephe --jpl-file path/to/de441.eph
python tools/accuracy/probe_deployed.py --se1-dir path/to/epheResults generated 27 October 2026. Reference: NASA JPL Horizons, https://ssd.jpl.nasa.gov/api/horizons.api (API version 1.2). Questions about a specific chart? Contact support with the request ID.



