Checked against NASA JPL Horizons

Asterwise computes positions with the Swiss Ephemeris. This page checks that output against a source that shares no code with it: Horizons, the ephemeris service of NASA's Jet Propulsion Laboratory. 80 geocentric longitudes, 10 bodies at 8 instants between 1950 and 2050, generated on 5 September 2026.

MeasureValue
Median difference0.046″
95th percentile0.232″
Within half an arcsecond79 of 80
Largest difference2.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

BodyLargest differenceMedianJPL solution used by Horizons
Sun0.196″0.038″DE441
Moon2.929″0.110″DE441
Mercury0.431″0.040″DE441
Venus0.232″0.037″DE441
Mars0.095″0.039″mar099
Jupiter0.123″0.050″jup365_merged
Saturn0.095″0.046″sat441l
Uranus0.254″0.066″ura184_merged
Neptune0.107″0.064″nep098_merged
Pluto0.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
BodyAsterwiseJPL HorizonsDifference
Sun280.004856°280.004830°+0.093″
Moon61.415434°61.415409°+0.090″
Mercury299.447278°299.447252°+0.093″
Venus316.979503°316.979477°+0.092″
Mars182.211223°182.211197°+0.095″
Jupiter306.505359°306.505325°+0.123″
Saturn169.437441°169.437422°+0.069″
Uranus92.682791°92.682721°+0.254″
Neptune197.266065°197.266039°+0.093″
Pluto137.798387°137.798381°+0.021″
20 July 1969, 20:17 UTC (Apollo 11 landing) — JD 2440423.34514
BodyAsterwiseJPL HorizonsDifference
Sun117.910743°117.910730°+0.046″
Moon187.873761°187.873753°+0.028″
Mercury115.842911°115.842899°+0.044″
Venus75.037422°75.037409°+0.048″
Mars242.773295°242.773283°+0.042″
Jupiter180.746241°180.746224°+0.060″
Saturn38.097998°38.097996°+0.009″
Uranus180.690021°180.690001°+0.072″
Neptune236.022925°236.022908°+0.063″
Pluto173.007183°173.007187°-0.015″
12 November 1985, 01:15 UTC (the reference birth on the proof page, 06:45 IST) — JD 2446381.55208
BodyAsterwiseJPL HorizonsDifference
Sun229.596712°229.596703°+0.033″
Moon221.838294°221.838343°-0.176″
Mercury252.179085°252.179075°+0.036″
Venus213.031980°213.031972°+0.030″
Mars189.652427°189.652416°+0.039″
Jupiter309.615962°309.615951°+0.040″
Saturn239.403370°239.403365°+0.019″
Uranus256.518242°256.518228°+0.051″
Neptune271.812678°271.812662°+0.056″
Pluto215.278855°215.278852°+0.012″
1 January 2000, 12:00 UTC (J2000.0) — JD 2451545.00000
BodyAsterwiseJPL HorizonsDifference
Sun280.368919°280.368909°+0.035″
Moon223.323751°223.323786°-0.126″
Mercury271.889277°271.889270°+0.026″
Venus241.565788°241.565779°+0.031″
Mars327.963303°327.963292°+0.039″
Jupiter25.253088°25.253069°+0.070″
Saturn40.395663°40.395637°+0.095″
Uranus314.809187°314.809168°+0.068″
Neptune303.193012°303.193001°+0.041″
Pluto251.454777°251.454764°+0.045″
21 December 2012, 11:11 UTC — JD 2456282.96597
BodyAsterwiseJPL HorizonsDifference
Sun269.999566°269.999556°+0.036″
Moon14.237498°14.237524°-0.093″
Mercury254.698232°254.698223°+0.032″
Venus246.586142°246.586133°+0.034″
Mars296.427710°296.427699°+0.039″
Jupiter68.900779°68.900776°+0.012″
Saturn218.661038°218.661031°+0.024″
Uranus4.641019°4.641001°+0.064″
Neptune330.813461°330.813448°+0.046″
Pluto278.949404°278.949379°+0.091″
8 April 2024, 18:17 UTC (total solar eclipse) — JD 2460409.26181
BodyAsterwiseJPL HorizonsDifference
Sun19.397805°19.397794°+0.041″
Moon19.360237°19.360251°-0.049″
Mercury24.799567°24.799554°+0.048″
Venus4.441790°4.441779°+0.040″
Mars343.049346°343.049334°+0.041″
Jupiter49.045165°49.045141°+0.086″
Saturn344.454959°344.454938°+0.075″
Uranus51.170990°51.170986°+0.015″
Neptune358.190056°358.190038°+0.065″
Pluto301.967628°301.967612°+0.058″
5 September 2026, 00:00 UTC (the day this page was generated) — JD 2461288.50000
BodyAsterwiseJPL HorizonsDifference
Sun162.466157°162.466148°+0.032″
Moon81.376246°81.376294°-0.171″
Mercury170.075740°170.075734°+0.021″
Venus206.256930°206.256921°+0.032″
Mars105.919210°105.919200°+0.036″
Jupiter134.534411°134.534400°+0.040″
Saturn13.446075°13.446053°+0.080″
Uranus65.682488°65.682490°-0.006″
Neptune3.566514°3.566495°+0.068″
Pluto303.441539°303.441528°+0.041″
30 June 2050, 12:00 UTC — JD 2469988.00000
BodyAsterwiseJPL HorizonsDifference
Sun98.922069°98.922015°+0.196″
Moon224.357974°224.357160°+2.929″
Mercury110.984285°110.984165°+0.431″
Venus140.969345°140.969280°+0.232″
Mars325.337280°325.337276°+0.013″
Jupiter127.214993°127.214987°+0.023″
Saturn307.531895°307.531896°-0.004″
Uranus167.209741°167.209811°-0.253″
Neptune57.383267°57.383237°+0.107″
Pluto340.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.