| Measure | Value |
| Median difference | 0.046″ |
| 95th percentile | 0.232″ |
| Within half an arcsecond | 79 of 80 |
| Largest difference | 2.929″ (Moon, 2050, explained below) |
For scale: one arcsecond is 1/3600 of a degree. A chart shown to two decimal places of a degree rounds at 36 arcseconds, so every difference on this page is far below what any chart displays. The Moon, the fastest body, moves about 0.55 arcseconds per second of time.
Method
Asterwise side. The tropical longitudes below are what POST /v1/western/natal returns for each instant: the engine at commit 2c25ab9, the build serving production when the page was generated, run with the same Swiss Ephemeris data files. The API returns longitude as an unrounded float; nothing here is rounded before the comparison. Location was set to latitude 0, longitude 0, which does not affect geocentric planetary positions.
Reference side. The Horizons API, observer table, centre 500@399 (geocentre), quantity 31, apparent airless positions, times given as Julian Day UT. That returns the observer-centred ecliptic-of-date longitude, the same quantity the Swiss Ephemeris returns by default. Horizons draws each body from its own JPL solution, listed in the per-body table.
What is not on this page. Horizons has no ayanamsa, so sidereal (Vedic) positions cannot be checked against it directly. Asterwise derives them by subtracting the Lahiri ayanamsa, in the Swiss Ephemeris definition, from the tropical longitude verified here; the ayanamsa is a convention rather than an observable. House cusps and the ascendant are also outside Horizons' scope. Both are covered on the reference-chart page, which compares the full Vedic and Western output against a direct Swiss Ephemeris calculation. Rahu is a mean lunar node, not a body Horizons tabulates, and is omitted.
Per body
| Body | Largest difference | Median | JPL solution used by Horizons |
| Sun | 0.196″ | 0.038″ | DE441 |
| Moon | 2.929″ | 0.110″ | DE441 |
| Mercury | 0.431″ | 0.040″ | DE441 |
| Venus | 0.232″ | 0.037″ | DE441 |
| Mars | 0.095″ | 0.039″ | mar099 |
| Jupiter | 0.123″ | 0.050″ | jup365_merged |
| Saturn | 0.095″ | 0.046″ | sat441l |
| Uranus | 0.254″ | 0.066″ | ura184_merged |
| Neptune | 0.107″ | 0.064″ | nep098_merged |
| Pluto | 0.091″ | 0.043″ | plu060_merged |
The one outlier
The Moon on 30 June 2050 differs by 2.929 arcseconds; every other comparison is under half an arcsecond. Converting a civil time to the dynamical time an ephemeris runs on requires ΔT, which is measured for the past and only extrapolated for the future. The Swiss Ephemeris uses 74.58 seconds of ΔT for that date; at the Moon's rate of motion, 2.929 arcseconds corresponds to the two systems disagreeing on ΔT by roughly five seconds. That is consistent with an extrapolation difference and is the most likely cause, though we have not obtained JPL's value to confirm it. It will not affect any 2050 date until 2050 arrives and ΔT is measured.
All 80 comparisons
Longitudes in degrees along the ecliptic of date, 0 to 360. The difference is Asterwise minus Horizons, in arcseconds.
1 January 1950, 00:00 UTC — JD 2433282.50000
| Body | Asterwise | JPL Horizons | Difference |
| Sun | 280.004856° | 280.004830° | +0.093″ |
| Moon | 61.415434° | 61.415409° | +0.090″ |
| Mercury | 299.447278° | 299.447252° | +0.093″ |
| Venus | 316.979503° | 316.979477° | +0.092″ |
| Mars | 182.211223° | 182.211197° | +0.095″ |
| Jupiter | 306.505359° | 306.505325° | +0.123″ |
| Saturn | 169.437441° | 169.437422° | +0.069″ |
| Uranus | 92.682791° | 92.682721° | +0.254″ |
| Neptune | 197.266065° | 197.266039° | +0.093″ |
| Pluto | 137.798387° | 137.798381° | +0.021″ |
20 July 1969, 20:17 UTC (Apollo 11 landing) — JD 2440423.34514
| Body | Asterwise | JPL Horizons | Difference |
| Sun | 117.910743° | 117.910730° | +0.046″ |
| Moon | 187.873761° | 187.873753° | +0.028″ |
| Mercury | 115.842911° | 115.842899° | +0.044″ |
| Venus | 75.037422° | 75.037409° | +0.048″ |
| Mars | 242.773295° | 242.773283° | +0.042″ |
| Jupiter | 180.746241° | 180.746224° | +0.060″ |
| Saturn | 38.097998° | 38.097996° | +0.009″ |
| Uranus | 180.690021° | 180.690001° | +0.072″ |
| Neptune | 236.022925° | 236.022908° | +0.063″ |
| Pluto | 173.007183° | 173.007187° | -0.015″ |
12 November 1985, 01:15 UTC (the reference birth on the proof page, 06:45 IST) — JD 2446381.55208
| Body | Asterwise | JPL Horizons | Difference |
| Sun | 229.596712° | 229.596703° | +0.033″ |
| Moon | 221.838294° | 221.838343° | -0.176″ |
| Mercury | 252.179085° | 252.179075° | +0.036″ |
| Venus | 213.031980° | 213.031972° | +0.030″ |
| Mars | 189.652427° | 189.652416° | +0.039″ |
| Jupiter | 309.615962° | 309.615951° | +0.040″ |
| Saturn | 239.403370° | 239.403365° | +0.019″ |
| Uranus | 256.518242° | 256.518228° | +0.051″ |
| Neptune | 271.812678° | 271.812662° | +0.056″ |
| Pluto | 215.278855° | 215.278852° | +0.012″ |
1 January 2000, 12:00 UTC (J2000.0) — JD 2451545.00000
| Body | Asterwise | JPL Horizons | Difference |
| Sun | 280.368919° | 280.368909° | +0.035″ |
| Moon | 223.323751° | 223.323786° | -0.126″ |
| Mercury | 271.889277° | 271.889270° | +0.026″ |
| Venus | 241.565788° | 241.565779° | +0.031″ |
| Mars | 327.963303° | 327.963292° | +0.039″ |
| Jupiter | 25.253088° | 25.253069° | +0.070″ |
| Saturn | 40.395663° | 40.395637° | +0.095″ |
| Uranus | 314.809187° | 314.809168° | +0.068″ |
| Neptune | 303.193012° | 303.193001° | +0.041″ |
| Pluto | 251.454777° | 251.454764° | +0.045″ |
21 December 2012, 11:11 UTC — JD 2456282.96597
| Body | Asterwise | JPL Horizons | Difference |
| Sun | 269.999566° | 269.999556° | +0.036″ |
| Moon | 14.237498° | 14.237524° | -0.093″ |
| Mercury | 254.698232° | 254.698223° | +0.032″ |
| Venus | 246.586142° | 246.586133° | +0.034″ |
| Mars | 296.427710° | 296.427699° | +0.039″ |
| Jupiter | 68.900779° | 68.900776° | +0.012″ |
| Saturn | 218.661038° | 218.661031° | +0.024″ |
| Uranus | 4.641019° | 4.641001° | +0.064″ |
| Neptune | 330.813461° | 330.813448° | +0.046″ |
| Pluto | 278.949404° | 278.949379° | +0.091″ |
8 April 2024, 18:17 UTC (total solar eclipse) — JD 2460409.26181
| Body | Asterwise | JPL Horizons | Difference |
| Sun | 19.397805° | 19.397794° | +0.041″ |
| Moon | 19.360237° | 19.360251° | -0.049″ |
| Mercury | 24.799567° | 24.799554° | +0.048″ |
| Venus | 4.441790° | 4.441779° | +0.040″ |
| Mars | 343.049346° | 343.049334° | +0.041″ |
| Jupiter | 49.045165° | 49.045141° | +0.086″ |
| Saturn | 344.454959° | 344.454938° | +0.075″ |
| Uranus | 51.170990° | 51.170986° | +0.015″ |
| Neptune | 358.190056° | 358.190038° | +0.065″ |
| Pluto | 301.967628° | 301.967612° | +0.058″ |
5 September 2026, 00:00 UTC (the day this page was generated) — JD 2461288.50000
| Body | Asterwise | JPL Horizons | Difference |
| Sun | 162.466157° | 162.466148° | +0.032″ |
| Moon | 81.376246° | 81.376294° | -0.171″ |
| Mercury | 170.075740° | 170.075734° | +0.021″ |
| Venus | 206.256930° | 206.256921° | +0.032″ |
| Mars | 105.919210° | 105.919200° | +0.036″ |
| Jupiter | 134.534411° | 134.534400° | +0.040″ |
| Saturn | 13.446075° | 13.446053° | +0.080″ |
| Uranus | 65.682488° | 65.682490° | -0.006″ |
| Neptune | 3.566514° | 3.566495° | +0.068″ |
| Pluto | 303.441539° | 303.441528° | +0.041″ |
30 June 2050, 12:00 UTC — JD 2469988.00000
| Body | Asterwise | JPL Horizons | Difference |
| Sun | 98.922069° | 98.922015° | +0.196″ |
| Moon | 224.357974° | 224.357160° | +2.929″ |
| Mercury | 110.984285° | 110.984165° | +0.431″ |
| Venus | 140.969345° | 140.969280° | +0.232″ |
| Mars | 325.337280° | 325.337276° | +0.013″ |
| Jupiter | 127.214993° | 127.214987° | +0.023″ |
| Saturn | 307.531895° | 307.531896° | -0.004″ |
| Uranus | 167.209741° | 167.209811° | -0.253″ |
| Neptune | 57.383267° | 57.383237° | +0.107″ |
| Pluto | 340.610638° | 340.610659° | -0.075″ |
Reproduce it
The script queries Horizons live, runs the Swiss Ephemeris directly, and, if you set an Asterwise API key, calls the public endpoint so you can confirm the same numbers arrive over HTTP. A free key is enough. The Asterwise and Swiss Ephemeris columns agree to 0.0020 arcseconds, which is floating-point noise; the Horizons column is the independent check.
pip install pyswisseph requests
curl -O https://asterwise.com/public/accuracy/compare.py
SE_EPHE_PATH=/path/to/swisseph/ephe ASTERWISE_API_KEY=aw_... python3 compare.py
The Swiss Ephemeris data files are not bundled with pyswisseph; download sepl_18.se1, semo_18.se1 and sepl_24.se1 from the ephe directory of the Swiss Ephemeris repository (the location astro.com's own download page points to) and point SE_EPHE_PATH at them. Without them the library falls back to its built-in Moshier ephemeris, which is less precise than the files Asterwise runs on, and the Swiss Ephemeris column will drift from this page.
Downloads: raw comparison data (JSON) · compare.py. The Horizons responses are fetched live, so your run can differ from this page by hundredths of an arcsecond if JPL revises an ephemeris.