Calculation engine
Every number this API returns comes from an ephemeris, not a lookup table and not a model. This is what is underneath, and where we draw the line on what we will not compute.
The ephemeris
Positions come from the NASA JPL planetary ephemeris — the same data set used for spacecraft navigation — through the Swiss Ephemeris. That is 105 MB of tabulated positions covering 500–2999 AD, plus 735 fixed stars.
It matters because the alternative is arithmetic that is close enough for a newspaper column and not for a chart. Mean-motion formulae drift by degrees over centuries; a birth in 1890 or 2090 is where that shows up, and a divisional chart is where it becomes a different answer rather than a slightly different one. At D60, half a degree moves a planet into the next division.
Sidereal, and which sidereal
Vedic astrology is sidereal: positions are measured from a fixed starting point in the sky rather than from the moving equinox. The offset between the two is the ayanamsa, currently around 24°, and there is no single agreed value for it.
So it is a parameter. 48 ayanamsas are accepted — Lahiri, Raman, Krishnamurti, Fagan-Bradley, Yukteshwar, Suryasiddhanta and the rest — and Lahiri is the default because it is the Indian government standard, not because it is the correct one.
{
"date_time": "1990-08-15T10:30:00+05:30",
"latitude": 26.9124,
"longitude": 75.7873,
"timezone_as_float": 5.5,
"ayanamsa": "KRISHNAMURTI"
}Two practitioners who disagree about the ayanamsa can both use this API and both get the chart they expect. An API that hard-codes one has quietly taken a side in an argument that is not settled.
What it covers
309 endpoints, grouped by what they compute:
Speed
Median server time is 65 ms, with 69% of endpoints under 100 ms, measured across every published example against a local run. The ephemeris is memory-mapped, so the cost of a chart is the arithmetic rather than the disk.
Where a call is slower it is because the work is genuinely larger — a transit search scans a date range, and a PDF report assembles around twenty-five endpoints into one document and bills as a single call.
Determinism
The same input returns the same output, always. There is no sampling and no model in the path, so a chart cast today and the same chart cast next year are byte-identical. That is what makes the responses cacheable, and it is what lets 1,106 test functions assert exact values rather than ranges.
It also means a disagreement is checkable. If our Moon and your software’s Moon differ, one of the two is wrong and the ayanamsa or the timezone will say which — rather than both being “about right”.
What we will not compute
The engine can produce a number for almost anything. Some of those numbers would not mean what a reader takes them to mean, and those endpoints do not exist.
- Lal Kitab ancestral debts. The eight debts are named consistently across sources. The conditions that raise each one are not — published rules for pitra rin alone give different answers for the same chart. We will not publish a verdict about someone’s ancestors that rests on which book we happened to read.
- Fields we cannot derive a rule for. Where a competitor returns a value we could not establish from a source, the field is absent and the response says why, rather than carrying a plausible guess a caller would have no way to check.
- Anything presented as medical, legal or financial advice. Remedial text is traditional attribution and is labelled as such.
Where two schools genuinely disagree and both are defensible, the response says which one it applied — so the answer can be checked rather than taken.
Try it
curl -X POST https://api.occultapi.com/api/astro/planet-positions/ \
-H 'X-API-Key: yt_live_your_key_here' \
-H 'Content-Type: application/json' \
-d '{
"date_time": "1990-08-15T10:30:00+05:30",
"latitude": 26.9124,
"longitude": 75.7873,
"timezone_as_float": 5.5,
"ayanamsa": "LAHIRI"
}'Or run it in the playground without writing any code.