Skip to content
96Astro API

Accuracy

Accuracy and calculation method

How the 96Astro API computes planet positions, and how they compare with NASA JPL Horizons at 201 moments from 1900 to 2100. The comparison is a script in our repository, so anyone can run it again.

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).

Difference from JPL Horizons in arc-seconds, Swiss Ephemeris files (sepl_18.se1, semo_18.se1)
BodyLargestMeanRMS
Sun0.24″0.09″0.11″
Moon0.24″0.09″0.11″
Mercury0.24″0.09″0.11″
Venus0.24″0.09″0.11″
Mars0.24″0.09″0.11″
Jupiter0.24″0.09″0.11″
Saturn0.24″0.09″0.11″
Uranus0.24″0.09″0.11″
Neptune0.24″0.09″0.11″
Pluto0.24″0.09″0.11″

JPL DE441 read by the Swiss Ephemeris

NASA's DE441 read by the Swiss Ephemeris itself.

Difference from JPL Horizons in arc-seconds, JPL DE441 read by the Swiss Ephemeris
BodyLargestMeanRMS
Sun0.24″0.09″0.11″
Moon0.24″0.09″0.11″
Mercury0.24″0.09″0.11″
Venus0.24″0.09″0.11″
Mars0.24″0.09″0.11″
Jupiter0.24″0.09″0.11″
Saturn0.24″0.09″0.11″
Uranus0.24″0.09″0.11″
Neptune0.24″0.09″0.11″
Pluto0.24″0.09″0.11″

Moshier (built-in analytic ephemeris)

The built-in fallback when no data files are installed.

Difference from JPL Horizons in arc-seconds, Moshier (built-in analytic ephemeris)
BodyLargestMeanRMS
Sun0.32″0.09″0.11″
Moon2.10″0.54″0.69″
Mercury0.30″0.09″0.11″
Venus0.44″0.10″0.12″
Mars0.52″0.11″0.15″
Jupiter0.42″0.13″0.16″
Saturn0.50″0.15″0.19″
Uranus0.51″0.21″0.24″
Neptune2.16″0.61″0.94″
Pluto1.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):

Terminal
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/ephe

Results 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.