For developers

Build on the classical sky

Compute sidereal charts, daśās, yogas and aspects, and query the AI-audited classical rule graph behind every reading. Authenticate with an X-API-Key header, or with a Bearer session while signed in. Base URL https://atri.living.

Two surfaces. The Chart API computes a sidereal chart; the Corpus API browses the classical-rules graph behind every reading.

Auth. Every call needs an X-API-Key header or a Bearer session.

Corpus envelope. { data, meta } with limit/offset/has_more pagination.

Honest caveat. Corpus rules are OCR + LLM-extracted, currently uncited, and can be noisy — filter with min_confidence.

Try it live

Request tester

Send real requests against your account and inspect the response. Sign in (top right) or paste an API key to authenticate; otherwise requests return 401.

POST/api/chart
// The response will appear here.

API keys

Reference

Every endpoint requires authentication — a valid X-API-Key header or a Authorization: Bearer <session> token. Readings and chat are softened for people; /api/rules returns the raw classical text.

Chart & compute

POST/api/chartAPI key or session

Compute a full sidereal chart — ascendant, planets, houses, aspects, conjunctions, Vimśottari daśās, and yogas. No LLM.

Request

namestringrequiredSubject name (echoed back).
dobstringrequiredDate of birth, YYYY-MM-DD.
tobstringrequiredTime of birth, HH:MM (24h).
locationstringoptionalPlace of birth; geocoded server-side if lat/lon are omitted.
latnumberoptionalLatitude — skips geocoding when set with lon.
lonnumberoptionalLongitude — skips geocoding when set with lat.

Example request

{ "name": "John Doe", "dob": "1991-11-14", "tob": "04:42", "location": "Pune, India" }

Response

{
  "name": "John Doe",
  "metadata": { "date", "time", "location", "coordinates": { "lat", "lon" }, "timezone" },
  "ascendant": { "longitude", "sign", "degree" },
  "planets": { "Sun": { "longitude", "sign", "degree", "house", "is_retrograde", "aspected_houses": [] }, ... },
  "dasha": { "maha_dasha", "antara_dasha", "pratyantara_dasha" },
  "transits": { ... },
  "conjunctions": [ { "sign", "planets": [] } ],
  "yogas": [ { "name", "category", "description" } ]
}
POST/api/readingAPI key or session

Compute the chart, retrieve matching classical rules from the graph, and synthesize a grounded reading in Markdown.

Request

name / dob / tob / locationrequiredSame birth fields as /api/chart.
querystringoptionalA focus for the reading (e.g. “career this year”). Defaults to a general reading.

Example request

{ "name": "John Doe", "dob": "1991-11-14", "tob": "04:42", "location": "Pune, India", "query": "career" }

Response

{ "id", "name", "metadata", "reading": "<markdown>", "rules_applied": [ "<rule>", ... ], "chart_data": { ... } }
GET/api/geocode?q=API key or session

Resolve a place name to candidate coordinates (server-side Nominatim) for the location field.

Request

qquery stringrequiredPlace text, 3+ characters.

Example request

GET /api/geocode?q=Pune

Response

{ "results": [ { "label": "Pune, Maharashtra, India", "lat": 18.5213, "lon": 73.8545 }, ... ] }
POST/api/rulesAPI key or session

Query the AI-audited classical rule graph directly for a chart. Returns the raw classical rules (unsoftened).

Request

chart_dataobjectrequiredA full chart object as returned by /api/chart.

Example request

{ "chart_data": { ...output of /api/chart... } }

Response

{ "rules": [ "[NATAL] Sun in 10th_House: ...", "[ASPECT] Saturn aspecting 10th_House: ...", ... ] }

Corpus

GET/api/corpus/rulesAPI key or session

Search the classical-rules graph by entity. Provide at least one filter; combining entities returns rules where they all co-occur (e.g. planet + house).

Request

planetqueryoptionale.g. Venus, Saturn, Rahu.
housequery intoptional1–12.
signqueryoptionale.g. Aries.
yogaqueryoptionalA yoga name.
nakshatraqueryoptionale.g. Rohini.
rule_typequeryoptionalFilter by rule type (see /corpus/entities).
min_confidencequery 0–100optionalDrop low-confidence / noisy rules.
limit / offsetquery intoptionalPagination; limit ≤ 200 (default 50).

Example request

GET /api/corpus/rules?planet=Venus&house=8&min_confidence=60&limit=10

Response

{
  "data": [ { "condition", "effect", "rule_type", "confidence", "source_id" }, ... ],
  "meta": { "returned", "limit", "offset", "has_more", "filters", "note" }
}
GET/api/corpus/yogasAPI key or session

List the classical yogas present in the corpus, with how many rules each carries.

Request

searchqueryoptionalCase-insensitive name substring.
limit / offsetquery intoptionalPagination; limit ≤ 500 (default 100).

Example request

GET /api/corpus/yogas?search=raja&limit=20

Response

{ "data": [ { "name": "Raja Yoga", "rule_count": 67 }, ... ], "meta": { "returned", "has_more", ... } }
GET/api/corpus/yogas/{name}API key or session

Return the classical rules recorded for a named yoga. 404 if the name isn’t found.

Request

namepathrequiredThe yoga name (URL-encoded).

Example request

GET /api/corpus/yogas/Raja%20Yoga

Response

{ "data": [ { "condition", "effect", "rule_type", "confidence", "source_id" }, ... ], "meta": { "name", "returned", "note" } }
GET/api/corpus/entitiesAPI key or session

Discover what you can query: every entity type with a count and example names.

Example request

GET /api/corpus/entities

Response

{ "data": { "PLANET": { "count", "examples": [] }, "YOGA": { ... }, "NAKSHATRA": { ... }, ... }, "meta": { "types" } }

Account routes (/api/user/*) power the Atri web app itself — saved charts, chat threads, and key management — and require a signed-in Bearer session, not an API key. They are not part of the partner API surface.