Documentation
🔑 Dashboard Get API Key →
TathaAstu Panchang API · v1 · Engine 7.7.15

The World's Most Comprehensive
Hindu Panchang API

1,400 years of astronomical data (1700–3100), complete Shastric guidance engine, real-time festival derivation, and a p95 of ~42 ms on Panchang — powered by Swiss Ephemeris & Lahiri ayanamsa.

Base URL https://api.tathaastuapi.com/v1
🔬
Swiss Ephemeris Accuracy
Lahiri (Chitrapaksha) ayanamsa. Real astronomical precision, not approximations.
📅
1,400 Years Coverage
1700–3100. Historical research and 1,000-year future planning in one API.
🌍
50+ Languages
Phonetic transliteration — not translation. "एकादशी" sounds the same in every script.
📖
Full Shastric Engine
Dharma Sindhu & Nirnaya Sindhu rules. Panchak, Bhadra, Disha Shool, Special Yogas.
⚡
Measured Response Times
p95 ~42 ms for Panchang, ~238 ms for festival explain; engine-side lookup 2.4 ms. Redis-cached DB with live engine fallback.
🔐
Enterprise Security
API key middleware, domain-locked CORS, rate limiting, 99.9% SLA.
New Here?

Start Here

Build your first feature in 5 minutes. Follow this simple flow.

🔑
1. Get API Key
Create a free account at the Dashboard
📊
2. Get Score
Call /v1/compatibility/score
📋
3. Get Insights
Call /v1/compatibility/report
📄
4. Generate PDF
Call /v1/kundli/birth-report
Flow: /score → /report → /pdf
cURL — Try it now
# Get a compatibility score in one call
curl "https://api.tathaastuapi.com/v1/compatibility/score?bride_dob=1992-07-18&bride_time=10:30&bride_lat=28.6139&bride_lon=77.2090&groom_dob=1989-11-25&groom_time=16:45&groom_lat=19.0760&groom_lon=72.8777" \
  -H "X-API-Key: YOUR_API_KEY"
✨
Bonus: Explainable Festival EngineUse /v1/festivals/explain to see exactly why a festival falls on a given date. No other Panchang API does this. Try it below ↓
Build With TathaAstu

Popular Use Cases

💑
Marriage Matching Platform
Ashtakoot Guna Milan scoring, Manglik analysis, and full compatibility reports for matrimonial apps.
📅
Daily Panchang App
Tithi, nakshatra, festivals, muhurat, and auspicious timings for calendar and reminder apps.
🔮
Astrology SaaS
Birth charts, yogas, dasha predictions, and PDF report generation for professional astrologers.
🕉️
Temple & Pooja Apps
Vrat dates, muhurat windows, and shastric conditions for devotional and ritual planning apps.
🌍
Multi-Faith Calendar
Hindu, Islamic, Christian, Jewish, Sikh, and Orthodox festivals in one API. 1,400 years of data.
📰
News & Media Widgets
Embed daily panchang, upcoming festivals, and eclipse alerts on websites and newsletters.
🚀
Sample Apps on GitHubWorking demo apps built with TathaAstu API: React (Compatibility Matcher) · Flutter (Daily Panchang) — Coming soon · HTML (Kundli Generator) — Coming soon
Getting Started

Authentication

Every /v1/ request requires a valid API key in the header. Public endpoints (/v1/status, /v1/health) are exempt.

🔑
Get Your Free API KeySign up at tathaastuapi.com/dashboard — Free tier includes 500 requests/month. No credit card needed.
🛡️
CORS Protection ActiveAPI calls are only allowed from tathaastuapi.com domains. If you copy a URL from browser DevTools and paste it in Postman without an API key, you will receive a 401 Unauthorized. Always call from your backend server.

Header Authentication

cURL
# Using X-API-Key header (recommended)
curl "https://api.tathaastuapi.com/v1/panchang?date=2025-03-01&lat=28.6&lon=77.2" \
  -H "X-API-Key: tatha_live_xxxxxxxxxxxx"

# Error response when key is missing or invalid
{
  "error": "Unauthorized",
  "message": "Missing or invalid API key. Pass X-API-Key header.",
  "docs": "https://tathaastuapi.com/docs#authentication",
  "get_key": "https://tathaastuapi.com/#pricing"
}
Getting Started

Languages & localization

One rule for every /v1 endpoint: canonical fields never change; localized text is added as <field>_local. Match your code on the canonical field and display the _local one.

lang=hi
# GET /v1/festivals?date=2026-11-08&location_id=1&lang=hi
{ "festival_key": "FESTIVAL_DIWALI", "name": "Diwali", "name_local": "दिवाली" }

# GET /v1/choghadiya?date=2026-11-08&lat=19.076&lon=72.8777&lang=hi
{ "type": "Kaal", "type_local": "काल", "auspicious": false }
TopicBehaviour
Sending langIn the query (?lang=hi) on every endpoint, or in the JSON body on POST endpoints that take one. If both are sent, the query wins. Codes are listed by GET /v1/i18n/languages.
Missing translationsNo translation means no _local field — never an English stand-in. The X-Localization-Missing header gives the count; add &i18n_detail=missing to list the paths in _i18n.missing.
ErrorsEvery error body carries a stable error code (for example invalid_date, unsupported_language). With a non-English lang it also has message_local, in the 13 report languages. Match on error, not on message text.
ReportsPOST /v1/kundli/birth-report and POST /v1/compatibility/report support en, hi, bn, de, es, fr, gu, kn, ml, mr, pa, ta, te, and return lang and translation_status.
LocationsIn /v1/locations the native-script place name is name_native (previously name_local).

Never localized: ids and codes (festival_key, paksha), numbers, dates and times, coordinates, and text you send (such as name and place). Timestamps such as instant_local keep their older meaning: local wall-clock time. Endpoint reference: Languages (i18n).

Getting Started

Quick Start

First API call in under 2 minutes. Choose your language.

# Today's Panchang for Delhi
curl "https://api.tathaastuapi.com/v1/panchang?date=2025-03-01&lat=28.6139&lon=77.2090" \
  -H "X-API-Key: YOUR_API_KEY"

# With timings, hora, choghadiya in one call
curl "https://api.tathaastuapi.com/v1/panchang?date=2025-03-01&lat=28.6&lon=77.2&include=timings,hora,choghadiya" \
  -H "X-API-Key: YOUR_API_KEY"

# Full shastric conditions + event ratings
curl "https://api.tathaastuapi.com/v1/shastra/conditions?date=2025-03-01&lat=28.6&lon=77.2" \
  -H "X-API-Key: YOUR_API_KEY"
import requests

API_KEY = "tatha_live_xxxxxxxxxxxx"
BASE    = "https://api.tathaastuapi.com/v1"
HDR     = {"X-API-Key": API_KEY}

# Core Panchang
r = requests.get(f"{BASE}/panchang", headers=HDR,
    params={"date":"2025-03-01","lat":28.6139,"lon":77.2090})
p = r.json()
print(p["tithi"]["name"])   # → "Ashtami"

# Event suitability for marriage
s = requests.get(f"{BASE}/events/suitability", headers=HDR,
    params={"date":"2025-03-01","lat":28.6,"lon":77.2,"event":"marriage"}).json()
print(s["rating"])   # → "AVOID" | "NEUTRAL" | "GOOD" | "EXCELLENT"
const API_KEY = 'tatha_live_xxxxxxxxxxxx';
const BASE    = 'https://api.tathaastuapi.com/v1';
const HDR     = { 'X-API-Key': API_KEY };

async function getPanchang(date, lat, lon) {
  const r = await fetch(
    `${BASE}/panchang?date=${date}&lat=${lat}&lon=${lon}`,
    { headers: HDR }
  );
  return r.json();
}

// Always call from server-side to protect your API key
const p = await getPanchang('2025-03-01', 27.7172, 85.3240);
console.log(p.tithi.name);    // → "Chaturdashi"
console.log(p.engine.version); // → "7.7.15"
<?php
define('API_KEY', 'tatha_live_xxxxxxxxxxxx');
define('BASE',    'https://api.tathaastuapi.com/v1');

function tathaApi($path) {
  $ctx = stream_context_create(['http' => [
    'header' => 'X-API-Key: ' . API_KEY
  ]]);
  return json_decode(
    file_get_contents(BASE . $path, false, $ctx), true
  );
}

$p = tathaApi('/panchang?date=2025-03-01&lat=28.6&lon=77.2');
echo $p['tithi']['name']; // → "Chaturdashi"

Example Response — /v1/panchang

JSON · 200 OK
{
  "date": "2025-02-21",
  "vara": { "name": "Friday", "name_sa": "Shukravāra", "lord": "Venus" },
  "tithi": {
    "number": 8, "name": "Ashtami", "paksha": "Krishna",
    "period": { "start": "2025-02-20 10:13", "end": "2025-02-21 12:13" }
  },
  "nakshatra": { "number": 17, "name": "Anuradha", "deity": "Mitra", "gana": "Deva" },
  "yoga": { "number": 13, "name": "Vyaghata" },
  "karana": { "number": 46, "name": "Garija", "auspicious": true },
  "hindu_calendar": { "amanta": "Magha", "purnimanta": "Phalguna", "samvat": 2081 },
  "timings": {
    "sunrise": "06:52:14", "sunset": "18:23:11",
    "moonrise": "02:14:00", "moonset": "13:44:00"
  },
  "engine": {
    "name": "TathaAstu Panchang", "version": "7.7.15",
    "calculation": "Drik", "ayanamsa": "Lahiri (Chitrapaksha)"
  }
}
Core APIs

Panchang Endpoints FREE TIER

The five limbs of Panchang — Vara, Tithi, Nakshatra, Yoga, Karana — plus Hindu calendar identity, special day flags, and engine attribution on every response.

GET/v1/panchangFreeFull Panchang for any date▶

Supports 1700–3100 date range. Automatically detects region (India/Nepal/Kashmir) from coordinates. Nepal gets +05:45 timezone. Includes engine version attribution on every response.

ParameterTypeRequiredDescription
datestringRequiredYYYY-MM-DD. Range 1700–3100
latfloatRequiredLatitude −90 to 90
lonfloatRequiredLongitude −180 to 180
regionstringOptionalAuto-detected. Override: NORTH_INDIA, SOUTH_INDIA, NEPAL, KASHMIR
includestringOptionalComma-separated extras: timings, hora, choghadiya, festivals, shastra
GET/v1/panchang/todayFreeCurrent day▶

Returns Panchang for today (server time, IST). Accepts all optional params except date.

GET/v1/panchang/tomorrowFreeNext day preview▶

Returns Panchang for tomorrow. Useful for apps that show a next-day preview widget.

GET/v1/panchang/fullProComplete data — all sections▶

Returns every available section in one response: core panchang, timings, hora, choghadiya, astronomical, shastric conditions, event suitability, festivals, panchak, bhadra, disha shool, special yogas.

✨
Now includes: top-level conditions block (Panchak, Bhadra, Ganda Mool) and astronomical.eclipse block. These are new optional fields — the legacy data block is unchanged. Any sub-block returns null if data is unavailable for that date.
GET/v1/tithiFreeTithi details only▶

Returns Tithi number, name, paksha (Shukla/Krishna), nature (Nanda/Bhadra/Jaya/Rikta/Purna), start/end times.

GET/v1/nakshatraFreeNakshatra details only▶

Returns Nakshatra number, name, pada (quarter), deity, gana (Deva/Manushya/Rakshasa), nature, ruling planet, period times.

GET/v1/panchang/event-catalogProPanchang event catalogue: every classification key, its meaning and presentation hints▶

Every key /v1/panchang/full?include=day_classification can emit, once.

Domain facts (authoritative): key, kind, type, category, priority_tier, default_priority, nature. Presentation hints (guidance for the client's own design system): presentation.icon_key, theme_key, badge_key. Icon keys are hierarchical (festival.diwali falls back to festival). No colours and no asset URLs are published.

Cache it: the response carries catalog_version and an ETag; send If-None-Match to receive 304 Not Modified until the catalogue changes.

ParameterTypeRequiredDescription
langstringOptionalResponse language: one of the codes below (GET /v1/i18n/languages lists them with their names and coverage; hi-IN is accepted as hi, en-IN/en-GB/en-US as en). Canonical fields never change with the language; localized values are ADDED as <field>_local. Accepted does not mean fully translated: a value with no verified translation in that language has no _local field (never an English stand-in), and the response header X-Localization-Missing counts them. An unknown code is 400 unsupported_language.
GET/v1/panchang/liteFreeLightweight Panchang (< 1KB)▶

Lightweight Panchang for mobile apps. Returns only essential data: date, tithi, nakshatra, sunrise, sunset, paksha. Response size < 1KB. For full data use /v1/panchang.

ParameterTypeRequiredDescription
datestringRequiredDate YYYY-MM-DD
latfloatOptionalLatitude
lonfloatOptionalLongitude
location_idintegerOptionalLocation ID. Defaults to 2 when neither location_id nor lat/lon is given; supplying lat/lon instead computes for those coordinates.
langstringOptionalResponse language: one of the codes below (GET /v1/i18n/languages lists them with their names and coverage; hi-IN is accepted as hi, en-IN/en-GB/en-US as en). Canonical fields never change with the language; localized values are ADDED as <field>_local. Accepted does not mean fully translated: a value with no verified translation in that language has no _local field (never an English stand-in), and the response header X-Localization-Missing counts them. An unknown code is 400 unsupported_language.
tzstringOptionalIANA timezone for the civil clock, e.g. Europe/Paris. Optional: derived from lat/lon when omitted, then the region default.
GET/v1/panchang/nowFreeGet current Panchang with live timings▶

Get Panchang for current moment with live running tithi/nakshatra info. Shows what's active RIGHT NOW.

ParameterTypeRequiredDescription
latfloatOptionalLatitude in decimal degrees. Provide with lon, or use location_id.
lonfloatOptionalLongitude in decimal degrees. Provide with lat, or use location_id.
location_idintegerOptionalNamed dataset location. Omit it and lat/lon decide the location; omit both and the historical default (1) applies.
langstringOptionalResponse language: one of the codes below (GET /v1/i18n/languages lists them with their names and coverage; hi-IN is accepted as hi, en-IN/en-GB/en-US as en). Canonical fields never change with the language; localized values are ADDED as <field>_local. Accepted does not mean fully translated: a value with no verified translation in that language has no _local field (never an English stand-in), and the response header X-Localization-Missing counts them. An unknown code is 400 unsupported_language.
tzstringOptionalIANA timezone deciding which day "today" is, e.g. America/New_York. Omitted = the API server's date, which is a different day from yours for part of every day.
GET/v1/panchang/rangeStarterGet Panchang Range Endpoint▶

Panchang for each date from start to end inclusive (end - start <= 30 days, i.e. at most 31 dates). Requires the Starter plan; single dates are available on Free from /v1/panchang. Location: location_id > lat/lon > region's canonical location > Ujjain (the historical default).

ParameterTypeRequiredDescription
startstringRequiredStart date YYYY-MM-DD
endstringRequiredEnd date YYYY-MM-DD
latfloatOptionalLatitude. With lon, used when location_id is not given.
lonfloatOptionalLongitude. Required together with lat.
location_idintegerOptionalPredefined location ID; takes precedence over lat/lon.
regionstringOptionalCanonical region or supported ISO 3166-2 state code (e.g. IN-MH); its canonical location is used when neither location_id nor lat/lon is given. An unsupported value is ignored.
langstringOptionalResponse language: one of the codes below (GET /v1/i18n/languages lists them with their names and coverage; hi-IN is accepted as hi, en-IN/en-GB/en-US as en). Canonical fields never change with the language; localized values are ADDED as <field>_local. Accepted does not mean fully translated: a value with no verified translation in that language has no _local field (never an English stand-in), and the response header X-Localization-Missing counts them. An unknown code is 400 unsupported_language.
GET/v1/panchang/yesterdayFreeGet yesterday's Panchang▶

Get Panchang for yesterday.

ParameterTypeRequiredDescription
latfloatOptionalLatitude in decimal degrees. Provide with lon, or use location_id.
lonfloatOptionalLongitude in decimal degrees. Provide with lat, or use location_id.
location_idintegerOptionalNamed dataset location. Omit it and lat/lon decide the location; omit both and the historical default (1) applies.
langstringOptionalResponse language: one of the codes below (GET /v1/i18n/languages lists them with their names and coverage; hi-IN is accepted as hi, en-IN/en-GB/en-US as en). Canonical fields never change with the language; localized values are ADDED as <field>_local. Accepted does not mean fully translated: a value with no verified translation in that language has no _local field (never an English stand-in), and the response header X-Localization-Missing counts them. An unknown code is 400 unsupported_language.
includestringOptionalinclude parameter.
tzstringOptionalIANA timezone deciding which day "today" is, e.g. America/New_York. Omitted = the API server's date, which is a different day from yours for part of every day.
GET/v1/todayFreeToday's complete Panchang + festivals + timings▶

Killer endpoint: Returns today's complete Panchang data in a single call. Includes: panchang, festivals, muhurat, rahukaal, moon phase — everything. Optimized for mobile apps and dashboard widgets.

ParameterTypeRequiredDescription
latfloatOptionalLatitude. With lon it selects the location when location_id is omitted.
lonfloatOptionalLongitude.
location_idintegerOptionalNamed dataset location. Omit it and lat/lon decide; omit both and the historical default (2) applies.
langstringOptionalResponse language: one of the codes below (GET /v1/i18n/languages lists them with their names and coverage; hi-IN is accepted as hi, en-IN/en-GB/en-US as en). Canonical fields never change with the language; localized values are ADDED as <field>_local. Accepted does not mean fully translated: a value with no verified translation in that language has no _local field (never an English stand-in), and the response header X-Localization-Missing counts them. An unknown code is 400 unsupported_language.
tzstringOptionalIANA timezone for the civil clock, e.g. Europe/Paris. Optional: derived from lat/lon when omitted, then the region default.
Core APIs

All-Timings Endpoint FREE TIER

All auspicious and inauspicious windows for a date in one call — sunrise/sunset, all malefic periods, muhurtas, and moon times.

GET/v1/timingsFreeComplete timing overview▶

Returns: 🌅 Sunrise/Sunset · 🌙 Moonrise/Moonset · 🔴 Rahu Kaal · ⚫ Yamagandam · 🟠 Gulika Kaal · ⭐ Brahma Muhurta · ✨ Abhijit Muhurat · 💫 Amrit Kaal · ❌ Durmuhurta (×2) · 🚫 Varjyam.

ParameterTypeRequiredDescription
datestringRequiredYYYY-MM-DD
latfloatRequiredLatitude
lonfloatRequiredLongitude
GET/v1/inauspiciousFreeGet Inauspicious▶

Get inauspicious timings (Rahu Kaal, Yamagandam, Gulika Kaal, Durmuhurta, Varjyam).

ParameterTypeRequiredDescription
datestringRequiredDate YYYY-MM-DD
latfloatRequiredLatitude
lonfloatRequiredLongitude
langstringOptionalResponse language: one of the codes below (GET /v1/i18n/languages lists them with their names and coverage; hi-IN is accepted as hi, en-IN/en-GB/en-US as en). Canonical fields never change with the language; localized values are ADDED as <field>_local. Accepted does not mean fully translated: a value with no verified translation in that language has no _local field (never an English stand-in), and the response header X-Localization-Missing counts them. An unknown code is 400 unsupported_language.
Timings — Pro Tier

Hora & Choghadiya

Planetary hours and auspicious/inauspicious day segments. Durations dynamically computed from actual sunrise/sunset — never hardcoded to 60 minutes.

GET/v1/horaPro24 planetary hour periods▶

24 Hora periods from sunrise to next sunrise. Each ruled by a planet (Sun→Venus→Mercury→Moon→Saturn→Jupiter→Mars). Duration = (next_sunrise − today_sunrise) / 24. Nepal uses +05:45 correctly.

💡
Best Activities by Hora PlanetSun: authority, government. Moon: travel, emotions. Mars: courage, surgery. Mercury: business, communication. Jupiter: education, wealth. Venus: arts, marriage. Saturn: research, agriculture.
GET/v1/choghadiyaPro16 choghadiya periods (8 day + 8 night)▶

North/West Indian tradition. 8 day slots from sunrise→sunset and 8 night slots from sunset→sunrise. Each ~1.5 hours (dynamically computed), rated: Amrit ✅ · Shubh ✅ · Labh ✅ · Char ⚠️ · Rog ❌ · Kaal ❌ · Udveg ❌.

GET/v1/rahukaalFreeRahu Kaal timing▶

Inauspicious 1.5-hour window. Varies by weekday — computed from actual sunrise, not fixed times.

GET/v1/yamagandaFreeYamagandam timing▶

Another inauspicious daily period. Avoid new ventures during Yamagandam.

GET/v1/gulikaalFreeGulika Kaal timing▶

Third inauspicious daily window in the Vedic timekeeping system.

GET/v1/abhijitFreeMost auspicious muhurat of the day▶

Abhijit Muhurat — near solar noon, ~48 minutes. Most universally auspicious window. Not applicable on Wednesdays by traditional rule.

Astronomical — Pro Tier

Astronomical Data

Sun/moon positions, zodiac, sankranti, moon phase and lagna — all computed via Swiss Ephemeris with Lahiri ayanamsa.

GET/v1/astronomicalProSun, moon, planets, sankranti▶

Sun longitude/rashi, Moon longitude/rashi/nakshatra, sankranti day flag, amavasya/purnima flags, planetary positions.

GET/v1/moon-phaseProMoon phase, illumination, paksha▶

Returns phase name (Waxing Crescent/Gibbous/Full/Waning etc.), illumination percentage, paksha (Shukla/Krishna), days to next full/new moon.

GET/v1/lagnaProCurrent & udaya lagna (ascendant)▶

Lagna (ascendant) changes every ~2 hours. Returns current lagna rashi + udaya lagna (fixed at sunrise). For real-time widgets, refresh every 5 minutes.

⚠️
Location-sensitiveLagna is highly dependent on both date AND exact location. A few degrees of latitude/longitude can shift the lagna sign.
GET/v1/sunFreeGet Sun Data▶

Get sun position and timing data.

ParameterTypeRequiredDescription
datestringRequiredDate YYYY-MM-DD
latfloatRequiredLatitude
lonfloatRequiredLongitude
langstringOptionalResponse language: one of the codes below (GET /v1/i18n/languages lists them with their names and coverage; hi-IN is accepted as hi, en-IN/en-GB/en-US as en). Canonical fields never change with the language; localized values are ADDED as <field>_local. Accepted does not mean fully translated: a value with no verified translation in that language has no _local field (never an English stand-in), and the response header X-Localization-Missing counts them. An unknown code is 400 unsupported_language.
🧠 Aggregated APIs — Spiritual Intelligence Layer

Unified Daily Context FLAGSHIP

A single B2B call returns the complete daily spiritual context — Panchang, festivals, shastric conditions, and eclipses. Built for clients who want one endpoint instead of stitching together /v1/panchang + /v1/festivals + /v1/panchak + /v1/eclipse.

📖 When to use which API

Pick the right endpoint for the job

Use CaseEndpointWhy
Show event listings
festivals, vrats, observances
/v1/festivals Stored + rule-derived festivals only. Does NOT include Panchak/Bhadra/Ganda Mool.
Show calendar data
tithi, nakshatra, yoga, karana, hindu month
/v1/panchang Core 5 limbs + hindu calendar identity. Optimised for daily widgets.
Show complete daily insights
⭐ RECOMMENDED for B2B
/v1/day-context Panchang + festivals + conditions (panchak/bhadra/ganda_mool) + eclipse — in one call. Cached 6h.
Personalised astrology
isht devta, kundli, compatibility
/v1/isht-devta
/v1/birth-chart
/v1/compatibility
Requires birth data. Deterministic, explainable. Premium tier.
Find auspicious timings
muhurat, hora, choghadiya
/v1/timings
/v1/muhurat/find
Sunrise/sunset + Rahu Kaal + Brahma Muhurta + Abhijit + scan-by-event muhurat finder.
Shastric deep dive
enterprise temple kiosks, exports
/v1/panchang/full
/v1/shastra/conditions
Heavy. Every section of the engine in one response. NOT for mobile apps.
Rule of thumb: If you're building a daily-spiritual-context UI, default to /v1/day-context. Drop down to individual endpoints only when you need a single specific signal (e.g. just /v1/rahukaal for a notification).
📌
IMPORTANT NOTE — Panchak, Bhadra, and Ganda Mool are NOT festivals.They are shastric day-conditions and will NOT appear in /v1/festivals responses. To surface them in your app alongside festivals, use /v1/day-context — it returns festivals AND conditions in one unified payload.
GET/v1/day-contextProComplete daily spiritual context (one call)▶

Returns complete daily spiritual intelligence in a single response: panchang (5 limbs + hindu calendar), festivals (stored + rule-derived), conditions (panchak, bhadra, ganda_mool), and astronomical.eclipse. Internally calls the same engine functions as the individual endpoints — no logic duplication, no extra HTTP overhead. Any sub-block that cannot be computed returns null instead of failing.

ParameterTypeRequiredDescription
datestringRequiredYYYY-MM-DD
latfloatRequiredLatitude (-90 to 90)
lonfloatRequiredLongitude (-180 to 180)
location_idintOptionalPredefined location ID for stored panchang/festivals (default: 2)
langstringOptionalLanguage code (default: en)
regionstringOptionalRegion override (auto-detected if omitted)
curl "https://api.tathaastuapi.com/v1/day-context?date=2026-04-11&lat=28.6139&lon=77.2090" \
  -H "X-API-Key: sk_live_xxxxxxxxxxxx"
{
  "date": "2026-04-11",
  "location": { "lat": 28.6139, "lon": 77.2090, "region": "NORTH_INDIA", "location_id": 2 },
  "panchang": { /* tithi, nakshatra, yoga, karana, hindu_calendar, ... */ },
  "festivals": [ /* stored + rule-derived festivals */ ],
  "conditions": {
    "panchak":    { "is_panchak": false, "type": null, /* ... */ },
    "bhadra":     { "is_bhadra": false, /* ... */ },
    "ganda_mool": { "is_ganda_mool": false, "nakshatra_num": 12, "nakshatra_name": "Uttara Phalguni", "gana": "Manushya" }
  },
  "astronomical": {
    "eclipse": null
  },
  "_note": "Panchak, Bhadra, and Ganda Mool are NOT festivals. They are shastric conditions surfaced separately from /v1/festivals."
}
💡
This is the recommended primary B2B endpoint.One call → complete daily spiritual context. Use this instead of stitching together 4 separate endpoint calls on the client side.
⚡
Cached 6 hoursResults are cached server-side (Redis with in-memory fallback) keyed on (date, lat, lon, location_id, lang, region). Lat/lon are rounded to 4 decimals (~11m precision). Each response includes a _cache field set to "hit" or "miss" for observability. Cache failures never break the request — the endpoint always falls through to live computation.
POST/v1/isht-devtaProPersonalised Isht Devta recommendation▶

Returns a personalised Isht Devta recommendation based on the caller's birth data, computed via the production Vedic astrology engine. Deterministic and explainable — no hardcoded charts.

🔮
How the recommendation is derived1. Compute the natal chart using the existing astrology engine (Lahiri ayanamsa). 2. Identify three planetary lords: lagna_lord, moon_sign_lord, nakshatra_lord. 3. Confidence: high if all 3 agree, medium if 2 agree, low otherwise. 4. Map dominant planet → presiding deity. 5. Surface supporting facts so the recommendation is fully explainable.

Request body:

{
  "date_of_birth": "1992-07-18",
  "time_of_birth": "10:30",
  "location": { "lat": 28.6139, "lon": 77.2090 },
  "timezone": "Asia/Kolkata"
}

Response:

{
  "isht_devta": {
    "name": "Mahalakshmi",
    "basis": "lagna_lord=Venus; moon_sign_lord=Venus; nakshatra_lord=Sun; → dominant planet: Venus",
    "confidence": "medium"
  },
  "methodology": "lagna + moon + nakshatra convergence",
  "supporting_factors": {
    "nakshatra":       "Punarvasu",
    "nakshatra_deity": "Aditi",
    "rashi":           "Taurus",
    "lagna":           "Libra",
    "lagna_lord":      "Venus",
    "moon_sign_lord":  "Venus",
    "nakshatra_lord":  "Sun",
    "dominant_planet": "Venus"
  },
  "engine": {
    "name": "TathaAstu Vedic Astrology Engine",
    "ayanamsa": "Lahiri",
    "rule": "convergence(lagna_lord, moon_sign_lord, nakshatra_lord)"
  },
  "disclaimer": "Isht Devta is a personal devotional choice. This recommendation is a deterministic computation based on classical lordships and is intended as guidance, not prescription. Consult your family guru or priest for personal sadhana decisions."
}
🔁
Low-confidence fallbackWhen the three lords do NOT converge (confidence: "low"), the response includes a note field explaining the fallback and a fallback_deity field with the classical Janma Nakshatra deity. This makes the recommendation fully transparent to your end users.
curl -X POST https://api.tathaastuapi.com/v1/isht-devta \
  -H "X-API-Key: sk_live_xxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{"date_of_birth":"1992-07-18","time_of_birth":"10:30","location":{"lat":28.6139,"lon":77.2090}}'
🔒
Personal data endpoint.Requires birth date, time, and location. This endpoint is intentionally separated from the Panchang APIs because it is personalised. No birth data is stored unless the caller also uses /v1/birth-chart.
GET/v1/day-context/rangeBusinessBulk day-context for date range (up to 62 days per call)▶

Bulk endpoint for calendar grids / monthly views / annual sync jobs.

Accepts a date range (up to 62 days per call) and returns an array of day_context payloads — avoids the 60 req/min rate limit when syncing full months or years.

Usage patterns:

  • Mobile monthly calendar: 1 call per month × 7 regions = 7 calls/year
  • Annual sync (single region): 12 calls (one per month)
  • Annual sync (all regions): 84 calls (vs ~2,555 with daily endpoint)

Region parameter: If region=NORTH_INDIA is passed, canonical coords are auto-resolved. If region is omitted, lat + lon are required.

Location: each day is exactly /v1/day-context for the same inputs. With lat+lon (+tz) and no location_id/region, every day is computed for those coordinates and festivals equal /v1/festivals?lat&lon&tz. location_id used to default to 2 (Varanasi), so coordinate-only callers were answered for Varanasi; an explicit location_id or region still selects that stored location.

Response shape: ``json { "from": "2026-04-01", "to": "2026-04-30", "region": "NORTH_INDIA", "count": 30, "days": [ {"date": "2026-04-01", ...full day_context...}, ... ] } ``

ParameterTypeRequiredDescription
fromstringRequiredStart date YYYY-MM-DD
tostringRequiredEnd date YYYY-MM-DD (inclusive). Max 62 days from start.
regionstringOptionalCanonical region (NORTH_INDIA|SOUTH_INDIA|EAST_INDIA|WEST_INDIA|NEPAL|KASHMIR|SRI_LANKA) or a supported ISO 3166-2 state code (e.g. IN-MH). If provided, its canonical coords are used. Unsupported values return 422.
latfloatOptionalLatitude (required if region not provided)
lonfloatOptionalLongitude (required if region not provided)
location_idintegerOptionalPredefined location ID. Given, each day's panchang and festivals are that stored location's (compatibility behaviour). Omitted with no region, every day is computed for lat/lon/tz.
langstringOptionalResponse language: one of the codes below (GET /v1/i18n/languages lists them with their names and coverage; hi-IN is accepted as hi, en-IN/en-GB/en-US as en). Canonical fields never change with the language; localized values are ADDED as <field>_local. Accepted does not mean fully translated: a value with no verified translation in that language has no _local field (never an English stand-in), and the response header X-Localization-Missing counts them. An unknown code is 400 unsupported_language.
tzstringOptionalIANA timezone for the civil clock, e.g. America/Argentina/Cordoba. Send it with coordinate-only requests: it decides which civil day a festival falls on. Omitted, the zone is derived from lat/lon.
Webhooks — Pro & Business

Webhooks

Receive push notifications instead of polling. Register an HTTPS endpoint, subscribe to events, and verify every delivery with its HMAC signature.

🔒
Signature verificationEvery request carries X-TathaAstu-Signature: sha256=<hex>. The signed payload is "<timestamp>.<raw body>" using your endpoint secret. Always verify before trusting a delivery.

Events

EventWhen it fires
panchang.dailyDaily digest of that day’s Panchang for your location
festival.reminderN days before a festival or vrat (configurable per endpoint)
eclipse.upcomingAn eclipse falls within the next 7 days
account.quota_thresholdMonthly usage crosses 80% or 100%
account.key_created, account.key_revokedAPI key lifecycle changes
account.payment_succeeded, account.payment_failedBilling outcomes

Register an endpoint

cURL
curl -X POST https://tathaastuapi.com/api/webhooks \
  -H "Authorization: Bearer YOUR_JWT" \
  -H "Content-Type: application/json" \
  -d '{"url":"https://yourapp.com/hooks/tathaastu",
       "events":["panchang.daily","festival.reminder"],
       "location_id":1,"reminder_days_before":1}'

The response contains secret — shown once. Store it. Roll it later with POST /api/webhooks/{id}/rotate-secret.

Verify a delivery

Python
import hmac, hashlib

def verify(secret, headers, raw_body):
    ts  = headers["X-TathaAstu-Timestamp"]
    sig = headers["X-TathaAstu-Signature"]
    mac = hmac.new(secret.encode(), f"{ts}.".encode() + raw_body, hashlib.sha256)
    return hmac.compare_digest(sig, "sha256=" + mac.hexdigest())

Delivery & retries

BehaviourDetail
SuccessAny 2xx response within 10 seconds
Retries5 attempts with backoff 1m → 5m → 30m → 2h
IdempotencyX-TathaAstu-Event-Id is stable per event — dedupe on it
Auto-disableAfter 20 consecutive failures; re-enable from the dashboard
Delivery logsGET /api/webhooks/{id}/deliveries
⚡
Plan limitsPro allows 5 endpoints, Business 20. Free and Starter plans receive 402 plan_upgrade_required.
Festivals — Free Tier

Festivals & Vrats NEW: Explainable Engine

Festivals derived on-the-fly with full explainability — every result tells you exactly why it falls on a given date.

Stories, significance and observance (content=)

142 festivals carry content: 57 kathas (the story told for the festival), 93 significance notes and an observance (vidhi) note. Read one festival with GET /v1/festivals/content/{subject} (for example karva-chauth, rishi-panchami, indira-ekadashi; GET /v1/festivals/content lists them all), or add content=story — also katha, significance, vidhi, all, comma-separated — to /v1/festivals, /v1/festivals/date, /range, /month, /year, /search, /v1/calendar/day and /v1/calendar/month: every festival in the response then has a content block (null where none is held). Without content= the responses are unchanged.

Each piece has type, title, body_html (simple HTML: paragraphs, emphasis, lists), the language actually served and provenance. The texts are original adaptations by TathaAstu and are drafts until reviewed: review_status says so, source_reference names the scriptural or traditional source adapted where one could be named, and source_reference_verified stays false until a reviewer confirms it. Folk kathas (Karva Chauth, Ahoi Ashtami, Bhai Dooj) are labelled traditional and claim no scripture. With lang, a translated piece is served in that language with its translation provenance; one not yet translated is served in English with language_note. Hindi is available for every katha; other languages are being added.

💡
Two TypesSTORED: fixed-date festivals (Independence Day). DERIVED: rule-based astronomical (Ekadashi, Shivaratri, Purnima, etc.). Both types include tags: FASTING, SHAIVA, VAISHNAVA, REGIONAL, NATIONAL.
GET/v1/festivalsFreeAll festivals for a date▶
ParameterTypeRequiredDescription
datestringRequiredYYYY-MM-DD
regionstringOptionalIN, IN-MH, IN-TN, IN-KA, NEPAL… filters regional festivals
langstringOptionalLanguage code for festival names (en, hi, ta, te…)
GET/v1/festivals/explainFreeWhy does this festival fall today?▶

Explainability endpoint — returns the exact astronomical rule that triggered a derived festival, with per-condition match details.

ParameterTypeRequiredDescription
datestringRequiredYYYY-MM-DD
festivalstringRequiredFestival key (e.g. FESTIVAL_HOLI)
location_idintegerOptionalLocation ID (default: 1)
Response Example
{
  "festival": "FESTIVAL_MAHA_SHIVARATRI",
  "date": "2026-02-16",
  "matched": true,
  "rule_code": "SHIVARATRI",
  "conditions": [
    { "field": "paksha", "expected": "KRISHNA", "actual": "KRISHNA", "matched": true },
    { "field": "tithi_num", "expected": 14, "actual": 14, "matched": true },
    { "field": "purnimanta_month", "expected": "Phalguna", "actual": "Phalguna", "matched": true }
  ],
  "human_readable": "This festival was derived because the conditions in rule 'SHIVARATRI' matched the Panchang facts for 2026-02-16."
}
Try It — Festival Explainability

See exactly why a festival falls on a given date. This is unique to TathaAstu API.

Real-time rule evaluation from Panchang data · ✓ = matched · ✗ = not matched
GET/v1/festivals/monthFreeAll festivals in a month▶
ParameterTypeRequiredDescription
yearintegerRequiredYear
monthintegerRequiredMonth (1–12)
GET/v1/festivals/contentFreeFestival stories and significance: the catalogue▶

Every festival that has content: its subject (slug), the piece types held (katha = the story, significance, vidhi = how it is observed) and their English titles. Draft content by TathaAstu; see notice.

ParameterTypeRequiredDescription
langstringOptionalResponse language: one of the codes below (GET /v1/i18n/languages lists them with their names and coverage; hi-IN is accepted as hi, en-IN/en-GB/en-US as en). Canonical fields never change with the language; localized values are ADDED as <field>_local. Accepted does not mean fully translated: a value with no verified translation in that language has no _local field (never an English stand-in), and the response header X-Localization-Missing counts them. An unknown code is 400 unsupported_language.
GET/v1/festivals/content/{subject}FreeStory (katha), significance and observance of one festival▶

One festival's content, e.g. rishi-panchami, karva-chauth, indira-ekadashi. Each piece has title, body_html (simple HTML: p, em, strong, ul/li), language actually served, and provenance: who wrote it, the scriptural or traditional source it adapts (source_reference, always source_reference_verified: false until reviewed), review_status and, for a translation, how it was made.

ParameterTypeRequiredDescription
subjectstringRequiredsubject parameter. (path)
typestringOptionalkatha (or story), significance, vidhi or all (default all); comma-separate several.
langstringOptionalResponse language: one of the codes below (GET /v1/i18n/languages lists them with their names and coverage; hi-IN is accepted as hi, en-IN/en-GB/en-US as en). Canonical fields never change with the language; localized values are ADDED as <field>_local. Accepted does not mean fully translated: a value with no verified translation in that language has no _local field (never an English stand-in), and the response header X-Localization-Missing counts them. An unknown code is 400 unsupported_language.
GET/v1/festivals/dateFreeGet festivals for date (alias)▶

Alias for /v1/festivals?date=X

ParameterTypeRequiredDescription
datestringRequiredTarget date in YYYY-MM-DD.
location_idintegerOptionalPredefined location ID. Defaults to 1 (New Delhi), or to the region's canonical location when region is given.
langstringOptionalResponse language: one of the codes below (GET /v1/i18n/languages lists them with their names and coverage; hi-IN is accepted as hi, en-IN/en-GB/en-US as en). Canonical fields never change with the language; localized values are ADDED as <field>_local. Accepted does not mean fully translated: a value with no verified translation in that language has no _local field (never an English stand-in), and the response header X-Localization-Missing counts them. An unknown code is 400 unsupported_language.
regionstringOptionalRegional tradition: canonical region or supported ISO 3166-2 state code (e.g. IN-MH); same rule as /v1/festivals. An unsupported value is ignored and reported in region_resolution.ignored_region.
contentstringOptionalAttach festival content to every festival in the response: katha (or story), significance, vidhi, or all; comma-separate several. Each piece carries provenance and review_status (draft content by TathaAstu). Omit for the unchanged response.
GET/v1/festivals/muhuratProFestival muhurat (auspicious window) for a festival + date + location▶

Auspicious muhurat window for a festival at a specific date and location.

TathaAstuAPI owns all festival / muhurat / regional computation; the consuming app renders recommended + explanation directly and implements NO religious or regional logic. The response contains everything needed to display the answer:

  • festival (id, key, name, date)
  • location (region, lat, lon, timezone_offset)
  • recommended {start, end, label} (null when unsupported / not applicable)
  • avoid [{start, end, reason, label}] (Bhadra Mukha, Rahu Kaal, ...)
  • conditions {tithi, sunrise, sunset, rahu_kaal, bhadra?, moonrise?}
  • explanation {rule, kala, reason, source}
  • kala {code, label} (present when the rule defines one of the four kalas)
  • timing {type, status, windows} — the explicit timing contract
  • verification : "verified" | "computed" | "unsupported"
  • source

timing.type is INSTANT | WINDOW | MULTI_WINDOW | NONE, and timing.status is supported | unsupported | not_applicable | error, so the caller never has to infer capability from the shape of recommended. timing.windows carries every window the rule produced; recommended remains the single window the engine selects. not_applicable means the authored rule selects the day and states no performance hour.

verification is honest: Tier-1 festivals are source-traced ("verified"), Tier-2 are computed from the authored kala ("computed"), and unsupported festivals return recommended: null rather than a fabricated time. Times are local ISO-8601 (the location's timezone, see location.timezone_offset).

ParameterTypeRequiredDescription
festivalstringRequiredFestival slug, e.g. raksha_bandhan, diwali, janmashtami, ganesh_chaturthi, dhanteras, holika_dahan, bhai_dooj, vijayadashami, maha_shivaratri
datestringRequiredFestival date YYYY-MM-DD (the date returned by /v1/festivals for this location)
latfloatRequiredLatitude - the local astronomical context (sunrise/sunset are location-specific)
lonfloatRequiredLongitude
regionstringOptionalCanonical region (NORTH_INDIA|SOUTH_INDIA|EAST_INDIA|WEST_INDIA|NEPAL|KASHMIR|SRI_LANKA) or a supported ISO 3166-2 state code (e.g. IN-MH). Selects the regional convention/calendar; if omitted it is inferred from lat/lon. Unsupported values return 422.
tzstringOptionalIANA timezone for the civil clock, e.g. Europe/Paris. Omit to use the region default (+05:30 / +05:45).
langstringOptionalResponse language: one of the codes below (GET /v1/i18n/languages lists them with their names and coverage; hi-IN is accepted as hi, en-IN/en-GB/en-US as en). Canonical fields never change with the language; localized values are ADDED as <field>_local. Accepted does not mean fully translated: a value with no verified translation in that language has no _local field (never an English stand-in), and the response header X-Localization-Missing counts them. An unknown code is 400 unsupported_language.
GET/v1/festivals/muhurat/supportedProObservance timing capabilities the muhurat engine supports▶

What the muhurat engine can actually time, and under which contract.

Each entry carries the canonical key, its accepted slugs, the timing contract (timing_type, timing_status) and, where the rule defines one, the kala. This is the list the consuming app should build against instead of guessing slugs or inferring capability from a null recommended.

  • timing_type : INSTANT | WINDOW | MULTI_WINDOW | NONE
  • timing_status : supported | unsupported | not_applicable

not_applicable means the authored rule selects the observance day and states no performance window. That is a property of the source, not a gap in the engine, and the engine does not invent an hour to fill it.

ParameterTypeRequiredDescription
langstringOptionalResponse language: one of the codes below (GET /v1/i18n/languages lists them with their names and coverage; hi-IN is accepted as hi, en-IN/en-GB/en-US as en). Canonical fields never change with the language; localized values are ADDED as <field>_local. Accepted does not mean fully translated: a value with no verified translation in that language has no _local field (never an English stand-in), and the response header X-Localization-Missing counts them. An unknown code is 400 unsupported_language.
GET/v1/festivals/rangeFreeGet festivals in date range▶

Get all festivals in a date range using the rule engine.

Every day is evaluated exactly as /v1/festivals evaluates it, with the same region rule. A listed location without precomputed rows is computed from its coordinates; an unknown location_id is a 404; any other failure surfaces instead of silently dropping that day's festivals.

ParameterTypeRequiredDescription
startstringRequiredStart date
endstringRequiredEnd date
location_idintegerOptionalPredefined location ID. Defaults to 1 (New Delhi), or to the region's canonical location when region is given.
langstringOptionalResponse language: one of the codes below (GET /v1/i18n/languages lists them with their names and coverage; hi-IN is accepted as hi, en-IN/en-GB/en-US as en). Canonical fields never change with the language; localized values are ADDED as <field>_local. Accepted does not mean fully translated: a value with no verified translation in that language has no _local field (never an English stand-in), and the response header X-Localization-Missing counts them. An unknown code is 400 unsupported_language.
regionstringOptionalRegional tradition: canonical region or supported ISO 3166-2 state code (e.g. IN-MH); same rule as /v1/festivals. An unsupported value is ignored and reported in region_resolution.ignored_region.
contentstringOptionalAttach festival content to every festival in the response: katha (or story), significance, vidhi, or all; comma-separate several. Each piece carries provenance and review_status (draft content by TathaAstu). Omit for the unchanged response.
GET/v1/festivals/yearFreeGet festivals for a year▶

Get all festivals for a specific year.

ParameterTypeRequiredDescription
yearintegerRequiredFour-digit year.
location_idintegerOptionalPredefined location ID. Defaults to 1 (New Delhi), or to the region's canonical location when region is given.
langstringOptionalResponse language: one of the codes below (GET /v1/i18n/languages lists them with their names and coverage; hi-IN is accepted as hi, en-IN/en-GB/en-US as en). Canonical fields never change with the language; localized values are ADDED as <field>_local. Accepted does not mean fully translated: a value with no verified translation in that language has no _local field (never an English stand-in), and the response header X-Localization-Missing counts them. An unknown code is 400 unsupported_language.
regionstringOptionalRegional tradition: canonical region or supported ISO 3166-2 state code (e.g. IN-MH); same rule as /v1/festivals. An unsupported value is ignored and reported in region_resolution.ignored_region.
contentstringOptionalAttach festival content to every festival in the response: katha (or story), significance, vidhi, or all; comma-separate several. Each piece carries provenance and review_status (draft content by TathaAstu). Omit for the unchanged response.
GET/v1/shraddha/kalaFreeAparahna, Kutapa and the tithis present in the aparahna on one day▶

The śrāddha kālas of one civil day at your coordinates: aparāhṇa (4th of 5 parts of daylight), Kutapa (8th of 15 day-muhūrtas), Gāndharva and Rauhiṇa (7th and 9th), and the kālas in which pārvaṇa is forbidden — prātaḥ, saṅgava and sāyāhna (Dharmasindhu ch. 26).

tithis_in_aparahna lists every tithi present in that day's aparāhṇa with the overlap in minutes, which is what an annual (pratyābdika) śrāddha is decided on. Two tithis appear when one ends inside the aparāhṇa.

ParameterTypeRequiredDescription
datestringRequiredYYYY-MM-DD
latfloatRequiredLatitude
lonfloatRequiredLongitude
tzstringOptionalIANA timezone. Omit to resolve from the coordinates.
langstringOptionalResponse language: one of the codes below (GET /v1/i18n/languages lists them with their names and coverage; hi-IN is accepted as hi, en-IN/en-GB/en-US as en). Canonical fields never change with the language; localized values are ADDED as <field>_local. Accepted does not mean fully translated: a value with no verified translation in that language has no _local field (never an English stand-in), and the response header X-Localization-Missing counts them. An unknown code is 400 unsupported_language.
GET/v1/shraddha/mahalayaFreeMahalaya (Pitru) Paksha shraddha dates for a year and location▶

The fifteen tithis of Mahālaya Pakṣa — amānta Bhādrapada Kṛṣṇa Pratipadā to Amāvāsyā — with the civil day each tithi's śrāddha falls on at your coordinates.

The day rule is the Dharmasindhu's: pārvaṇa śrāddha "has to be of Aparaahna Praapti" — the tithi must be present in the aparāhṇa, the fourth of five equal parts of daylight (ch. 26). Every rule in the response carries its verbatim quotation, chapter and URL under sources.

Where the text does not decide, neither does the API. When a tithi is present in the aparāhṇa on two days, or on neither, observance_date is null, decision_status is REQUIRES_SOURCE_CERTIFICATION, and both candidate days are returned with their overlap in minutes. The consulted text gives no pūrva/para ruling for pārvaṇa Mahālaya, and borrowing one would put authority on a rule the source did not state.

Also returned: Kutapa muhūrta per day, Śastrahata Caturdaśī, the Bharaṇī and Maghā-Trayodaśī occasions, the stated phala of each tithi, and the Kanyā-to-Vṛścika extension window. Avidhavā Navamī and Yati Dvādaśī are reported as convention, because the consulted translation does not state them.

Because sunrise and sunset set the aparāhṇa, the result depends on where you are.

ParameterTypeRequiredDescription
yearintegerRequiredGregorian year
latfloatRequiredLatitude. The aparāhṇa needs a sunrise and sunset, so the polar circles are excluded.
lonfloatRequiredLongitude
tzstringOptionalIANA timezone, e.g. Asia/Kolkata. Omit it to resolve from the coordinates.
langstringOptionalResponse language: one of the codes below (GET /v1/i18n/languages lists them with their names and coverage; hi-IN is accepted as hi, en-IN/en-GB/en-US as en). Canonical fields never change with the language; localized values are ADDED as <field>_local. Accepted does not mean fully translated: a value with no verified translation in that language has no _local field (never an English stand-in), and the response header X-Localization-Missing counts them. An unknown code is 400 unsupported_language.
GET/v1/vratFreeGet Vrat Endpoint▶

Vrat and fasting observances for a date.

This used to read vrat_observance, joined to vrats and panchang_day_core. vrats holds 24 definitions; vrat_observance holds ZERO rows, in the active slot, the standby slot and the DB_NAME schema alike. It was never populated, so the join could not match and the endpoint returned {"vrats": [], "count": 0} for every date ever requested. July 2025 has two Ekadashis, two Pradosh, a Purnima, an Amavasya and a Sankashti; all thirty-one days came back empty, including 6 July, Devshayani Ekadashi, which /v1/festivals reported correctly as VRAT_EKADASHI on the same call.

It now resolves through canonical_festivals, like every other festival-producing endpoint. That was already the stated rule -- "one festival cannot come back on two different dates depending on which endpoint a client happened to call" -- and this endpoint was simply never brought across. Doing so also means it inherits the kala-aware rules, including the Caturthi-nirnaya fix, rather than a table nobody fills.

The {code, category, name} shape callers parsed is preserved; rule_code and confidence are added so a caller can see which rule decided the day.

ParameterTypeRequiredDescription
datestringRequiredDate YYYY-MM-DD
location_idintegerOptionalLocation ID
langstringOptionalResponse language: one of the codes below (GET /v1/i18n/languages lists them with their names and coverage; hi-IN is accepted as hi, en-IN/en-GB/en-US as en). Canonical fields never change with the language; localized values are ADDED as <field>_local. Accepted does not mean fully translated: a value with no verified translation in that language has no _local field (never an English stand-in), and the response header X-Localization-Missing counts them. An unknown code is 400 unsupported_language.
Shastric Layer — Enterprise

Shastric Conditions ENTERPRISE — Unique in Market

Your competitive differentiator. Complete classical guidance layer based on Dharma Sindhu and Nirnaya Sindhu — not available in any other Panchang API.

📜
Legal Disclaimer Included in Response"Guidance is based on classical shastric rules (Dharma Sindhu, Nirnaya Sindhu). Local custom and personal tradition may vary. Consult your family priest for ceremonies."
GET/v1/shastra/conditionsBusinessFull shastric guidance▶

Returns all classical conditions affecting the date:

🔴 Panchak — type, severity, avoid activities, remedies
⚫ Bhadra (Vishti) — exact timing, severity
🧭 Disha Shool — blocked direction + specific remedies
🌟 Nakshatra Shool — direction to avoid by nakshatra
✨ Special Yogas — Sarvartha Siddhi, Amrita Siddhi, Pushkar
🌸 Tithi Nature — Nanda / Bhadra / Jaya / Rikta / Purna
🌙 Moon Nivas — Deva / Manushya / Tiryak / Rakshasa
💎 Day Attributes — color, deity, mantra, ruling planet
✂️ Traditional Restrictions — oil, haircut, nail, etc.
📋 Rule Precedence — Eclipse>Ekadashi>Amavasya>Bhadra>Panchak
ParameterTypeRequiredDescription
datestringRequiredYYYY-MM-DD
latfloatRequiredLatitude
lonfloatRequiredLongitude
Shastric Layer — Enterprise

Event Suitability

Is today good for a wedding? Can I start a business? Should I buy land? The engine applies the full Shastric hierarchy and returns a verdict with explicit reasons and blocking/supporting factors.

GET/v1/events/suitabilityBusinessRatings for all life events▶

Applies hierarchy: Eclipse → Ekadashi → Amavasya → Purnima → Bhadra → Panchak → Shool → Special Yogas. Returns AVOID / NEUTRAL / GOOD / EXCELLENT rating.

✅
Supported Event Typesmarriage · griha_pravesh · travel · mundan · vehicle_purchase · land_purchase · business_start · education_start
Omit event= to get all events at once.
Response Example
{
  "event": "marriage",
  "rating": "AVOID",
  "score": 18,
  "blocking_factors": ["Bhadra active until 15:30", "Panchak — Mritu Panchak"],
  "supporting_factors": ["Abhijit Muhurat available 11:52–12:40"],
  "hierarchy_applied": ["BHADRA", "PANCHAK"],
  "disclaimer": "Guidance is based on classical shastric rules..."
}
GET/v1/events/find-datesProFind best dates for an event▶

Given a date range and event type, returns only the GOOD and EXCELLENT rated dates sorted by score. Ideal for muhurat calendar builders.

Special Conditions — Pro Tier

Panchak, Bhadra & Sankranti

Granular endpoints for checking specific classical conditions.

GET/v1/panchakProPanchak status with remedies▶

Returns whether date falls in Panchak (5 inauspicious nakshatras: Dhanistha, Shatabhisha, Purva/Uttara Bhadrapada, Revati). Returns type (Mritu/Agni/Raja/Chora/Roga), severity, avoided activities, and specific remedies.

GET/v1/bhadraProBhadra (Vishti Karana) check▶

Bhadra is the most inauspicious Karana. Returns exact start/end time if active, and the activities to avoid (new business, haircut, auspicious ceremonies).

GET/v1/ganda-moolProGanda Mool nakshatra check▶

Checks whether the date falls in Ganda Mool nakshatras (Ashwini, Ashlesha, Magha, Jyeshtha, Mula, Revati) — considered inauspicious for birth and ceremonies.

GET/v1/sankrantiProSolar sankranti dates▶

Returns all 12 solar sankranti dates for a year with exact time, rashi transition, significance, and recommended observances.

Calendar — Free Tier

Calendar APIs

Bulk queries for calendar UI components — month, year, and custom ranges.

GET/v1/calendar/monthFreeFull month Panchang▶
ParameterTypeRequiredDescription
yearintegerRequiredYear
monthintegerRequiredMonth (1–12)
latfloatOptionalLatitude for timings
lonfloatOptionalLongitude
GET/v1/calendar/rangeStarterCustom range (max 31 days)▶
ParameterTypeRequiredDescription
startstringRequiredStart date YYYY-MM-DD
endstringRequiredEnd date (max 31 days from start)
GET/v1/calendar/dayFreeGet calendar day view▶

Get detailed calendar view for a single day.

ParameterTypeRequiredDescription
datestringRequiredDate YYYY-MM-DD
location_idintegerOptionalSupported location id. Takes precedence over lat/lon.
langstringOptionalResponse language: one of the codes below (GET /v1/i18n/languages lists them with their names and coverage; hi-IN is accepted as hi, en-IN/en-GB/en-US as en). Canonical fields never change with the language; localized values are ADDED as <field>_local. Accepted does not mean fully translated: a value with no verified translation in that language has no _local field (never an English stand-in), and the response header X-Localization-Missing counts them. An unknown code is 400 unsupported_language.
contentstringOptionalAttach festival content to every festival in the response: katha (or story), significance, vidhi, or all; comma-separate several. Each piece carries provenance and review_status (draft content by TathaAstu). Omit for the unchanged response.
GET/v1/calendar/yearStarterGet calendar year view▶

Get Panchang summary for an entire year.

Returns monthly summaries with key dates (Ekadashi, Purnima, Amavasya) and festival_count: the number of festivals /v1/festivals/month returns for that month and location (the same engine and regional rules).

Every summary is by observance, from the festival engine: an Ekadashi, Purnima or Amavasya is counted on the date it is observed, the date /v1/festivals gives (summary_basis: festival_observance).

ParameterTypeRequiredDescription
yearintegerRequiredYear
location_idintegerOptionalSupported location id. Takes precedence over lat/lon.
langstringOptionalResponse language: one of the codes below (GET /v1/i18n/languages lists them with their names and coverage; hi-IN is accepted as hi, en-IN/en-GB/en-US as en). Canonical fields never change with the language; localized values are ADDED as <field>_local. Accepted does not mean fully translated: a value with no verified translation in that language has no _local field (never an English stand-in), and the response header X-Localization-Missing counts them. An unknown code is 400 unsupported_language.
GET/v1/hindu-monthFreeGet Hindu Month▶

Get Hindu month information (Amanta, Purnimanta, Saura Maasa).

Month names are machine values and stay English in every language. With a non-English lang the names in that language are added as amanta_month_local, purnimanta_month_local and saura_maasa.name_local where a translation exists; a name without one has no _local field. The paksha is returned as the engine reports it.

ParameterTypeRequiredDescription
datestringRequiredDate YYYY-MM-DD
latfloatOptionalLatitude. With lon, used when location_id is not given.
lonfloatOptionalLongitude. Required together with lat.
location_idintegerOptionalPredefined location ID; takes precedence over lat/lon.
regionstringOptionalCanonical region or supported ISO 3166-2 state code (e.g. IN-MH); its canonical location is used when neither location_id nor lat/lon is given. An unsupported value is ignored.
langstringOptionalResponse language: one of the codes below (GET /v1/i18n/languages lists them with their names and coverage; hi-IN is accepted as hi, en-IN/en-GB/en-US as en). Canonical fields never change with the language; localized values are ADDED as <field>_local. Accepted does not mean fully translated: a value with no verified translation in that language has no _local field (never an English stand-in), and the response header X-Localization-Missing counts them. An unknown code is 400 unsupported_language.
GET/v1/rituFreeGet Ritu▶

Get Ritu (Hindu season) for a date.

ParameterTypeRequiredDescription
datestringRequiredDate YYYY-MM-DD
latfloatOptionalLatitude. With lon, used when location_id is not given.
lonfloatOptionalLongitude. Required together with lat.
location_idintegerOptionalPredefined location ID; takes precedence over lat/lon.
regionstringOptionalCanonical region or supported ISO 3166-2 state code (e.g. IN-MH); its canonical location is used when neither location_id nor lat/lon is given. An unsupported value is ignored.
langstringOptionalResponse language: one of the codes below (GET /v1/i18n/languages lists them with their names and coverage; hi-IN is accepted as hi, en-IN/en-GB/en-US as en). Canonical fields never change with the language; localized values are ADDED as <field>_local. Accepted does not mean fully translated: a value with no verified translation in that language has no _local field (never an English stand-in), and the response header X-Localization-Missing counts them. An unknown code is 400 unsupported_language.
GET/v1/samvatsaraFreeGet Samvatsara▶

Get Samvatsara (Hindu year name) and year details.

ParameterTypeRequiredDescription
datestringRequiredDate YYYY-MM-DD
latfloatOptionalLatitude. With lon, used when location_id is not given.
lonfloatOptionalLongitude. Required together with lat.
location_idintegerOptionalPredefined location ID; takes precedence over lat/lon.
regionstringOptionalCanonical region or supported ISO 3166-2 state code (e.g. IN-MH); its canonical location is used when neither location_id nor lat/lon is given. An unsupported value is ignored.
langstringOptionalResponse language: one of the codes below (GET /v1/i18n/languages lists them with their names and coverage; hi-IN is accepted as hi, en-IN/en-GB/en-US as en). Canonical fields never change with the language; localized values are ADDED as <field>_local. Accepted does not mean fully translated: a value with no verified translation in that language has no _local field (never an English stand-in), and the response header X-Localization-Missing counts them. An unknown code is 400 unsupported_language.
Muhurat — Pro Tier

Muhurat Finder

Find the most auspicious date-time windows for a specific event type within a date range, ranked by classical shastric score.

GET/v1/muhurat/findProFind best dates for event▶
ParameterTypeRequiredDescription
eventstringRequiredmarriage, griha_pravesh, business_start, vehicle_purchase…
start_datestringRequiredSearch range start YYYY-MM-DD
end_datestringRequiredSearch range end YYYY-MM-DD (max 90 days)
latfloatRequiredLocation latitude
lonfloatRequiredLocation longitude
min_scoreintegerOptionalMinimum score 0–100 (default: 60)
GET/v1/muhurat/dayProGet all timings for a day▶

GET /v1/timings — all auspicious and inauspicious periods for a date. Equivalent to /v1/muhurat/day. Use this for a complete timing overview.

ParameterTypeRequiredDescription
datestringRequiredDate YYYY-MM-DD
latfloatOptionalLatitude (or pass region)
lonfloatOptionalLongitude (or pass region)
regionstringOptionalCanonical region or supported ISO 3166-2 state code (e.g. IN-MH); fills coords when lat/lon omitted. Unsupported values return 422.
tzstringOptionalIANA timezone for the civil clock, e.g. Europe/Paris. Omit to use the region default (+05:30 / +05:45).
langstringOptionalResponse language: one of the codes below (GET /v1/i18n/languages lists them with their names and coverage; hi-IN is accepted as hi, en-IN/en-GB/en-US as en). Canonical fields never change with the language; localized values are ADDED as <field>_local. Accepted does not mean fully translated: a value with no verified translation in that language has no _local field (never an English stand-in), and the response header X-Localization-Missing counts them. An unknown code is 400 unsupported_language.
Eclipses — Pro Tier

Eclipses

Solar and lunar eclipse data with Sutak timings and visibility by location.

GET/v1/eclipseProEclipses for a year▶
ParameterTypeRequiredDescription
yearintegerRequiredYear to query
typestringOptionallunar or solar (default: both)
latfloatOptionalFor visibility check
lonfloatOptionalFor visibility check
GET/v1/eclipse/visibilityProCalculate eclipse visibility▶

Whether a given eclipse is visible from a location, and when.

A thin layer over the engine's own local-circumstances calculation (get_eclipse_for_date, which drives Swiss Ephemeris sol_eclipse_when_loc / lun_eclipse_how and checks that the body is actually above the horizon). No astronomy is implemented here: the same code that produces eclipse data everywhere else in the API produces it here, so the two can never disagree.

magnitude and obscuration_percent are deliberately NOT returned. The engine does not compute them, and inventing a plausible number is worse than omitting a field.

local_times are clock times in the tz offset supplied (UTC by default).

ParameterTypeRequiredDescription
eclipse_idintegerRequiredEclipse ID from /v1/eclipse
latfloatRequiredLatitude
lonfloatRequiredLongitude
tzstringOptionalUTC offset in hours (e.g. 5.5) or an IANA zone (e.g. Asia/Kolkata); local_times and sutak are returned in it. Omitted = UTC.
langstringOptionalResponse language: one of the codes below (GET /v1/i18n/languages lists them with their names and coverage; hi-IN is accepted as hi, en-IN/en-GB/en-US as en). Canonical fields never change with the language; localized values are ADDED as <field>_local. Accepted does not mean fully translated: a value with no verified translation in that language has no _local field (never an English stand-in), and the response header X-Localization-Missing counts them. An unknown code is 400 unsupported_language.
GET/v1/eclipse/yearProGet eclipses for a specific year▶

Get all eclipses for a specific year.

ParameterTypeRequiredDescription
yearintegerRequiredFour-digit year.
langstringOptionalResponse language: one of the codes below (GET /v1/i18n/languages lists them with their names and coverage; hi-IN is accepted as hi, en-IN/en-GB/en-US as en). Canonical fields never change with the language; localized values are ADDED as <field>_local. Accepted does not mean fully translated: a value with no verified translation in that language has no _local field (never an English stand-in), and the response header X-Localization-Missing counts them. An unknown code is 400 unsupported_language.
GET/v1/eclipse/{eclipse_id}ProGet eclipse details▶

Get detailed eclipse information.

ParameterTypeRequiredDescription
eclipse_idintegerRequiredEclipse identifier. (path)
langstringOptionalResponse language: one of the codes below (GET /v1/i18n/languages lists them with their names and coverage; hi-IN is accepted as hi, en-IN/en-GB/en-US as en). Canonical fields never change with the language; localized values are ADDED as <field>_local. Accepted does not mean fully translated: a value with no verified translation in that language has no _local field (never an English stand-in), and the response header X-Localization-Missing counts them. An unknown code is 400 unsupported_language.
Vedic Astrology — Pro Tier

Birth Chart (Kundli) PRO

Generate a complete Vedic birth chart (Kundli) with planetary positions, Lagna, Nakshatras, Dashas, and Yogas based on Swiss Ephemeris + Lahiri ayanamsa. Supports profiles for retrieval.

POST/v1/birth-chartProGenerate a new birth chart▶

Generates a full Vedic birth chart. Pass the native's birth date, time, and location. Returns planetary positions in signs and nakshatras, house placements, Vimshottari Dasha periods, and notable Yogas.

ParameterTypeRequiredDescription
namestringRequiredName of the person
datestringRequiredBirth date YYYY-MM-DD
timestringRequiredBirth time HH:MM (24-hr)
latfloatRequiredBirth place latitude
lonfloatRequiredBirth place longitude
tzstringOptionalTimezone (e.g. Asia/Kolkata). Auto-detected from coordinates if omitted
cURL Example
curl -X POST https://api.tathaastuapi.com/v1/birth-chart \
  -H "X-API-Key: YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Arjun",
    "date": "1990-05-15",
    "time": "06:30",
    "lat": 28.6139,
    "lon": 77.2090
  }'
GET/v1/birth-chart/{profile_id}ProRetrieve saved chart▶

Retrieve a previously generated birth chart by its profile ID. Returns the same full chart data without re-computing.

Vedic Astrology — Pro Tier

Compatibility (Kundli Matching) PRO

Ashtakoot (8-fold) Gun Milan compatibility matching. Computes Varna, Vashya, Tara, Yoni, Graha Maitri, Gana, Bhakoot, and Nadi scores with Manglik analysis and Dasha compatibility.

POST/v1/compatibilityProMatch two birth charts▶

Provide birth details for two individuals. Returns Ashtakoot Guna score (out of 36), individual Kuta scores, Manglik Dosha analysis, Nadi Dosha check, and an overall compatibility assessment.

ParameterTypeRequiredDescription
person1objectRequiredObject with name, date, time, lat, lon
person2objectRequiredObject with name, date, time, lat, lon
cURL Example
curl -X POST https://api.tathaastuapi.com/v1/compatibility \
  -H "X-API-Key: YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "person1": {"name": "Arjun", "date": "1990-05-15", "time": "06:30", "lat": 28.6, "lon": 77.2},
    "person2": {"name": "Priya", "date": "1992-08-22", "time": "14:15", "lat": 28.6, "lon": 77.2}
  }'
GET/v1/compatibility/{compat_id}ProRetrieve saved match result▶

Retrieve a previously computed compatibility analysis by its ID.

POST/v1/compatibility/reportProCompatibility Report▶

Full human-readable compatibility report in JSON, in the requested language (lang), and -- unless pdf=false -- the same report as a PDF: pdf_url is a signed download link (report storage, branding and retention rules of the account).

ParameterTypeRequiredDescription
langstringOptionalReport language: the report is produced entirely in one of these languages (en and hi authored; the others translations pending native review, stated in translation_status). May also be sent as lang in the body; the query wins. Any other registry code is 422 language_not_available_for_reports; an unknown code is 400 unsupported_language.
pdfbooleanOptionalAlso produce the report as a PDF and return its signed link (pdf_url), exactly as the Birth Report does. false returns the JSON only.
person_aobjectRequired— (body)
person_bobjectRequired— (body)
langstringOptionalReport language: the report is produced entirely in one of these languages (en and hi authored; the others translations pending native review, stated in translation_status). May also be sent as lang in the body; the query wins. Any other registry code is 422 language_not_available_for_reports; an unknown code is 400 unsupported_language. (body)
GET/v1/compatibility/scoreProCompatibility Score▶

Lightweight compatibility score API.

ParameterTypeRequiredDescription
bride_dobstringRequiredBride DOB YYYY-MM-DD
bride_timestringRequiredBride time HH:MM
bride_latfloatRequiredBride latitude
bride_lonfloatRequiredBride longitude
groom_dobstringRequiredGroom DOB YYYY-MM-DD
groom_timestringRequiredGroom time HH:MM
groom_latfloatRequiredGroom latitude
groom_lonfloatRequiredGroom longitude
modestringOptionalfull or lite
bride_tzstringOptionalIANA timezone of the bride's birth place
groom_tzstringOptionalIANA timezone of the groom's birth place
langstringOptionalResponse language: one of the codes below (GET /v1/i18n/languages lists them with their names and coverage; hi-IN is accepted as hi, en-IN/en-GB/en-US as en). Canonical fields never change with the language; localized values are ADDED as <field>_local. Accepted does not mean fully translated: a value with no verified translation in that language has no _local field (never an English stand-in), and the response header X-Localization-Missing counts them. An unknown code is 400 unsupported_language.
Rashifal & Daily Jyotish — Pro Tier

Rashifal & Daily Jyotish

Moon-sign readings from the classical transit rule. For each graha the reading reports whether it stands in a house Phaladeepika XXVI calls benefic counted from your rashi, and whether the paired Vedha house obstructs it, with the sloka on every line. Daily, weekly, monthly and yearly, for one rashi or all twelve, in English or Hindi.

What is classical here, and what is ours. Every statement carries a basis. PRIMARY_TEXT_VERIFIED is the per-graha verdict, the Vedha obstruction, Chandrabala and the XXVI.25/30/31/32 qualifiers. ARITHMETICALLY_DERIVED is grouping consecutive days that carry the same verdict into one stretch. PRODUCT_SYNTHESIS is which stretches are surfaced, the headline, the ordering — and the idea of a weekly, monthly or yearly horoscope at all, because Phaladeepika XXVI contains no period horoscope. It gives a verdict for a transit, and a transit has a duration; arranging those durations into a period reading is TathaAstu’s arrangement and is labelled rather than presented as scripture.

What the response deliberately does not contain. The transit reading (/v1/rashifal/vedic, its /all form and the daily, weekly, monthly and yearly routes) carries no overall score, no percentage, no ranking of the grahas and no career, money, love or health breakdown. Phaladeepika XXVI gives a verdict for each graha and no rule for combining them, so supplying any of those would mean presenting a TathaAstu construction as a classical rule. The life-area reading below is a separate resource and does not change these responses. Every response says so in not_included. Where the source is genuinely undecided the response says that too rather than choosing — the chapter sets no precedence between XXVI.30, 31 and 32, so where two apply both are returned with the conflict marked unresolved.

Life areas: career, money, relationships, wellbeing, fortune, travel

/v1/rashifal/vedic/life-areas/daily (one rashi) and /v1/rashifal/vedic/life-areas/daily/all (all twelve) read the same transits as the daily reading and add, for each graha, the result Phaladeepika XXVI.9–24 states for that graha in that house from your Moon sign. A result is placed under an area only where the text itself names that area; a house is never turned into an area by convention. Every factor carries its graha, its house from the rashi, its direction (POSITIVE or NEGATIVE), its state, its contribution and the verse it comes from.

Factor states. EFFECTIVE counts (+1 or −1). OBSTRUCTED (a favourable result blocked by Vedha), VOIDED and RESCUED (cancelled or relieved by the classical qualifying rules) and UNRESOLVED (the classical rules do not settle it) are shown but count 0. Each area reports signal: PRESENT, NEUTRALISED when factors exist but none counts, or NO_SIGNAL when no transit speaks to that area today — in which case nothing is invented to fill it.

Levels are a presentation convention, not a classical score

Career, money and fortune carry a level: VERY_FAVOURABLE, FAVOURABLE, MIXED, NEUTRAL, CHALLENGING, VERY_CHALLENGING or NO_SIGNAL. It is a TathaAstu PRODUCT CONVENTION (versions.score_model), derived from the effective factors with equal weight per factor, and it is not a classical score: the text gives a verdict per graha and no rule for combining them. The counts and the factors behind every level are in the response. There is no numeric score, no percentage and no overall rating across areas. confidence (LOW or MEDIUM, never higher) describes how much classical evidence agrees, not how likely anything is; Moon-sign transit is by the tradition’s own account a broad reading.

Relationships, wellbeing and travel return their factors with level: null and level_status: NOT_PROVIDED.

Wellbeing, money and withheld statements

Health is wellbeing only. The health area speaks of energy, rest, calm and recovery (wellbeing_themes) and always carries a disclaimer. It never diagnoses, never names a disease or injury and never predicts illness; it is not medical advice. Money is a traditional reading, not financial advice, and carries its own disclaimer.

Some classical statements for a placement concern death, injury, a named disease, or the illness of a spouse, child or other person. These are never rendered. Where one was withheld, the area sets restricted_factors_withheld: true with a restricted_note; withheld statements are not counted towards any level.

Colour and gem

attributes.lucky_color is a product presentation convention (classification: PRODUCT_CONVENTION). The colours are the classical ones Phaladeepika II gives each graha, preserved as written; choosing one for the day is TathaAstu’s rule, named in selection_rule: the colour of the first graha whose favourable result is effective today, in a fixed order, otherwise the colour of the weekday’s ruling graha. The texts do not prescribe a daily colour, and the response says so in note.

attributes.gem_reference is reference information only (classification: REFERENCE_ONLY): the gem Phaladeepika II.29 associates with the same graha. It is not a recommendation to wear or buy any gemstone.

Languages and versions

lang follows the platform localization contract. en and hi are rendered: the English document is always returned, and Hindi is added beside it as <field>_local (prediction_local, name_local, level_label_local, …); machine values never change with the language. The localization block echoes language and gives status. Any other supported language returns English with status: NOT_AVAILABLE_ENGLISH_RETURNED and the X-Localization-Missing header — never a silent fallback; an unsupported code is rejected. versions names the calculation, methodology, level model, admitted interpretation table and content release behind every response, and a change to any of them is a new version.

GET/v1/rashifal/vedicProDaily reading for one rashi▶

The classical transit rule applied from your Moon sign, graha by graha, each line carrying its sloka. lang is optional: omit it for the calculation only, pass it to add rendered content.

Parameter Type Required Description
rashistringRequiredMesha…Meena, an English sign name, or 1–12
datestringOptionalYYYY-MM-DD, today, tomorrow or yesterday
langstringOptionalen or hi
tzstringOptionalIANA zone that relative dates resolve against (default Asia/Kolkata)
GET/v1/rashifal/vedic/allProDaily reading for all twelve▶

All twelve rashis for one date. The transit chart is built once and shared, so this is far cheaper than twelve separate calls.

Parameter Type Required Description
datestringOptionalYYYY-MM-DD, today, tomorrow or yesterday
langstringOptionalen or hi
tzstringOptionalIANA zone that relative dates resolve against (default Asia/Kolkata)
GET/v1/rashifal/vedic/{period_type}ProDaily, weekly, monthly or yearly▶

period_type is daily, weekly, monthly or yearly. Weeks run Monday to Sunday; months and years are calendar ones, so date is any day inside the period you want. The response separates calculation from content.

Parameter Type Required Description
rashistringRequiredMesha…Meena, an English sign name, or 1–12
datestringOptionalYYYY-MM-DD, today, tomorrow or yesterday
langstringOptionalen or hi
tzstringOptionalIANA zone that relative dates resolve against (default Asia/Kolkata)
detailstringOptionaldays adds the per-day block — daily and weekly only
GET/v1/rashifal/vedic/{period_type}/allProAny period, all twelve rashis▶

The same period reading for all twelve, sharing one transit calculation. Yearly is pre-generated, so a cold yearly request is served from cache rather than computed in the request.

Parameter Type Required Description
datestringOptionalYYYY-MM-DD, today, tomorrow or yesterday
langstringOptionalen or hi
tzstringOptionalIANA zone that relative dates resolve against (default Asia/Kolkata)
POST/v1/jyotish/dailyProPersonalised daily Jyotish from a birth chart▶

The natal-chart daily reading. Unlike Rashifal it takes full birth details rather than a Moon sign, so it can use rules that need a natal chart.

GET/v1/rashifal/vedic/life-areas/dailyProDaily life-area Rashifal: career, money, relationships, wellbeing, fortune, travel (PRO)▶

PRO. A traditional, rule-based reading, not a prediction.

Every factor is a classical transit result (Phaladeepika XXVI.9-24) for a graha in a house counted from your Moon sign, admitted through TathaAstu's source and interpretation gates. Death, injury, named disease and the illness of others are never rendered. Levels are a TathaAstu presentation convention, not a classical score; health, relationship and travel carry no level. The existing /v1/rashifal/vedic/daily response is unchanged.

ParameterTypeRequiredDescription
rashistringRequiredMesha..Meena, an English sign name, or 1-12
datestringOptionalYYYY-MM-DD, or today / tomorrow / yesterday. Defaults to today in tz.
langstringOptionalResponse language: one of the codes below (GET /v1/i18n/languages lists them with their names and coverage; hi-IN is accepted as hi, en-IN/en-GB/en-US as en). Canonical fields never change with the language; localized values are ADDED as <field>_local. Accepted does not mean fully translated: a value with no verified translation in that language has no _local field (never an English stand-in), and the response header X-Localization-Missing counts them. An unknown code is 400 unsupported_language.
tzstringOptionalIANA timezone that today resolves against.
GET/v1/rashifal/vedic/life-areas/daily/allProDaily life-area Rashifal for all twelve rashis (PRO)▶

PRO. All twelve rashis for one date; each entry equals the single call.

ParameterTypeRequiredDescription
datestringOptionalYYYY-MM-DD, or today / tomorrow / yesterday.
langstringOptionalResponse language: one of the codes below (GET /v1/i18n/languages lists them with their names and coverage; hi-IN is accepted as hi, en-IN/en-GB/en-US as en). Canonical fields never change with the language; localized values are ADDED as <field>_local. Accepted does not mean fully translated: a value with no verified translation in that language has no _local field (never an English stand-in), and the response header X-Localization-Missing counts them. An unknown code is 400 unsupported_language.
tzstringOptionaltz parameter.
World Festivals — Free Tier

World Festivals FREE TIER

Multi-religion world festival calendar covering Christian, Orthodox, Islamic, Sikh, Jewish, Buddhist, Jain, Bahá'í, Zoroastrian and Shinto observances, together with the Chinese and East Asian festival year. Where a tradition is not unanimous, the variants are returned as separate entries with their own festival_id — Sunni and Shia, Svetambara and Digambara, and the two Orthodox reckonings of the fixed feasts. Currently covers 2024–2030; call /v1/festivals/world/religions for the exact range in force.

🌍
5 Religions Covered Islamic — Ramadan, Eid al-Fitr, Eid al-Adha, Muharram, Mawlid (Hijri astronomical) · Christian — Easter, Christmas, Lent, Pentecost, Ascension · Orthodox — Orthodox Easter (Pascha), Nativity, Theophany · Sikh — Vaisakhi, Gurpurabs, Hola Mohalla (Nanakshahi calendar) · Jewish — Passover, Rosh Hashanah, Yom Kippur, Hanukkah, Sukkot (Hebrew calendar)
GET/v1/festivals/worldFreeQuery world festivals▶

Multi-religion world festival calendar. Query by date, year, month, religion, or search by name. Returns paginated results sorted by date.

ParameterTypeRequiredDescription
datestringOptionalYYYY-MM-DD — get festivals for a specific date
yearintegerOptionalYear (1700–3100)
monthintegerOptionalMonth (1–12), requires year
religionstringOptionalFilter: christian, orthodox, islamic, sikh, jewish, buddhist, jain, bahai, zoroastrian, shinto, east_asian
festival_idstringOptionalExact festival_id filter
searchstringOptionalSearch festival names (partial match)
limitintegerOptionalResults per page (1–1000, default: 100)
offsetintegerOptionalPagination offset (default: 0)
cURL Examples
# All Islamic festivals for 2025
curl "https://api.tathaastuapi.com/v1/festivals/world?year=2025&religion=islamic" \
  -H "X-API-Key: YOUR_KEY"

# Search for Eid festivals
curl "https://api.tathaastuapi.com/v1/festivals/world?search=eid&year=2025" \
  -H "X-API-Key: YOUR_KEY"

# Jewish festivals in March 2025
curl "https://api.tathaastuapi.com/v1/festivals/world?year=2025&month=3&religion=jewish" \
  -H "X-API-Key: YOUR_KEY"
JSON · 200 OK
{
  "total": 28,
  "limit": 100,
  "offset": 0,
  "festivals": [
    {
      "year": 2025,
      "religion": "islamic",
      "festival_id": "ramadan_start",
      "festival_name": "Ramadan Begins",
      "gregorian_date": "2025-03-01",
      "display_date": "2025-03-01",
      "day_of_week": "Saturday",
      "calendar_ref": "1 Ramadan 1446 AH",
      "notes": "Astronomical new moon calculation"
    }
  ],
  "filters": { "year": 2025, "religion": "islamic" }
}
GET/v1/festivals/world/religionsFreeList religions and festival counts▶

Returns all available religions with total festival counts, unique festival types, and year coverage range. Use this to discover what data is available.

cURL
curl "https://api.tathaastuapi.com/v1/festivals/world/religions" \
  -H "X-API-Key: YOUR_KEY"
JSON · 200 OK
{
  "religions": [
    { "religion": "islamic", "total_festivals": 24843, "unique_festivals": 36, "min_year": 1700, "max_year": 2400 },
    { "religion": "christian", "total_festivals": 21861, "unique_festivals": 31, "min_year": 1700, "max_year": 2400 },
    { "religion": "jewish", "total_festivals": 19245, "unique_festivals": 28, "min_year": 1700, "max_year": 2400 },
    { "religion": "sikh", "total_festivals": 14700, "unique_festivals": 21, "min_year": 1700, "max_year": 2400 },
    { "religion": "orthodox", "total_festivals": 13700, "unique_festivals": 20, "min_year": 1700, "max_year": 2400 }
  ],
  "total_records": 94349,
  "year_range": { "min": 1700, "max": 2400 }
}
GET/v1/festivals/world/upcomingFreeUpcoming festivals from today▶

Returns upcoming world festivals from the current date, across all religions or filtered by a specific religion. Ideal for calendar widgets and notifications.

ParameterTypeRequiredDescription
religionstringOptionalFilter: christian, orthodox, islamic, sikh, jewish, buddhist, jain, bahai, zoroastrian, shinto, east_asian
limitintegerOptionalMax results (1–100, default: 20)
cURL
# Upcoming Sikh festivals
curl "https://api.tathaastuapi.com/v1/festivals/world/upcoming?religion=sikh&limit=10" \
  -H "X-API-Key: YOUR_KEY"
Bulk APIs — Enterprise

Bulk APIs

Process multiple dates or locations in a single HTTP request. Ideal for pre-computing calendar data or batch analysis.

POST/v1/bulk/panchangStarterPanchang for multiple dates▶
Request Body
{
  "dates": ["2025-03-01", "2025-03-02", "2025-03-15"],
  "lat": 28.6139,
  "lon": 77.2090
}
POST/v1/bulk/festivalsStarterFestivals for multiple dates▶

Returns festivals for an array of dates in one call. Supports region and language filtering. Max 365 dates per request on Enterprise.

Reference

Languages (i18n)

All names are phonetically transliterated — not machine translated. "एकादशी" renders with the same sound in every script.

✓
Phonetic, Not TranslatedFestival and Panchang names preserve the original Sanskrit pronunciation across all 50+ supported scripts and languages.
hiहिन्दी
enEnglish
taதமிழ்
teతెలుగు
mrमराठी
bnবাংলা
guગુજરાતી
knಕನ್ನಡ
mlമലയാളം
paਪੰਜਾਬੀ
orଓଡ଼ିଆ
neनेपाली
siසිංහල
ruРусский
ja日本語
zh中文
arالعربية
deDeutsch
frFrançais
esEspañol

Localized values: _local fields

Requesting lang never changes a value you already receive. It adds a <field>_local beside each field it can localize, holding the requested-language value (a field named <base>_key gains <base>_local). Display the _local value; keep matching on the original. The same field name serves every language: lang=hi, lang=ta and lang=de all fill name_local.

i
Canonical fields never change with the language name, type, paksha, festival_key, numbers, dates and times are identical in every language, so code that compares them keeps working when a user switches language. A value with no translation has no _local field — never an English stand-in. The header X-Localization-Missing counts such values, and i18n_detail=missing lists them in _i18n.missing.
GET /v1/festivals?date=2026-11-08&location_id=1&lang=hi
{
  "festival_key":        "FESTIVAL_DIWALI",
  "name":                "Diwali",
  "name_local":          "दिवाली",
  "display_name":        "Diwali",
  "display_name_local":  "दिवाली",
  "category":            "SHASTRIC"
}
GET /v1/choghadiya?date=2026-11-08&lat=19.076&lon=72.8777&lang=hi — day[0]
{
  "type":           "Kaal",
  "type_local":     "काल",
  "meaning":        "Inauspicious - Avoid important work",
  "meaning_local":  "अशुभ - महत्वपूर्ण कार्य न करें"
}

Localized values appear throughout the API: Panchang limbs, festival and vrat names, choghadiya and hora, muhurat labels, signs, grahas and nakshatras on chart routes, rashifal content, the Compatibility Report (summary_local, sections.*.text_local, kootas[].kuta_local / detail_local) and error messages (message_local beside the stable error code). Never localized: ids and codes, numbers, dates and times, coordinates, your own text (name, place), Sanskrit sources and citations. Timestamp fields such as instant_local predate this contract and mean local time; their values are always ISO-8601. Locations return their native-script name as name_native.

GET/v1/i18n/languagesFreeGet supported languages▶

Every language lang accepts, from the language registry.

This used to list the distinct languages present in one vocabulary table, which could disagree with the languages the API actually accepts, and it said every translation was a phonetic transliteration, which is not true.

ParameterTypeRequiredDescription
langstringOptionalResponse language: one of the codes below (GET /v1/i18n/languages lists them with their names and coverage; hi-IN is accepted as hi, en-IN/en-GB/en-US as en). Canonical fields never change with the language; localized values are ADDED as <field>_local. Accepted does not mean fully translated: a value with no verified translation in that language has no _local field (never an English stand-in), and the response header X-Localization-Missing counts them. An unknown code is 400 unsupported_language.
GET/v1/i18n/stringsFreeGet transliteration strings▶

Get transliteration strings for a category and language.

ParameterTypeRequiredDescription
categorystringRequiredCategory: TITHI, NAKSHATRA, YOGA, KARANA, WEEKDAY, MONTH, FESTIVAL
langstringOptionalResponse language: one of the codes below (GET /v1/i18n/languages lists them with their names and coverage; hi-IN is accepted as hi, en-IN/en-GB/en-US as en). Canonical fields never change with the language; localized values are ADDED as <field>_local. Accepted does not mean fully translated: a value with no verified translation in that language has no _local field (never an English stand-in), and the response header X-Localization-Missing counts them. An unknown code is 400 unsupported_language.
Release Notes

What’s New

Recent additions to the TathaAstu API. Full history in CHANGELOG.md; per-SDK notes ship with each package.

NEWRashifal — daily, weekly, monthly, yearlyProMoon-sign readings, English and Hindi▶

Four routes serving the classical transit rule counted from your Moon sign, with the sloka on every line. Weekly, monthly and yearly are the same per-day verdict reported over a date range — not a separate methodology. One rashi or all twelve; en or hi; today and tomorrow resolved against Asia/Kolkata. There is no overall score, ranking or lucky number, because Phaladeepika XXVI establishes none — see Rashifal & Daily Jyotish ↓.

Endpoint Returns
/v1/rashifal/vedicDaily reading for one rashi
/v1/rashifal/vedic/allDaily reading for all twelve
/v1/rashifal/vedic/{period_type}Daily, weekly, monthly or yearly
/v1/rashifal/vedic/{period_type}/allAny period, all twelve rashis
NEWChakra Calculation APIsFreeFour new calculation endpoints▶

Four new calculation APIs for the Kota, Saptaśalāka, Sarvatobhadra and Śūla chakras, each returning rule-level provenance and verification metadata.

EndpointReturns
/v1/chakra/kotaZone, entry/exit path, Kota Svāmī and Pāla
/v1/chakra/saptashalakaNakshatra vedha pairing
/v1/chakra/sarvatobhadraThree vedha lines over the 81-cell lattice
/v1/chakra/shoolaTrident points on the 28-fold cycle
/v1/chakra/nakshatrasThe accepted 28-fold vocabulary

Available on the free plan. These calls are included within your existing free-plan monthly quota — authenticated and counted like any other endpoint, not unmetered.

Pre-resolved inputs. These endpoints take nakshatra values you have already resolved. They do not calculate planetary positions from birth date, time or location.

Calculation only. Every response carries "calculation_only": true. Each rule reports its own verification level rather than the chakra carrying a single badge, and where sources differ, the reading used is named in the response.

See Chakra Calculation APIs ↓ for full documentation.

FIXAPI key prefixesAll plansAll new keys are sk_live_▶

Key creation, rotation and regeneration now always produce sk_live_ keys. TathaAstu has no sandbox environment: every key reaches production endpoints and consumes your plan quota.

Existing keys are unaffected. Nothing has been revoked or regenerated. A key created earlier with a different prefix continues to work exactly as before, and converts to sk_live_ the next time you rotate or regenerate it.

Chakra Calculation APIs

Chakra Calculation APIs FREE TIER

Four classical chakras — Kota, Saptaśalāka, Sarvatobhadra and Śūla — exposed as pure calculation endpoints, each returning the ruleset and rule-level provenance that produced the answer.

📥
These APIs take pre-resolved astronomical inputsThey perform Chakra calculations from astronomical inputs that have already been resolved to nakshatra / pada / rāśi values. They do not calculate planetary positions from birth date, time or location. Resolve positions with /v1/panchang or your own ephemeris, then pass the nakshatra name here.
🔍
Calculation, not interpretationEvery response carries "calculation_only": true and "interpretation": false. The classical sources discuss illness, danger and death at length. None of that is returned. These endpoints tell you which cells or nakshatras are struck — what that means is left to you.

Provenance levels

Chakra rules differ in how well established they are, and the API says so per rule rather than stamping a whole chakra "verified".

LevelMeaning
CROSS_VERIFIEDIndependent sources agree on every value.
VERIFIEDReproduces published worked examples exactly.
DERIVEDComputed from a source's diagram or worked example where the prose defers to a figure.
PROVISIONALEvidence leans one way without settling it. An alternative is retained.
UNRESOLVEDSources conflict. The API refuses to pick silently.
AUTHOR_RESEARCHA named author's own stated research, not classical material.

Accepted nakshatra names

All four chakras count 28 nakshatras, Abhijit included. GET /v1/chakra/nakshatras returns the exact vocabulary. Abhijit's longitude arc is disputed between sources and is deliberately not resolved by these endpoints — you supply the nakshatra you have already determined.

GET/v1/chakra/kotaFreeZone, entry/exit path, Svāmī and Pāla▶

1. Overview. The Kota chakra arranges 28 nakshatras as a four-ringed fort around the janma nakshatra. This endpoint reports which ring (zone) a transiting nakshatra occupies and whether it lies on an inbound (ENTRY) or outbound (EXIT) route, plus the fort's lord and guard.

2. Endpoint. GET /v1/chakra/kota

3. Inputs.

ParameterTypeRequiredDescription
janma_nakshatrastringRequiredPre-resolved 28-fold nakshatra name.
transit_nakshatrastringRequiredNakshatra of the transiting graha.
planetstringOptionalLabel for the graha. Default Saturn. Rāhu/Ketu reverse the path automatically.
transit_motionstringOptionalDIRECT · RETROGRADE · STATIONARY. Retrograde reverses entry/exit.
moon_rashistringOptionalRāśi of the natal Moon. Needed for Kota Svāmī.
pala_variantstringOptionalPALA_NAKSHATRA_LORD (default) or PALA_PADA_LORD.

4. Output. ordinal_from_janma (1–28), zone (STAMBHA · DURGANTARA · PRAAKAARA · BAHYA), path and effective_path (ENTRY/EXIT after motion reversal), path_reversed, kota_swami, kota_pala, and a summary.

5. Example request.

cURL
curl -H "X-API-Key: YOUR_KEY" \
  "https://api.tathaastuapi.com/v1/chakra/kota?janma_nakshatra=Krittika&transit_nakshatra=Rohini&moon_rashi=Taurus"

6. Example response.

JSON · 200 OK
{
  "chakra": "KOTA",
  "calculation_only": true, "interpretation": false,
  "inputs_are_pre_resolved": true,
  "result": {
    "janma_nakshatra": "Krittika",
    "kota_swami": "Venus",
    "kota_pala": "Sun",
    "transits": [{
      "planet": "Saturn", "nakshatra": "Rohini",
      "ordinal_from_janma": 2, "zone": "PRAAKAARA",
      "path": "ENTRY", "motion": "DIRECT",
      "effective_path": "ENTRY", "path_reversed": false
    }],
    "summary": { "total": 1, "on_entry_path": 1, "on_exit_path": 0, "in_stambha": 0 }
  },
  "ruleset": {
    "pala_variant": "PALA_NAKSHATRA_LORD",
    "verification": {
      "zones": "CROSS_VERIFIED_SECONDARY",
      "entry_exit": "DERIVED_FROM_DIAGRAM_SECONDARY",
      "kota_pala": "PROVISIONAL_DISPUTED"
    }
  }
}

7. Verification / provenance. Zone membership is CROSS_VERIFIED: two sources sharing no text agree on all 28 placements. Entry/exit is DERIVED from a labelled source diagram. Motion reversal and Kota Svāmī are corroborated by three sources with no dissent.

⚠️
Kota Pāla is PROVISIONAL, not resolvedTwo readings exist. PALA_NAKSHATRA_LORD is the default because one worked example discriminates in its favour and because the Avakahaḍa Chakra cited by the alternative contains no planetary lords at all. That is evidence, not proof. PALA_PADA_LORD is retained and requires you to supply a pada-lord table — the API will not invent one. The variant used is always named in ruleset.pala_variant.

8. Scope and limitations. No interpretation of what a zone or path implies. Kota Svāmī is null rather than guessed when moon_rashi is omitted, because a nakshatra can straddle two rāśis. Abhijit's longitude arc is not resolved here.

GET/v1/chakra/saptashalakaFreeNakshatra vedha pairing▶

1. Overview. Seven horizontal and seven vertical lines carry the 28 nakshatras at their ends, walking clockwise from the North-East beginning at Kṛttikā. The two nakshatras at opposite ends of a line are vedha to each other — fourteen mutual pairs.

2. Endpoint. GET /v1/chakra/saptashalaka

3. Inputs.

ParameterTypeRequiredDescription
nakshatrastringRequiredThe nakshatra whose vedha partner you want.
sun_nakshatrastringOptionalIf supplied, the response states whether it is vedha to nakshatra.

4. Output. The vedha_partner with its position (1–28 from Kṛttikā) and whether the line is HORIZONTAL or VERTICAL; optionally the Sun comparison.

5. Example request.

cURL
curl -H "X-API-Key: YOUR_KEY" \
  "https://api.tathaastuapi.com/v1/chakra/saptashalaka?nakshatra=Krittika&sun_nakshatra=Shravana"

6. Example response.

JSON · 200 OK
{
  "chakra": "SAPTASHALAKA",
  "calculation_only": true, "interpretation": false,
  "result": {
    "janma": { "position": 1, "nakshatra": "Krittika" },
    "vedha_partner": { "position": 21, "nakshatra": "Shravana", "line": "HORIZONTAL" },
    "sun": { "nakshatra": "Shravana", "is_vedha_to_janma": true }
  },
  "ruleset": {
    "construction": "7_HORIZONTAL_7_VERTICAL_28_ENDPOINTS",
    "vedha_rule": "OPPOSITE_ENDS_OF_THE_SAME_LINE",
    "pair_count": 14,
    "verification": "DIAGRAM_VERIFIED_SECONDARY"
  }
}

7. Verification / provenance. DIAGRAM_VERIFIED_SECONDARY. The construction is stated in prose, but the fourteen pairs exist in the source only as a diagram, which was read directly. Three checks passed: the one pair the prose does state (Kṛttikā ↔ Śravaṇa) is reproduced; every nakshatra appears exactly once; and 14 lines × 2 ends = 28. Independently, this pairing agrees with the Sarvatobhadra opposition relation on all 28 stars, from an unrelated source.

📐
Diagram-derived, not primary textThe pairing rests on a modern redrawing rather than a manuscript. Its internal consistency is high; its classical authority is secondary. Worth knowing: the intuitive i ↔ i+14 reading is wrong — it would pair Kṛttikā with Anurādhā rather than Śravaṇa.

8. Scope and limitations. Returns the pairing only. The classical application concerns danger to life; no such reading is returned. Whether the pairing is motion-sensitive is not stated by the source and is therefore not modelled.

GET/v1/chakra/sarvatobhadraFreeThree vedha lines over the 81-cell lattice▶

1. Overview. A 9×9 lattice of 81 cells: 28 nakshatras on the outer ring, then 20 consonants, 12 rāśis, five tithi groups at the centre, and 16 vowels on the ring corners. A graha strikes cells along three lines.

2. Endpoint. GET /v1/chakra/sarvatobhadra

3. Inputs.

ParameterTypeRequiredDescription
nakshatrastringRequiredNakshatra occupied by the graha.
planetstringOptionalLabel. Default Saturn.
motionstringOptionalMarks which line is dominant.
dignitystringOptionalEXALTED ×3 · RETROGRADE ×2 · NORMAL ×1 · DEBILITATED ×0.5.
variantstringOptionalVEDHA_ALL_THREE (default) or VEDHA_MOTION_DEPENDENT.

4. Output. For each of OPPOSITE, FORWARD and BACKWARD: the ordered list of struck cells with row, column, kind and label, plus the border star at the end of the line and whether that direction is dominant.

🧭
Directions are named by travel, never left/rightOPPOSITE is the straight line across the lattice. FORWARD is the diagonal reaching a border star ahead in zodiacal order; BACKWARD the one behind. No consulted source fixes a left/right orientation, so that vocabulary is deliberately absent — a drawing convention cannot silently flip a result.

5. Example request.

cURL
curl -H "X-API-Key: YOUR_KEY" \
  "https://api.tathaastuapi.com/v1/chakra/sarvatobhadra?nakshatra=Krittika&planet=Mars"

6. Example response (cells abridged).

JSON · 200 OK
{
  "chakra": "SARVATOBHADRA",
  "calculation_only": true, "interpretation": false,
  "result": {
    "transits": [{
      "planet": "Mars", "nakshatra": "Krittika",
      "motion": "DIRECT", "dignity": "NORMAL",
      "strength_multiplier": 1.0,
      "dominant_direction": "FORWARD",
      "vedha": {
        "OPPOSITE": { "struck_star": "Shravana", "is_dominant": false, "cells": [ "..." ] },
        "FORWARD":  { "struck_star": "Vishakha", "is_dominant": true,  "cells": [ "..." ] },
        "BACKWARD": { "struck_star": "Bharani",  "is_dominant": false, "cells": [ "..." ] }
      }
    }]
  },
  "ruleset": {
    "rules": {
      "lattice": "VERIFIED", "vedha_geometry": "VERIFIED",
      "rasi_placement": "VERIFIED", "consonant_placement": "DERIVED",
      "vowel_placement": "DERIVED", "tithi_placement": "DERIVED",
      "abhijit_resolution": "UNRESOLVED", "motion_strength": "VARIANT",
      "junction_rules": "NOT_IMPLEMENTED", "interpretation": "EXCLUDED"
    }
  }
}

7. Verification / provenance. The lattice and vedha geometry are VERIFIED against 12 published known-value vectors (four stars × three directions) and all 16 cells of a published worked example. Rāśi placement is VERIFIED — the rule is explicit in the source. Consonant, vowel and tithi placement are DERIVED: the sources give those sets but defer placement to their diagrams, so a stated interpretation was fixed in advance and then reproduced the worked example exactly. That corroborates the reading without being the text settling it.

8. Scope and limitations. Motion is returned as a dominance marker and a strength multiplier, not as a filter — sources conflict on whether all three lines act or motion selects one, so both readings ship and neither is presented as correct. Three further rules are declared NOT_IMPLEMENTED rather than guessed: the junction/pada rule, paired-letter coupling, and the uncovered-consonant triplets. No interpretation is returned.

GET/v1/chakra/shoolaFreeTrident points on the 28-fold cycle▶

1. Overview. A trident laid over the 28-fold Sarvatobhadra framework. The reference nakshatra is the base of the staff; the three spear tips fall at the 9th (direct trine), the 15th (exactly opposite) and the 21st (reverse trine).

2. Endpoint. GET /v1/chakra/shoola

3. Inputs.

ParameterTypeRequiredDescription
reference_nakshatrastringRequiredThe Sun's nakshatra for SUN_4POINT.
transit_nakshatrastringOptionalReported as a hit or not against the śūla points.
planetstringOptionalLabel. Default Saturn.
variantstringOptionalSUN_4POINT (default) or JANMA_3POINT.
include_trident_partsboolOptionalAdds an author's-research part attribution. Default false.

4. Output. The four shoola_points with their ordinals and nakshatra names, the reference body used, and each transit reported as a hit or not.

5. Example request.

cURL
curl -H "X-API-Key: YOUR_KEY" \
  "https://api.tathaastuapi.com/v1/chakra/shoola?reference_nakshatra=Ashwini&transit_nakshatra=Anuradha"

6. Example response.

JSON · 200 OK
{
  "chakra": "SHOOLA",
  "calculation_only": true, "interpretation": false,
  "result": {
    "reference": { "body": "SUN_NAKSHATRA", "nakshatra": "Ashwini" },
    "shoola_points": [
      { "position": 1, "ordinal": 1,  "nakshatra": "Ashwini" },
      { "position": 2, "ordinal": 9,  "nakshatra": "Ashlesha" },
      { "position": 3, "ordinal": 15, "nakshatra": "Swati" },
      { "position": 4, "ordinal": 21, "nakshatra": "U.Ashadha" }
    ],
    "transits": [{ "planet": "Saturn", "nakshatra": "Anuradha", "hit": false }]
  },
  "ruleset": {
    "variant": "SUN_4POINT",
    "reference": "SUN_NAKSHATRA",
    "nakshatra_scheme": "28_WITH_ABHIJIT",
    "framework": "SARVATOBHADRA_28",
    "verification": "SOURCED_NAMED_AUTHOR"
  }
}

7. Verification / provenance. SUN_4POINT is the sourced reading: a named author's dedicated chapter states that the Sun's nakshatra is the base of the staff and gives the tips as the 9th direct, the 15th opposite and the 9th reverse, presenting these as classical and traditional. The same source places the chakra on the 28-fold framework — which is what makes the rule self-consistent, since the 15th is "exactly opposite" only in a 28-fold cycle.

⚠️
JANMA_3POINT is retained but unsupportedIt counts from the birth Moon instead of the Sun and appears in circulating modern implementations. No consulted source supports it. It is offered so that callers who need to match such an implementation can, not because it is correct. The variant used is always named in ruleset.variant, so it is never an invisible default.
🔬
Trident parts are one author's own researchWith include_trident_parts=true the response attributes each of the 28 positions to a part of the trident and a graha. The author states plainly that this allocation is his own research, distinct from the four śūla nakshatras, which he presents as traditional. It is therefore off by default and labelled AUTHOR_RESEARCH when returned.

8. Scope and limitations. The sources use this chakra to judge illness, accidents and death. No such reading is returned, and none should be inferred from a "hit". The API reports only which nakshatras are śūla points and whether a supplied transit occupies one.

GET/v1/chakra/nakshatrasFreeThe 28-fold nakshatra names accepted by the Chakra APIs▶

Reference list. These endpoints take pre-resolved nakshatra names; this is the accepted vocabulary, Abhijit included.

ParameterTypeRequiredDescription
langstringOptionalResponse language: one of the codes below (GET /v1/i18n/languages lists them with their names and coverage; hi-IN is accepted as hi, en-IN/en-GB/en-US as en). Canonical fields never change with the language; localized values are ADDED as <field>_local. Accepted does not mean fully translated: a value with no verified translation in that language has no _local field (never an English stand-in), and the response header X-Localization-Missing counts them. An unknown code is 400 unsupported_language.
Core APIs

Individual Limb Calculators

One limb at a time, when a full Panchang response is more than you need. Each returns the same values the full endpoint would, computed by the same engine.

GET/v1/karanaFreeGet Karana details▶

Get detailed Karana information for a date.

ParameterTypeRequiredDescription
datestringRequiredTarget date in YYYY-MM-DD.
location_idintegerOptionalSupported location id. Takes precedence over lat/lon.
langstringOptionalResponse language: one of the codes below (GET /v1/i18n/languages lists them with their names and coverage; hi-IN is accepted as hi, en-IN/en-GB/en-US as en). Canonical fields never change with the language; localized values are ADDED as <field>_local. Accepted does not mean fully translated: a value with no verified translation in that language has no _local field (never an English stand-in), and the response header X-Localization-Missing counts them. An unknown code is 400 unsupported_language.
GET/v1/special-yogasProGet Special Yogas Endpoint▶

Get special yogas (Sarvartha Siddhi, Amrita Siddhi, Dwipushkar, Tripushkar).

ParameterTypeRequiredDescription
datestringRequiredDate YYYY-MM-DD
latfloatOptionalLatitude. With lon, used when location_id is not given.
lonfloatOptionalLongitude. Required together with lat.
location_idintegerOptionalPredefined location ID; takes precedence over lat/lon.
regionstringOptionalCanonical region or supported ISO 3166-2 state code (e.g. IN-MH); its canonical location is used when neither location_id nor lat/lon is given. An unsupported value is ignored.
langstringOptionalResponse language: one of the codes below (GET /v1/i18n/languages lists them with their names and coverage; hi-IN is accepted as hi, en-IN/en-GB/en-US as en). Canonical fields never change with the language; localized values are ADDED as <field>_local. Accepted does not mean fully translated: a value with no verified translation in that language has no _local field (never an English stand-in), and the response header X-Localization-Missing counts them. An unknown code is 400 unsupported_language.
GET/v1/yogaFreeGet Yoga details▶

Get detailed Yoga information for a date.

ParameterTypeRequiredDescription
datestringRequiredTarget date in YYYY-MM-DD.
location_idintegerOptionalSupported location id. Takes precedence over lat/lon.
langstringOptionalResponse language: one of the codes below (GET /v1/i18n/languages lists them with their names and coverage; hi-IN is accepted as hi, en-IN/en-GB/en-US as en). Canonical fields never change with the language; localized values are ADDED as <field>_local. Accepted does not mean fully translated: a value with no verified translation in that language has no _local field (never an English stand-in), and the response header X-Localization-Missing counts them. An unknown code is 400 unsupported_language.
Vedic Astrology

Kundli Reports

A free teaser for preview, and the full Birth Report: a signed PDF link from POST /v1/kundli/birth-report, in 13 languages.

What /v1/kundli returns

The response is {"data": {…}, "meta": {…}}. meta carries engine_version, calculation_version and generated_at. Everything in data is computed from one chart, so the blocks always agree with each other.

FieldTypeWhat it holds
birthobjectThe birth data as used: date, time, latitude, longitude, timezone, julian_day_ut.
calculationobjectThe exact conventions of this chart: profile, zodiac, ayanamsa, node_type, house_system, the ephemeris requested and actually used, engine_version and calculation_version. Store it with the chart to reproduce it later.
lagnaobjectAscendant: longitude, sign, degree within the sign, nakshatra, pada, lord.
planets[]array of 9Sun to Ketu: longitude, sign, degree, house, nakshatra, pada, nakshatra_lord, sign_lord, retrograde, stationary, dignity (with dignity_reason), speed, navamsa_sign.
housesobjecthouses[]: the 12 whole-sign houses with number, sign, lord and the planets in each; cusps: Placidus cusps, alongside, for reference.
vargasobjectAll 16 Parashari divisional charts, keyed D1_Rasi, D2_Hora, D3_Drekkana, D4_Chaturthamsa, D7_Saptamsa, D9_Navamsa, D10_Dasamsa, D12_Dwadasamsa, D16_Shodasamsa, D20_Vimsamsa, D24_Siddhamsa, D27_Bhamsa, D30_Trimsamsa, D40_Khavedamsa, D45_Akshavedamsa, D60_Shashtiamsa. Each maps Lagna and every graha to its sign in that chart.
varga_metadataobjectFor each varga: code, name, divisions, the counting convention, tradition, formula_version and its classical source.
dashas.vimshottariobjectstart_lord and balance_at_birth; current = the mahadasha, antardasha and pratyantardasha running at the moment of birth (not today — to find today’s period, pick the entry in mahadashas whose start–end contains today); mahadashas[] = the full 120-year timeline, each with antardasha[] and, within those, pratyantardasha[]. dasha_levels (1–3, default 3) controls the depth.
karakasobjectChara karakas (Atmakaraka to Darakaraka) with the planet, its degree in sign, sign and house; default_convention (seven_with_rahu) ranked them, and conventions gives all three schemes: seven_with_rahu, seven_without_rahu, eight_with_rahu.
special_lagnasobjectarudha_lagna, upapada_lagna, badhaka, maraka and gulika_mandi, each with how it was derived.
aspectsobjectParashari graha drishti: aspects[] lists each aspect (from, to_house, to_planets, rule). Rahu and Ketu are given no drishti, as BPHS gives none.
dispositorsobjectPer graha: its dispositor, the full chain, and the final_dispositor.
planetary_relationshipsobjectcombustion (separation from the Sun and whether combust) and planetary_war.
planetary_natureobjectPer graha: natural benefic/malefic and functional nature for this lagna, with the houses it owns.
argalaobjectArgala (intervention) from the lagna and from each graha, with obstruction (virodha) and the rule and source used.

Optional additions. ?include_yogas=true adds yogas from the legacy yoga detector (not source-reviewed; its known defects are listed in yogas_known_defects). ?include_shadbala=true adds shadbala. lang (query or body) adds *_local companion fields in that language; the English values never change.

Request body. Required: date_of_birth (YYYY-MM-DD), time_of_birth (HH:MM or HH:MM:SS, local time), latitude, longitude. Optional: name, timezone (IANA, default Asia/Kolkata), profile (default vedic-lahiri), node_type (mean or true), dasha_levels (1–3), lang.

/v1/kundli or /v1/birth-chart? /v1/birth-chart is the older endpoint: a flatter chart (planets keyed by name, house_cusps, four divisional_charts: D9, D7, D10, D30) that can be stored as a profile and fetched again by profile_id. /v1/kundli is the complete calculation: all 16 vargas, the dasha timeline, karakas, special lagnas, aspects and the rest. Both are kept; use /v1/kundli for new work.

A real response for 15 May 1990, 14:30, New Delhi, shortened (“…” marks what was cut):

Response — POST /v1/kundli
{
  "data": {
    "birth": {
      "date": "1990-05-15",
      "time": "14:30:00",
      "latitude": 28.6139,
      "longitude": 77.209,
      "timezone": "Asia/Kolkata",
      "julian_day_ut": 2448026.875
    },
    "calculation": {
      "profile": "vedic-lahiri",
      "zodiac": "sidereal",
      "house_system": "whole_sign",
      "node_type": "mean",
      "ephemeris_actual": "swiss_ephemeris",
      "calculation_version": "1.2.0"
    },
    "lagna": {
      "longitude": 151.904621,
      "sign": "Virgo",
      "degree": 1.904621,
      "nakshatra": "Uttara Phalguni",
      "pada": 2,
      "lord": "Mercury"
    },
    "planets": [
      {
        "name": "Sun",
        "longitude": 30.549776,
        "sign": "Taurus",
        "degree": 0.549776,
        "house": 9,
        "nakshatra": "Krittika",
        "pada": 2,
        "nakshatra_lord": "Sun",
        "sign_lord": "Venus",
        "retrograde": false,
        "stationary": false,
        "dignity": "Neutral",
        "dignity_reason": null,
        "speed": 0.964203,
        "navamsa_sign": "Capricorn"
      },
      "… 8 more grahas"
    ],
    "houses": {
      "system": "whole_sign",
      "houses": [
        {
          "number": 1,
          "sign": "Virgo",
          "lord": "Mercury",
          "planets": []
        },
        "… 11 more"
      ]
    },
    "vargas": {
      "D9_Navamsa": {
        "Lagna": "Capricorn",
        "Sun": "Capricorn",
        "Moon": "Capricorn",
        "Mars": "Taurus",
        "Mercury": "Leo",
        "Jupiter": "Aquarius",
        "Venus": "Sagittarius",
        "Saturn": "Capricorn",
        "Rahu": "Gemini",
        "Ketu": "Sagittarius"
      },
      "…": "D1 to D60, 16 charts"
    },
    "varga_metadata": {
      "D9_Navamsa": {
        "code": "D9",
        "name": "Navamsa",
        "divisions": 9,
        "convention": "movable from itself, fixed from the 9th, dual from the 5th",
        "tradition": "Parashari"
      }
    },
    "dashas": {
      "vimshottari": {
        "start_lord": "Sun",
        "balance_at_birth": {
          "lord": "Sun",
          "years": 3.647829
        },
        "current": {
          "mahadasha": {
            "lord": "Sun",
            "start": "1988-01-07T11:22:09.676349",
            "end": "1994-01-06T23:22:09.676349"
          },
          "antardasha": {
            "lord": "Jupiter",
            "start": "1990-01-25T05:40:09.676349",
            "end": "1990-11-13T10:28:09.676349"
          },
          "pratyantardasha": {
            "lord": "Mercury",
            "start": "1990-04-20T11:04:09.676349",
            "end": "1990-05-31T20:32:57.676349"
          }
        },
        "mahadashas": [
          {
            "lord": "Sun",
            "start": "1988-01-07T11:22:09",
            "end": "1994-01-06T23:22:09",
            "years": 6.0,
            "antardasha": [
              {
                "lord": "Sun",
                "start": "1988-01-07T11:22:09",
                "end": "1988-04-26T01:10:09",
                "pratyantardasha": [
                  "…"
                ]
              },
              "…"
            ]
          },
          "… 8 more"
        ]
      }
    },
    "karakas": {
      "default_convention": "seven_with_rahu",
      "karakas": {
        "Atmakaraka": {
          "planet": "Mars",
          "degree_in_sign": 24.515207,
          "ranking_degree": 24.515207,
          "sign": "Aquarius",
          "house": 6,
          "retrograde": false,
          "reversed_for_ranking": false
        },
        "…": "Amatyakaraka … Darakaraka"
      }
    },
    "special_lagnas": {
      "arudha_lagna": {
        "sign": "Scorpio",
        "house_from_lagna": 3
      },
      "…": "upapada_lagna, badhaka, maraka, gulika_mandi"
    },
    "aspects": {
      "system": "parashari_graha_drishti",
      "aspects": [
        {
          "from": "Sun",
          "from_sign": "Taurus",
          "to_sign_index": 7,
          "distance": 7,
          "to_house": 3,
          "to_planets": [],
          "type": "graha_drishti",
          "basis": "rashi",
          "rule": "all grahas aspect the 7th"
        },
        "…"
      ]
    },
    "dispositors": {
      "Sun": {
        "dispositor": "Venus",
        "chain": [
          "Sun",
          "Venus",
          "Jupiter",
          "Mercury",
          "Mars",
          "Saturn"
        ],
        "final_dispositor": "Saturn"
      },
      "…": "one per graha"
    },
    "planetary_relationships": {
      "combustion": "{…}",
      "planetary_war": "{…}"
    },
    "planetary_nature": {
      "lagna": "Virgo",
      "planets": {
        "Sun": {
          "natural": "malefic",
          "functional": {
            "nature": "neutral",
            "houses_owned": [
              12
            ]
          }
        }
      }
    },
    "argala": {
      "convention": "bphs_argala",
      "from_lagna": "{…}",
      "from_planets": "{…}"
    }
  },
  "meta": {
    "engine_version": "tathaastu-chart_generator-1",
    "calculation_version": "1.2.0"
  }
}
POST/v1/ashtakavargaProAshtakavarga with classical references▶

The Bhinnashtakavarga of the seven grahas and the Lagna, with the contributors of every point; the Samudaya with its favourable / middling / difficult bands; and Trikona and Ekadhipatya reduction with Rashi, Graha and Yoga Pinda. The point table is decoded from the karana verses of BPHS 66 and checked against their counts, the fixed totals and Santhanam's worked example. Ekadhipatya reduction is read differently by the editions; all three readings are returned and the primary one is named.

ParameterTypeRequiredDescription
langstringOptionalResponse language: one of the codes below (GET /v1/i18n/languages lists them with their names and coverage; hi-IN is accepted as hi, en-IN/en-GB/en-US as en). Canonical fields never change with the language; localized values are ADDED as <field>_local. Accepted does not mean fully translated: a value with no verified translation in that language has no _local field (never an English stand-in), and the response header X-Localization-Missing counts them. An unknown code is 400 unsupported_language.
date_of_birthstringRequiredYYYY-MM-DD (body)
time_of_birthstringRequiredHH:MM or HH:MM:SS, local to timezone (body)
latitudefloatRequired— (body)
longitudefloatRequired— (body)
timezonestringOptionalIANA timezone (body)
namestringOptional— (body)
POST/v1/ashubha-janmaProInauspicious birth conditions with classical references▶

Evaluates the birth moment against BPHS ch. 85-96: Amāvasyā, the six parts of Kṛṣṇa Caturdaśī, Viṣṭi karaṇa, Vyatīpāta yoga, a kṣaya tithi, tithi / nakṣatra / lagna Gaṇḍānta, Abhukta Mūla, saṅkrānti and solar or lunar eclipse, with the junction times and the Sanskrit verse for each. Family nakṣatra and birth-order conditions are evaluated only when supplied. Names the text lists but does not define (Yamaghaṇṭa, Dagdha yoga, Pāta) are listed as not computed. Remedies are returned as text, not advice.

ParameterTypeRequiredDescription
langstringOptionalResponse language: one of the codes below (GET /v1/i18n/languages lists them with their names and coverage; hi-IN is accepted as hi, en-IN/en-GB/en-US as en). Canonical fields never change with the language; localized values are ADDED as <field>_local. Accepted does not mean fully translated: a value with no verified translation in that language has no _local field (never an English stand-in), and the response header X-Localization-Missing counts them. An unknown code is 400 unsupported_language.
date_of_birthstringRequiredYYYY-MM-DD (body)
time_of_birthstringRequiredHH:MM or HH:MM:SS, local to timezone (body)
latitudefloatRequired— (body)
longitudefloatRequired— (body)
timezonestringOptionalIANA timezone (body)
namestringOptional— (body)
family_janma_nakshatrasarrayOptionalOptional. Evaluates BPHS ch. 89: birth in the janma nakshatra of a parent or sibling. (body)
born_after_three_of_other_sexbooleanOptionalOptional. Evaluates BPHS ch. 95: a daughter after three sons, or a son after three daughters. (body)
POST/v1/avasthaProGraha avasthas with classical references▶

The avasthas of BPHS ch. 45 for every graha: Baladi, Jagradadi, Deeptadi, Lajjitadi and Shayanadi with Drishti / Cheshta / Vicheshta, together with the natural, temporary and compound relationships of ch. 3 they depend on. Every state carries its verse. Where the Pathak edition, the transcription and Santhanam's translation read a rule differently, each reading is returned; the effect verses are returned as text, not as a prediction.

ParameterTypeRequiredDescription
langstringOptionalResponse language: one of the codes below (GET /v1/i18n/languages lists them with their names and coverage; hi-IN is accepted as hi, en-IN/en-GB/en-US as en). Canonical fields never change with the language; localized values are ADDED as <field>_local. Accepted does not mean fully translated: a value with no verified translation in that language has no _local field (never an English stand-in), and the response header X-Localization-Missing counts them. An unknown code is 400 unsupported_language.
date_of_birthstringRequiredYYYY-MM-DD (body)
time_of_birthstringRequiredHH:MM or HH:MM:SS, local to timezone (body)
latitudefloatRequired— (body)
longitudefloatRequired— (body)
timezonestringOptionalIANA timezone (body)
namestringOptional— (body)
name_syllable_numberintegerOptionalThe value (1-5) of the first syllable of the native's name, used for the Drishti / Cheshta / Vicheshta of the Shayanadi avasthas (BPHS 45.34). Neither edition prints the syllable table legibly, so it is not derived from name; without it the Cheshta is not evaluated. (body)
POST/v1/doshaProDoshas with classical references▶

Kuja (Mangal) dosha from BPHS 80.47-49 and Phaladeepika XI.3, and the serpent's and father's curse yogas of BPHS ch. 83 judged by the Sanskrit text, each with its verse. Where R. Santhanam's translation reads a verse differently, that reading is evaluated and returned beside the verdict. Conditions the text does not let a chart decide (strength without a stated threshold, Gulika) are returned as null, never guessed. Kaal Sarp and Sade Sati have no classical locus; they are returned under conventions.

ParameterTypeRequiredDescription
langstringOptionalResponse language: one of the codes below (GET /v1/i18n/languages lists them with their names and coverage; hi-IN is accepted as hi, en-IN/en-GB/en-US as en). Canonical fields never change with the language; localized values are ADDED as <field>_local. Accepted does not mean fully translated: a value with no verified translation in that language has no _local field (never an English stand-in), and the response header X-Localization-Missing counts them. An unknown code is 400 unsupported_language.
date_of_birthstringRequiredYYYY-MM-DD (body)
time_of_birthstringRequiredHH:MM or HH:MM:SS, local to timezone (body)
latitudefloatRequired— (body)
longitudefloatRequired— (body)
timezonestringOptionalIANA timezone (body)
namestringOptional— (body)
partnerobjectOptionalPartner's birth data. Applies BPHS 80.49: the Kuja yoga in both charts ceases to have effect. (body)
sade_sati_datestringOptionalYYYY-MM-DD. When given, Sade Sati (a convention) is evaluated for that date at local noon at the birth place. (body)
POST/v1/kundliProCanonical Vedic kundli▶

Complete Vedic calculation from one canonical chart. The response is {data, meta}; data holds: birth (the input as used, with Julian day), calculation (ayanamsa, node, house system, ephemeris and versions used), lagna, planets (9 grahas: sign, degree, house, nakshatra and pada, lords, retrograde, dignity, speed, navamsa sign), houses (whole-sign houses with Placidus cusps alongside), vargas and varga_metadata (all 16 Parashari divisional charts, D1 to D60, each with its rule and source), dashas (Vimshottari: balance at birth; current = the periods running at the moment of birth, not today; the full mahadasha > antardasha > pratyantardasha timeline; dasha_levels 1-3), karakas (Chara karakas), special_lagnas (Arudha, Upapada, Badhaka, Maraka, Gulika/Mandi), aspects (Parashari graha drishti), dispositors, planetary_relationships (combustion, planetary war), planetary_nature (natural and functional) and argala. include_yogas=true adds the legacy yoga list; include_shadbala=true adds Shadbala. Every response echoes the exact calculation conventions used. /v1/birth-chart (the older, flatter chart) is unchanged and remains available.

ParameterTypeRequiredDescription
include_yogasbooleanOptionalInclude the LEGACY yoga detection (not source-reviewed; known defects listed in yogas_known_defects).
include_shadbalabooleanOptionalInclude Shadbala from the existing engine
langstringOptionalResponse language: one of the codes below (GET /v1/i18n/languages lists them with their names and coverage; hi-IN is accepted as hi, en-IN/en-GB/en-US as en). Canonical fields never change with the language; localized values are ADDED as <field>_local. Accepted does not mean fully translated: a value with no verified translation in that language has no _local field (never an English stand-in), and the response header X-Localization-Missing counts them. An unknown code is 400 unsupported_language.
namestringOptional— (body)
date_of_birthstringRequiredYYYY-MM-DD (body)
time_of_birthstringRequiredHH:MM or HH:MM:SS, local to timezone (body)
latitudefloatRequired— (body)
longitudefloatRequired— (body)
timezonestringOptional— (body)
profilestringOptional— (body)
node_typestringOptional"mean" or "true" (body)
dasha_levelsintegerOptional— (body)
langstringOptionalResponse language: one of the codes below (GET /v1/i18n/languages lists them with their names and coverage; hi-IN is accepted as hi, en-IN/en-GB/en-US as en). Canonical fields never change with the language; localized values are ADDED as <field>_local. Accepted does not mean fully translated: a value with no verified translation in that language has no _local field (never an English stand-in), and the response header X-Localization-Missing counts them. An unknown code is 400 unsupported_language. (body)
POST/v1/kundli/birth-reportProGenerate the Vedic Birth Report PDF (predictions) in 13 languages▶

The Birth Report generated from the frozen Calculation Engine (calculation 1.2.0).

edition=predictive (default): birth chart and D9, personality, life areas (career, finance, marriage, family, children, education, property, health, spiritual, travel), current and next mahadasha, a year-by-year outlook (forecast_years, 1-20, default 10, from the current calendar year) from Jupiter/Saturn/Rahu/Ketu transits, a lifetime view of every mahadasha, and the sources used. edition=calculation: the chart, every table and the traditional interpretation, without predictions.

Returns a signed PDF link (report storage, branding and retention rules of the account). English and Hindi text is authored; the other languages are translations pending native review, and the report says so.

ParameterTypeRequiredDescription
langstringOptionalReport language: the report is produced entirely in one of these languages (en and hi authored; the others translations pending native review, stated in translation_status). May also be sent as lang in the body; the query wins. Any other registry code is 422 language_not_available_for_reports; an unknown code is 400 unsupported_language.
editionstringOptionalpredictive (chart, life areas, dashas and a year-by-year outlook) or calculation (chart, tables and traditional interpretation only).
forecast_yearsintegerOptionalYears of year-by-year outlook, from the current calendar year (predictive edition). 1-20, default 10.
namestringOptional— (body)
date_of_birthstringRequired— (body)
time_of_birthstringRequired— (body)
latitudefloatRequired— (body)
longitudefloatRequired— (body)
langstringOptionalReport language: the report is produced entirely in one of these languages (en and hi authored; the others translations pending native review, stated in translation_status). May also be sent as lang in the body; the query wins. Any other registry code is 422 language_not_available_for_reports; an unknown code is 400 unsupported_language. (body)
timezonestringOptional— (body)
placestringOptionalPlace of birth as it should be printed on the report (body)
GET/v1/kundli/teaserProFree Kundli teaser (preview before purchase)▶

Free teaser preview of the Kundli report. Returns: Lagna, Moon sign, 2 key insights. The full report is POST /v1/kundli/birth-report.

ParameterTypeRequiredDescription
datestringRequiredDate of birth YYYY-MM-DD
timestringRequiredTime of birth HH:MM
latfloatRequiredLatitude
lonfloatRequiredLongitude
namestringOptionalName (optional)
langstringOptionalResponse language: one of the codes below (GET /v1/i18n/languages lists them with their names and coverage; hi-IN is accepted as hi, en-IN/en-GB/en-US as en). Canonical fields never change with the language; localized values are ADDED as <field>_local. Accepted does not mean fully translated: a value with no verified translation in that language has no _local field (never an English stand-in), and the response header X-Localization-Missing counts them. An unknown code is 400 unsupported_language.
tzstringOptionalIANA timezone of the birth place; the time of birth is local to it
POST/v1/upagrahaProUpagrahas with classical references▶

The five aprakāśa grahas (Dhūma, Vyatīpāta, Pariveṣa, Indracāpa, Upaketu) from BPHS ch. 3 and the five kālavelās (Kāla, Mṛtyu, Ardhaprahara, Yamaghaṇṭaka, Gulika) from BPHS ch. 4, each with its Sanskrit verse from the Pathak edition and R. Santhanam's translation. Kālavelās are counted from the vāra that began at the sunrise before the birth, and the longitude rising at the start and at the end of each part are both returned. Above the polar circles on days without sunrise or sunset the kālavelās are reported unavailable.

ParameterTypeRequiredDescription
langstringOptionalResponse language: one of the codes below (GET /v1/i18n/languages lists them with their names and coverage; hi-IN is accepted as hi, en-IN/en-GB/en-US as en). Canonical fields never change with the language; localized values are ADDED as <field>_local. Accepted does not mean fully translated: a value with no verified translation in that language has no _local field (never an English stand-in), and the response header X-Localization-Missing counts them. An unknown code is 400 unsupported_language.
date_of_birthstringRequiredYYYY-MM-DD (body)
time_of_birthstringRequiredHH:MM or HH:MM:SS, local to timezone (body)
latitudefloatRequired— (body)
longitudefloatRequired— (body)
timezonestringOptionalIANA timezone (body)
namestringOptional— (body)
Reference Data

Locations

The precomputed locations served from the dataset. Passing a location_id reads that location’s stored row and takes precedence over lat/lon.

How location and region are resolved

Every endpoint answers two separate questions the same way.

Where — whose sunrise, tithi and timings are computed: location_id, else lat+lon, else the canonical location of region, else the endpoint’s default.

Which tradition — which regional festival rules apply: an explicit region, else the location_id’s region and state, else New Delhi’s. Coordinates choose where, never the tradition. Tradition is independent of place, so region=IN-MH&location_id=1 means “Maharashtrian festivals, observed in Delhi”, and region=IN-MH with coordinates means “Maharashtrian festivals, observed there”.

region accepts a canonical region (NORTH_INDIA, SOUTH_INDIA, EAST_INDIA, WEST_INDIA, NEPAL, KASHMIR, SRI_LANKA) or the ISO 3166-2 code of a state recorded on a supported location (e.g. IN-MH Maharashtra, IN-GJ Gujarat), case-insensitive. On /v1/panchang, /v1/day-context and the timing endpoints anything else returns 422 with the supported list. The festival endpoints historically ignored region, so there an unsupported value is still ignored and is named in region_resolution.ignored_region. A state code applies its region’s rules and the state’s own: Gudi Padwa is a Maharashtra rule, so it appears for location_id=8 (Mumbai) or region=IN-MH, but not for region=WEST_INDIA or Ahmedabad. Festival responses report what was used in _engine.region_resolution and _engine.rule_pack_chain; Panchang responses report the served location’s location.region and location.subdivision.

/v1/locations/search takes a name and returns the places that match, each with its exact coordinates, its IANA timezone and its administrative hierarchy. Those coordinates are what you pass to /v1/panchang, /v1/kundli and the rest; they are used as given and are never rounded or moved.

A name is not an answer. India has hundreds of places called Rampur and three called Somnath, only one of which is the temple. When the context you supply does not narrow the field the response sets ambiguous: true and returns the candidates; it does not choose one and present it as the answer. Narrow with state, district or subdistrict: ?q=Somnath returns three, ?q=Somnath&district=Gir Somnath returns one.

Nothing is substituted. A place we do not hold returns an empty result, never the nearest city. An empty search box is recoverable; a Panchang silently computed for somewhere else is not.

Alternate names are searched too. ?q=Cochin finds Kochi and ?q=Khatushyamji finds Khatu in Sikar. The result reports which name matched in matched_on.

Two fields describe how far to trust a result. confidence is about the coordinate: CURATED for a coordinate TathaAstu has verified, HIGH for an ordinary GeoNames position, LOW where its precision is poor or its stored timezone disagrees with the polygon for its own coordinate. selection_risk is about the choice: it is HIGH when several places share the name in the same state and none carries a population, so any automatic pick would be a guess. Treat a risky result as a prompt to ask the user which one they meant.

Where the place data comes from

Place names, coordinates, administrative hierarchy and timezones served by the location endpoints are derived from GeoNames, used under the Creative Commons Attribution 4.0 International licence (CC BY 4.0). GeoNames does not endorse TathaAstu API. Every location response repeats this credit in its attribution field, so an application that surfaces our data can pass the credit on.

Coordinates for a small set of curated locations are TathaAstu’s own and take precedence over the GeoNames value; those rows report confidence: CURATED, and every response names the source it used. Timezone polygons are derived from timezone-boundary-builder, used under the ODbL.

Coverage: India, Nepal and Sri Lanka to village level; every other country to city level

India, Nepal and Sri Lanka are held down to villages and localities (about 664,000 places). Every other country — 243 of them, 163,531 places — is held at city level: every populated place of 1,000 people or more, from GeoNames cities1000. Both come from GeoNames under CC BY 4.0; show the attribution returned with the data.

Search scope. /v1/locations/search without country searches India, Nepal and Sri Lanka, exactly as it always has. Pass country=GB (any ISO 3166-1 alpha-2 code) to search one country, or scope=world to search them all: ?q=Toronto&scope=world, ?q=Edison&country=US&state=US-NJ.

State codes. Outside India, state.code is an ISO 3166-2 code (US-NJ, GB-ENG, CA-ON, DE-BY) only where the GeoNames state matches exactly one ISO subdivision; otherwise it is null and state.name still names it. A code we cannot vouch for is not served.

Calculations. Every place carries latitude, longitude and an IANA timezone; pass them as lat, lon and tz to any Panchang, Kundli or Muhurat endpoint. Festival traditions (region) are defined for India, Nepal and Sri Lanka, so for other countries region is null; pass region explicitly to apply a tradition. A place whose stored timezone disagreed with the timezone map on its UTC offset is held back rather than served with a doubtful zone (354 such places, mostly in Xinjiang, where legal time is Beijing time).

Place names are given in their English/romanised form (name, name_en); name_native is null. lang localizes the surrounding fields, not the place name.

GET/v1/locationsFreeGet predefined locations▶

Get list of predefined locations with coordinates.

ParameterTypeRequiredDescription
langstringOptionalResponse language: one of the codes below (GET /v1/i18n/languages lists them with their names and coverage; hi-IN is accepted as hi, en-IN/en-GB/en-US as en). Canonical fields never change with the language; localized values are ADDED as <field>_local. Accepted does not mean fully translated: a value with no verified translation in that language has no _local field (never an English stand-in), and the response header X-Localization-Missing counts them. An unknown code is 400 unsupported_language.
GET/v1/locations/detail/{location_id}ProOne place by its location id▶

gn:<geonames id>, or a bare numeric id.

Deliberately not /v1/locations/{id}: that path already belongs to the 27 predefined locations and customers hold those ids, so taking it over would change what an existing call returns.

ParameterTypeRequiredDescription
location_idstringRequiredSupported location id. Takes precedence over lat/lon. (path)
langstringOptionalResponse language: one of the codes below (GET /v1/i18n/languages lists them with their names and coverage; hi-IN is accepted as hi, en-IN/en-GB/en-US as en). Canonical fields never change with the language; localized values are ADDED as <field>_local. Accepted does not mean fully translated: a value with no verified translation in that language has no _local field (never an English stand-in), and the response header X-Localization-Missing counts them. An unknown code is 400 unsupported_language.
GET/v1/locations/{location_id}FreeGet location details▶

Get details for a specific location.

ParameterTypeRequiredDescription
location_idintegerRequiredSupported location id. Takes precedence over lat/lon. (path)
langstringOptionalResponse language: one of the codes below (GET /v1/i18n/languages lists them with their names and coverage; hi-IN is accepted as hi, en-IN/en-GB/en-US as en). Canonical fields never change with the language; localized values are ADDED as <field>_local. Accepted does not mean fully translated: a value with no verified translation in that language has no _local field (never an English stand-in), and the response header X-Localization-Missing counts them. An unknown code is 400 unsupported_language.
Reference Data

Government Holidays

Civil government holiday calendars for the Indian states, union territories and the Central Government, each date carried with the notification it comes from. This is civil data: it never decides or adjusts a religious festival date, and the Festival Engine does not read it.

Coverage is part of the answer

A year is authoritative only as far as its official notifications have been obtained. Every response carries coverage.status: COMPLETE when the base notification was read on a government host and nothing is open against it, PARTIAL when the list rests on a copy or an item is still open, and NOT_OBTAINED when no notification has been obtained. A short list is never padded from news reports or another state’s calendar, and a year we do not hold answers NOT_OBTAINED rather than an empty success.

Rows whose notification was read from a copy that is not on a government host are provisional. They are left out by default and returned, flagged, with include=provisional.

Every date names its notification

Each holiday carries a source: the issuing authority, the notification number and date, the gazette reference where there is one, the URL it was read at, and evidence_grade — OFFICIAL for the government’s own publication, GOVT_BODY_COPY or THIRD_PARTY_COPY for a copy held elsewhere. /v1/government-holidays/sources lists every document a region’s year rests on.

Amendments, and reading the calendar as it stood

Governments move dates during the year. Odisha declared Id-ul-Zuha on 27 May 2026 in notification 42428, then moved it to 28 May in notification 21787 of 25 May 2026. The original row is kept and marked superseded rather than overwritten, and as_of reconstructs what the calendar said on any given day: as_of=2026-04-01 returns 27 May, as_of=2026-07-01 returns 28 May. Both answers are reproducible, which is what makes the change auditable. Add include=amendments to see what a row replaced.

Three fields, because the states do not agree

The documents use their own words: Arunachal says “Gazetted Holidays”, Karnataka and Telangana say “General Holidays”, Kerala and Tamil Nadu say “Public Holidays”, Lakshadweep says “closed holidays”, and Odisha’s main annexure states no class at all. So each row carries category (the class as the document sets it out), category_as_written (its exact wording, including the original script) and canonical_class (the normalised class you can filter on across states: PUBLIC, RESTRICTED, OPTIONAL, LOCAL, BANK, COURT, SPECIAL, OTHER). The canonical class is ours; the other two are the government’s and are never rewritten. Where the evidence does not settle a class, canonical_class is null rather than a guess.

A list is not classified from the law it was issued under. West Bengal, Jharkhand and Andaman & Nicobar publish their main closure list under the Negotiable Instruments Act; because those notifications also close government offices, they are PUBLIC, while a list that binds only banks is BANK.

Who actually closes

Office and bank calendars differ in at least twelve subjects, so applicability is data, not a flag. Each row lists its audiences (STATE_GOVERNMENT_OFFICES, BANKS, COURTS, EDUCATIONAL_INSTITUTIONS, and others), the scope where it applies — whole region, a district such as Kodagu, or a sub-region such as Mahe — any per-employee limit a restricted or optional list sets, and the document’s own wording. Filter with applies_to=BANKS or scope=Kodagu.

Some rows have no date: Arunachal’s local festivals are fixed later by each Deputy Commissioner, and twelve Central holidays are chosen by State Coordination Committees. They are evidence of an entitlement rather than of a day, so they are left out unless you ask for include=undated.

Region codes

ISO 3166-2 is the identity: IN-MH, IN-TS, IN-OD, and IN-CENTRAL for the Central Government list. Short codes (MH) and codes a subject used to carry (IN-OR, IN-TG) resolve to it, and the response says which alias was used. /v1/government-holidays/regions lists them all with their coverage.

GET/v1/government-holidaysProGet Government Holidays▶

Government holidays for one region and year, with their sources.

Returns only what a government notification attests. Where a notification has not been obtained, coverage.status says PARTIAL or NOT_OBTAINED and the list is short on purpose — it is never padded from news reports or another state's calendar.

Rows that rest on a copy of a notification that was not read on a government host are provisional. They are left out unless you ask for them with include=provisional, and they are flagged when returned.

ParameterTypeRequiredDescription
regionstringRequiredISO 3166-2 code, e.g. IN-MH, IN-TS, or IN-CENTRAL for the Central Government list. Short and former codes resolve to it.
yearintegerRequiredCalendar year
categorystringOptionalComma-separated. Canonical classes (PUBLIC, RESTRICTED, OPTIONAL, LOCAL, BANK, COURT, SPECIAL, OTHER) or the source category (GAZETTED, GENERAL, UNCLASSIFIED, INDUSTRIAL).
applies_tostringOptionalAudience filter, e.g. BANKS, STATE_GOVERNMENT_OFFICES, COURTS
scopestringOptionalDistrict or sub-region name, e.g. Kodagu, Mahe
datestringOptionalA single day, YYYY-MM-DD
as_ofstringOptionalReconstruct the calendar as it stood on this date, before later amendments
includestringOptionalComma-separated extras: amendments, provisional, undated
langstringOptionalResponse language: one of the codes below (GET /v1/i18n/languages lists them with their names and coverage; hi-IN is accepted as hi, en-IN/en-GB/en-US as en). Canonical fields never change with the language; localized values are ADDED as <field>_local. Accepted does not mean fully translated: a value with no verified translation in that language has no _local field (never an English stand-in), and the response header X-Localization-Missing counts them. An unknown code is 400 unsupported_language.
GET/v1/government-holidays/coverageProGet Government Holiday Coverage▶

How far this year's data is attested, subject by subject.

A subject is COMPLETE only when its base notification was read on a government host and no verification item is open against it.

ParameterTypeRequiredDescription
yearintegerRequiredFour-digit year.
statusstringOptionalCOMPLETE, PARTIAL or NOT_OBTAINED
langstringOptionalResponse language: one of the codes below (GET /v1/i18n/languages lists them with their names and coverage; hi-IN is accepted as hi, en-IN/en-GB/en-US as en). Canonical fields never change with the language; localized values are ADDED as <field>_local. Accepted does not mean fully translated: a value with no verified translation in that language has no _local field (never an English stand-in), and the response header X-Localization-Missing counts them. An unknown code is 400 unsupported_language.
GET/v1/government-holidays/regionsProGet Government Holiday Regions▶

Every region this dataset covers, with its aliases.

The ISO 3166-2 code is the identity. Short codes ('MH') and codes a region used to carry ('IN-OR' for Odisha, 'IN-TG' for Telangana) are aliases that resolve to it, and never the other way round.

ParameterTypeRequiredDescription
yearintegerOptionalInclude each region's coverage for this year
langstringOptionalResponse language: one of the codes below (GET /v1/i18n/languages lists them with their names and coverage; hi-IN is accepted as hi, en-IN/en-GB/en-US as en). Canonical fields never change with the language; localized values are ADDED as <field>_local. Accepted does not mean fully translated: a value with no verified translation in that language has no _local field (never an English stand-in), and the response header X-Localization-Missing counts them. An unknown code is 400 unsupported_language.
GET/v1/government-holidays/sourcesProGet Government Holiday Sources▶

The notifications a region's year rests on, in the order they were issued.

ParameterTypeRequiredDescription
regionstringRequiredISO 3166-2 code
yearintegerRequiredFour-digit year.
langstringOptionalResponse language: one of the codes below (GET /v1/i18n/languages lists them with their names and coverage; hi-IN is accepted as hi, en-IN/en-GB/en-US as en). Canonical fields never change with the language; localized values are ADDED as <field>_local. Accepted does not mean fully translated: a value with no verified translation in that language has no _local field (never an English stand-in), and the response header X-Localization-Missing counts them. An unknown code is 400 unsupported_language.
Reference Data

Numerology & Gemstones

Lucky number, lucky colour and gemstone reference from the date of birth, in one call. Labelled for what it is: the numbers are modern numerology, not Jyotish; colours and gems are classical reference data, never a prescription.

What one call returns

From date_of_birth alone: birth_number (Mulank, the day of the month reduced to one digit), destiny_number (Bhagyank, every digit of the date reduced to one digit) and lucky_number (the birth number), each with its working, its planet, and that planet’s classical colour and gem; plus lucky_colour. Add time_of_birth, latitude and longitude and the same call adds chart_gem_reference: the rulers of the lagna and Moon sign of the canonical Vedic chart, with their gems and colours.

What is classical and what is not

Numbers: MODERN_NUMEROLOGY, not Jyotish. No classical Jyotish work assigns lucky numbers. The planet for each number follows Cheiro’s table (Cheiro’s Book of Numbers, c. 1926, pp. 33–34) with Rahu and Ketu in place of Uranus and Neptune, as Indian practice does. The response says so in classification, is_classical_jyotish: false and note.

Colours and gems: REFERENCE_ONLY. The planet–gem association is Phaladeepika II.29 (confirmed by Jataka Parijata II.21); the colours are Phaladeepika II.8–14 and II.33–34. lucky_colour joins the numerology step to the classical colour and is labelled PRODUCT_CONVENTION. Choosing a stone by the lagna or Moon-sign ruler is modern practice and is labelled MODERN_PRACTICE; the classical texts that use gems in remedies give them away in donation (Jatakabharanam ch. 34, BPHS ch. 84) rather than wear them. Nothing in the response recommends wearing or buying a gemstone, claims any benefit, or is intended for gambling, lotteries or betting. Every response lists its sources.

Languages

lang follows the platform contract: the English document is always returned and the requested language is added as <field>_local. Prose, gem and colour names are rendered in en, hi, mr, gu, bn, ta, te, kn, ml, pa, de, es and fr; graha and sign names localize in every language the vocabulary has. localization.content_provenance states whether the prose is authored (en, hi) or a machine translation (the other eleven). Any other supported language returns English with status: NOT_AVAILABLE_ENGLISH_RETURNED.

GET/v1/numerology/birth-profileProLucky number, lucky colour, birth and destiny numbers, with gemstone reference, from the date of birth (PRO)▶

PRO. One call, from the date of birth.

Numbers (MODERN_NUMEROLOGY, not classical Jyotish). birth_number (Mulank) is the day of the month reduced to one digit; destiny_number (Bhagyank) is every digit of the date reduced to one digit; lucky_number is the birth number. Each number's planet comes from Cheiro's table (*Book of Numbers*, pp. 33-34) with Rahu and Ketu in place of Uranus and Neptune. No classical Jyotish work assigns lucky numbers, and the response says so.

Colours and gems. Each number carries its planet's classical colour (Phaladeepika II.8-14, II.33-34) and gem (Phaladeepika II.29), as REFERENCE_ONLY. lucky_colour is the colour of the lucky number's planet, a labelled PRODUCT_CONVENTION. Given time_of_birth, latitude and longitude, chart_gem_reference adds the rulers of the lagna and Moon sign of the canonical Vedic chart and their gems; choosing a stone that way is modern practice and is labelled so. The classical texts that use gems in remedies give them away in donation, not wear them. Nothing here recommends wearing or buying a gemstone, and no benefit is claimed. Never intended for gambling, lotteries or betting.

ParameterTypeRequiredDescription
date_of_birthstringRequiredYYYY-MM-DD
time_of_birthstringOptionalHH:MM or HH:MM:SS, local. With latitude and longitude, adds the chart-based gemstone reference.
latitudefloatOptionallatitude parameter.
longitudefloatOptionallongitude parameter.
timezonestringOptionalIANA timezone of the birth place
langstringOptionalResponse language: one of the codes below (GET /v1/i18n/languages lists them with their names and coverage; hi-IN is accepted as hi, en-IN/en-GB/en-US as en). Canonical fields never change with the language; localized values are ADDED as <field>_local. Accepted does not mean fully translated: a value with no verified translation in that language has no _local field (never an English stand-in), and the response header X-Localization-Missing counts them. An unknown code is 400 unsupported_language.
Vedic Astrology

Classical Readings

What the classical texts teach about a birth chart, with book, chapter and verse for every statement. Readings, not predictions: where a text leaves a point undefined or two texts disagree, the response says so instead of choosing.

Appearance

Form. Bṛhat Jātaka 5.23, repeated by Phaladīpikā XVI.1 and Jātaka Pārijāta III.76, teaches that the body resembles the lord of the navāṁśa rising at birth; the response names that planet and gives its described form (Bṛhat Jātaka 2.8-2.11). Signs. The features the texts give for the lagna sign (Phaladīpikā IX) and for the Moon’s sign (Bṛhat Jātaka 17) are returned side by side, with the signs where the two lists disagree. 1st house. Planets in the lagna add the texts’ bodily clauses (only neutral or favourable ones are served). Not computed: the verse’s alternative “or the strongest planet” (no text defines strength), complexion (the texts disagree on colours), height, weight and limb proportions.

Soul origin

Bṛhat Jātaka 25.14 (Jātaka Pārijāta V-A.14 has the same verse) associates the lord of the drekkāṇa held by the stronger of the Sun and Moon with the world a soul is said to come from: Jupiter, the gods; Moon or Venus, the ancestors; Sun or Mars, tiraśca (tiryak); Saturn or Mercury, the infernal world. The rank is high, middling or low as that lord is exalted, elsewhere or debilitated. Verse 25.15 gives the world a soul is said to go to (a planet in the 7th, with the commentator Bhaṭṭotpala adding the 6th and 8th, else the 6th- and 8th-house drekkāṇa lords) and one mokṣa yoga. The text does not define the stronger luminary, so both the Sun-based and Moon-based results are returned and selected is set only when they agree.

Nature

The disposition Bṛhat Jātaka 16 gives for the Moon’s nakshatra (Jātaka Pārijāta IX as a second witness) and Bṛhat Jātaka 17 for the Moon’s sign, with Sārāvalī 23 as a second witness (no published translation of that chapter was available, so its English is TathaAstu’s rendering of the Sanskrit), and Phaladīpikā IX for the lagna. Only temperament traits are served, each with its Sanskrit and verse. Clauses about wealth, family, health or events are predictions and abusive wording is withheld; both are counted in withheld, never printed. A trait that is not flattering is served as the text gives it, with tone: unfavourable. Bṛhat Jātaka 17.13 makes the full results depend on the strength of the sign, its lord and the Moon; the text gives no measure, so this is stated, not evaluated.

Reading and interpretation. Every Classical Readings response for nature and spouse opens with reading (plain sentences, each with its verse) and interpretation: a readable paragraph with strengths, challenges, relationships and work, written by TathaAstu from the verses, the planets’ classical nature and common tradition, and labelled as such in interpretation.authorship. The spouse reading also gives partner_any_chart from the 7th lord, labelled a modern convention.

Spouse

The texts are one-way, and the response keeps their frame. The husband, from a woman’s chart: Bṛhat Jātaka 24.11-12 (Sārāvalī 45.21-24) describes him by the lord of the 7th sign or of the 7th sign in the navāṁśa; both are returned and selected is set only when they agree. Jātaka Pārijāta XVI.49 and XVI.53 add planets in the 7th. The wife, from a man’s chart: the texts give no general rule, only single conditions (Sārāvalī 30.68, Phaladīpikā VIII.12, BPHS Pathak 13.56), returned when the chart meets them. TathaAstu never infers the person’s gender; frame filters the two cases (default both). Derogatory, caste and chastity verdicts, and the timing, number or loss of marriages, are not served.

Every response carries notice, sources per item and texts_differ. The wording is always “the text teaches”, never a statement about the person. BPHS is not cited for appearance or soul origin: the Pathak edition has no such verses.

POST/v1/readings/appearanceProAppearance: the form and features the classical texts associate with a chart▶

A classical reading, not a prediction. Form: Bṛhat Jātaka 5.23 (repeated by Phaladīpikā XVI.1 and Jātaka Pārijāta III.76) teaches that the body resembles the lord of the navāṁśa rising at birth; that planet's described form is returned (BJ 2.8-2.11). Lagna sign features (Phaladīpikā IX) and Moon sign features (Bṛhat Jātaka 17) are returned side by side, and planets in the 1st house add the texts' bodily clauses. Every item cites book and verse; points where the texts disagree are listed under texts_differ, and what the texts leave undefined (the strongest planet, complexion, height) is not computed.

ParameterTypeRequiredDescription
langstringOptionalResponse language: one of the codes below (GET /v1/i18n/languages lists them with their names and coverage; hi-IN is accepted as hi, en-IN/en-GB/en-US as en). Canonical fields never change with the language; localized values are ADDED as <field>_local. Accepted does not mean fully translated: a value with no verified translation in that language has no _local field (never an English stand-in), and the response header X-Localization-Missing counts them. An unknown code is 400 unsupported_language.
date_of_birthstringRequiredYYYY-MM-DD (body)
time_of_birthstringRequiredHH:MM or HH:MM:SS, local time (body)
latitudefloatRequired— (body)
longitudefloatRequired— (body)
timezonestringOptionalIANA timezone of the birth place (body)
POST/v1/readings/natureProNature: the disposition the classical texts associate with the Moon sign and the lagna▶

A classical reading, not a prediction. Moon sign: Bṛhat Jātaka 17 (with Sārāvalī 23 as a second witness); lagna: Phaladīpikā IX. Only temperament traits are served, each with its verse; clauses about wealth, family, health or events (predictions) and abusive wording are withheld and only counted. Unflattering classical traits are served with tone: unfavourable. Where the texts or translators disagree it is listed under texts_differ.

ParameterTypeRequiredDescription
langstringOptionalResponse language: one of the codes below (GET /v1/i18n/languages lists them with their names and coverage; hi-IN is accepted as hi, en-IN/en-GB/en-US as en). Canonical fields never change with the language; localized values are ADDED as <field>_local. Accepted does not mean fully translated: a value with no verified translation in that language has no _local field (never an English stand-in), and the response header X-Localization-Missing counts them. An unknown code is 400 unsupported_language.
date_of_birthstringRequiredYYYY-MM-DD (body)
time_of_birthstringRequiredHH:MM or HH:MM:SS, local time (body)
latitudefloatRequired— (body)
longitudefloatRequired— (body)
timezonestringOptionalIANA timezone of the birth place (body)
POST/v1/readings/soul-originProSoul origin: the worlds Bṛhat Jātaka 25.14-15 associates with a chart▶

A classical reading, not a prediction. Bṛhat Jātaka 25.14 associates the lord of the drekkāṇa held by the stronger luminary with the world a soul is said to come from (Jupiter: gods; Moon/Venus: ancestors; Sun/Mars: tiryak; Saturn/Mercury: infernal), and 25.15 gives the world it is said to go to and the mokṣa yoga. The text does not define the stronger luminary, so the Sun- and Moon-based results are both returned and selected is set only when they agree. Every item cites book and verse.

ParameterTypeRequiredDescription
langstringOptionalResponse language: one of the codes below (GET /v1/i18n/languages lists them with their names and coverage; hi-IN is accepted as hi, en-IN/en-GB/en-US as en). Canonical fields never change with the language; localized values are ADDED as <field>_local. Accepted does not mean fully translated: a value with no verified translation in that language has no _local field (never an English stand-in), and the response header X-Localization-Missing counts them. An unknown code is 400 unsupported_language.
date_of_birthstringRequiredYYYY-MM-DD (body)
time_of_birthstringRequiredHH:MM or HH:MM:SS, local time (body)
latitudefloatRequired— (body)
longitudefloatRequired— (body)
timezonestringOptionalIANA timezone of the birth place (body)
POST/v1/readings/spouseProSpouse: the husband or wife as the classical texts describe them from a chart▶

A classical reading, not a prediction. The texts are one-way: Bṛhat Jātaka 24.11-12 (with Sārāvalī 45.21-24) describes the husband, from a woman's chart, by the lord of the 7th sign or of the 7th navāṁśa sign; single conditions in Sārāvalī, Phaladīpikā and BPHS describe the wife, from a man's chart. Every statement keeps that frame; gender is never inferred (use frame to filter). Derogatory verdicts, timing and loss of marriage are not served; where the two lords differ both are returned and none is selected.

ParameterTypeRequiredDescription
langstringOptionalResponse language: one of the codes below (GET /v1/i18n/languages lists them with their names and coverage; hi-IN is accepted as hi, en-IN/en-GB/en-US as en). Canonical fields never change with the language; localized values are ADDED as <field>_local. Accepted does not mean fully translated: a value with no verified translation in that language has no _local field (never an English stand-in), and the response header X-Localization-Missing counts them. An unknown code is 400 unsupported_language.
date_of_birthstringRequiredYYYY-MM-DD (body)
time_of_birthstringRequiredHH:MM or HH:MM:SS, local time (body)
latitudefloatRequired— (body)
longitudefloatRequired— (body)
timezonestringOptionalIANA timezone of the birth place (body)
framestringOptionalboth | husband_in_womans_chart | wife_in_mans_chart. The texts frame every rule one way; this only filters, it never infers gender. (body)
Enterprise

Enterprise Data Delivery (bulk datasets)

Complete, versioned datasets for local storage: an Annual Calendar for a location and year, Life-Area Rashifal for a month or year, and the Location Catalogue for a country or state. Requested asynchronously and delivered as a signed, compressed download. Enterprise plan required (no separate grant).

Who can use these endpoints

Enterprise Data Delivery is included in the Enterprise plan (and in Enterprise Evaluation keys). There is no separate per-account grant: every Enterprise account may request any year the API serves, every language and calculation-ready location, and the Location Catalogue for every country, state and place type. Other plans answer 402 plan_upgrade_required. GET …/datasets/coverage shows what your account may request and what it has used.

Monthly dataset allowance

Each Enterprise account may generate up to 30 new datasets per month for each dataset family (Annual Calendar, Life-Area Rashifal, Location Catalogue). Downloading a dataset again, and a re-issue that TathaAstu causes by updating the data, never count. When the month’s allowance is used up the answer is 429 dataset_quota_exhausted; previously issued datasets stay downloadable. Paging the catalogue (/v1/locations/catalogue/pages) is an ordinary API request and does not use this allowance. A year outside the range the API serves answers 422 year_out_of_range.

How a dataset is delivered

POST the request (send an Idempotency-Key to make retries safe). The answer is 202 while the dataset builds and 200 once it is ready; poll the links.self URL. A ready dataset carries a self-describing manifest (versions, filter, row counts, SHA-256) and a signed download.url under /v1/files/…, valid for two hours, for your account only, needing no API key. Datasets are immutable and content-addressed: asking again for the same data returns the same dataset and is not charged again. Each dataset first issued to your account counts as one dataset unit; these requests do not use your monthly request quota.

What is in each dataset

Annual Calendar: every date of the year for one calculation-ready location (/v1/locations 1–27) and language — Panchang limbs, sunrise/sunset/moonrise/moonset, Hindu calendar, festivals and Ekadashi/Purnima/Amavasya by observance, Hora, Choghadiya, Muhurat including durmuhurta, varjyam and amrit kaal, conditions and eclipses — exactly as /v1/calendar/day and /v1/day-context return them. Life-Area Rashifal: every day of a month or year, all twelve rashis, exactly as /v1/rashifal/vedic/life-areas/daily/all; no monthly or yearly synthesis. Location Catalogue: the gazetteer behind /v1/locations/search for a country, state and place type, with GeoNames attribution (CC BY 4.0); only places linked to a curated /v1/locations id are calculation_ready.

POST/v1/calendar/datasetsEntRequest an Annual Calendar Dataset (asynchronous)▶

Creates or reuses an immutable, compressed annual calendar for one calculation-ready location, one year and one language: every date with Panchang, sunrise/sunset, moonrise/moonset, festivals, observances, Hora, Choghadiya, Muhurat (incl. durmuhurta, varjyam, amrit kaal), Hindu calendar, conditions and eclipse. 202 while it builds, 200 when ready; poll the returned link or subscribe to the calendar.dataset.ready webhook. Enterprise plan.

ParameterTypeRequiredDescription
langstringOptionalResponse language: one of the codes below (GET /v1/i18n/languages lists them with their names and coverage; hi-IN is accepted as hi, en-IN/en-GB/en-US as en). Canonical fields never change with the language; localized values are ADDED as <field>_local. Accepted does not mean fully translated: a value with no verified translation in that language has no _local field (never an English stand-in), and the response header X-Localization-Missing counts them. An unknown code is 400 unsupported_language.
location_idintegerRequiredA calculation-ready curated location (1-27), see /v1/locations. (body)
yearintegerRequiredCalendar year inside the available window (see /coverage). (body)
langstringOptionalResponse language: one of the codes below (GET /v1/i18n/languages lists them with their names and coverage; hi-IN is accepted as hi, en-IN/en-GB/en-US as en). Canonical fields never change with the language; localized values are ADDED as <field>_local. Accepted does not mean fully translated: a value with no verified translation in that language has no _local field (never an English stand-in), and the response header X-Localization-Missing counts them. An unknown code is 400 unsupported_language. (body)
formatstringOptionaljson.gz (one document) or ndjson.gz (manifest line, 12 month summaries, then one line per day). (body)
GET/v1/calendar/datasetsEntList this account's Annual Calendar Dataset requests▶

List this account's Annual Calendar Dataset requests

ParameterTypeRequiredDescription
beforeintegerOptionalCursor: next of the previous page
langstringOptionalResponse language: one of the codes below (GET /v1/i18n/languages lists them with their names and coverage; hi-IN is accepted as hi, en-IN/en-GB/en-US as en). Canonical fields never change with the language; localized values are ADDED as <field>_local. Accepted does not mean fully translated: a value with no verified translation in that language has no _local field (never an English stand-in), and the response header X-Localization-Missing counts them. An unknown code is 400 unsupported_language.
GET/v1/calendar/datasets/coverageEntAnnual Calendar Dataset: what this account may request▶

Annual Calendar Dataset: what this account may request

ParameterTypeRequiredDescription
langstringOptionalResponse language: one of the codes below (GET /v1/i18n/languages lists them with their names and coverage; hi-IN is accepted as hi, en-IN/en-GB/en-US as en). Canonical fields never change with the language; localized values are ADDED as <field>_local. Accepted does not mean fully translated: a value with no verified translation in that language has no _local field (never an English stand-in), and the response header X-Localization-Missing counts them. An unknown code is 400 unsupported_language.
GET/v1/calendar/datasets/{request_id}EntAnnual Calendar Dataset status and download▶

Annual Calendar Dataset status and download

ParameterTypeRequiredDescription
request_idstringRequiredrequest_id parameter. (path)
langstringOptionalResponse language: one of the codes below (GET /v1/i18n/languages lists them with their names and coverage; hi-IN is accepted as hi, en-IN/en-GB/en-US as en). Canonical fields never change with the language; localized values are ADDED as <field>_local. Accepted does not mean fully translated: a value with no verified translation in that language has no _local field (never an English stand-in), and the response header X-Localization-Missing counts them. An unknown code is 400 unsupported_language.
POST/v1/calendar/datasets/{request_id}/cancelEntCancel a queued Annual Calendar Dataset request▶

Cancel a queued Annual Calendar Dataset request

ParameterTypeRequiredDescription
request_idstringRequiredrequest_id parameter. (path)
langstringOptionalResponse language: one of the codes below (GET /v1/i18n/languages lists them with their names and coverage; hi-IN is accepted as hi, en-IN/en-GB/en-US as en). Canonical fields never change with the language; localized values are ADDED as <field>_local. Accepted does not mean fully translated: a value with no verified translation in that language has no _local field (never an English stand-in), and the response header X-Localization-Missing counts them. An unknown code is 400 unsupported_language.
GET/v1/files/calendar/{dataset_id}FreeDownload a Annual Calendar Dataset (signed link)▶

The file a READY dataset's download.url points to. No API key: the link itself is the credential, valid for 2 hours and only for the account and request it was issued for.

ParameterTypeRequiredDescription
dataset_idstringRequireddataset_id parameter. (path)
uintegerRequiredAccount the link was issued to
rstringRequiredRequest id
expintegerRequiredExpiry (Unix seconds)
sigstringRequiredHMAC signature
langstringOptionalResponse language: one of the codes below (GET /v1/i18n/languages lists them with their names and coverage; hi-IN is accepted as hi, en-IN/en-GB/en-US as en). Canonical fields never change with the language; localized values are ADDED as <field>_local. Accepted does not mean fully translated: a value with no verified translation in that language has no _local field (never an English stand-in), and the response header X-Localization-Missing counts them. An unknown code is 400 unsupported_language.
GET/v1/files/locations/{dataset_id}FreeDownload a Location Catalogue (signed link)▶

The file a READY dataset's download.url points to. No API key: the link itself is the credential, valid for 2 hours and only for the account and request it was issued for.

ParameterTypeRequiredDescription
dataset_idstringRequireddataset_id parameter. (path)
uintegerRequiredAccount the link was issued to
rstringRequiredRequest id
expintegerRequiredExpiry (Unix seconds)
sigstringRequiredHMAC signature
langstringOptionalResponse language: one of the codes below (GET /v1/i18n/languages lists them with their names and coverage; hi-IN is accepted as hi, en-IN/en-GB/en-US as en). Canonical fields never change with the language; localized values are ADDED as <field>_local. Accepted does not mean fully translated: a value with no verified translation in that language has no _local field (never an English stand-in), and the response header X-Localization-Missing counts them. An unknown code is 400 unsupported_language.
GET/v1/files/rashifal-life-areas/{dataset_id}FreeDownload a Life-Area Rashifal Dataset (signed link)▶

The file a READY dataset's download.url points to. No API key: the link itself is the credential, valid for 2 hours and only for the account and request it was issued for.

ParameterTypeRequiredDescription
dataset_idstringRequireddataset_id parameter. (path)
uintegerRequiredAccount the link was issued to
rstringRequiredRequest id
expintegerRequiredExpiry (Unix seconds)
sigstringRequiredHMAC signature
langstringOptionalResponse language: one of the codes below (GET /v1/i18n/languages lists them with their names and coverage; hi-IN is accepted as hi, en-IN/en-GB/en-US as en). Canonical fields never change with the language; localized values are ADDED as <field>_local. Accepted does not mean fully translated: a value with no verified translation in that language has no _local field (never an English stand-in), and the response header X-Localization-Missing counts them. An unknown code is 400 unsupported_language.
POST/v1/locations/catalogue/datasetsEntRequest a Location Catalogue dataset (asynchronous)▶

A versioned, signed-download copy of the gazetteer behind /v1/locations/search for one country, optionally one state and one place type: stable ids (gn:<geonames id>), names, administrative hierarchy, coordinates and their precision, IANA timezone, confidence and ambiguity, GeoNames attribution (CC BY 4.0). Only places linked to a curated /v1/locations id are calculation_ready. 202 while it builds, 200 when ready. Enterprise plan.

ParameterTypeRequiredDescription
langstringOptionalResponse language: one of the codes below (GET /v1/i18n/languages lists them with their names and coverage; hi-IN is accepted as hi, en-IN/en-GB/en-US as en). Canonical fields never change with the language; localized values are ADDED as <field>_local. Accepted does not mean fully translated: a value with no verified translation in that language has no _local field (never an English stand-in), and the response header X-Localization-Missing counts them. An unknown code is 400 unsupported_language.
countrystringRequiredISO 3166-1 alpha-2. IN, NP and LK to village level; any other country at city level. (body)
statestringOptionalISO 3166-2 state/province code (e.g. IN-MH); omitted = the whole country. (body)
typestringOptionalCITY, TOWN, VILLAGE, LOCALITY, SEAT or OTHER; omitted = every type. (body)
formatstringOptionalndjson.gz (lines tagged by record: one manifest, one per place, one end line with the row count and content hash) or json.gz. (body)
langstringOptionalResponse language: one of the codes below (GET /v1/i18n/languages lists them with their names and coverage; hi-IN is accepted as hi, en-IN/en-GB/en-US as en). Canonical fields never change with the language; localized values are ADDED as <field>_local. Accepted does not mean fully translated: a value with no verified translation in that language has no _local field (never an English stand-in), and the response header X-Localization-Missing counts them. An unknown code is 400 unsupported_language. (body)
GET/v1/locations/catalogue/datasetsEntList this account's Location Catalogue requests▶

List this account's Location Catalogue requests

ParameterTypeRequiredDescription
beforeintegerOptionalCursor: next of the previous page
langstringOptionalResponse language: one of the codes below (GET /v1/i18n/languages lists them with their names and coverage; hi-IN is accepted as hi, en-IN/en-GB/en-US as en). Canonical fields never change with the language; localized values are ADDED as <field>_local. Accepted does not mean fully translated: a value with no verified translation in that language has no _local field (never an English stand-in), and the response header X-Localization-Missing counts them. An unknown code is 400 unsupported_language.
GET/v1/locations/catalogue/datasets/coverageEntLocation Catalogue: what this account may request▶

Location Catalogue: what this account may request

ParameterTypeRequiredDescription
langstringOptionalResponse language: one of the codes below (GET /v1/i18n/languages lists them with their names and coverage; hi-IN is accepted as hi, en-IN/en-GB/en-US as en). Canonical fields never change with the language; localized values are ADDED as <field>_local. Accepted does not mean fully translated: a value with no verified translation in that language has no _local field (never an English stand-in), and the response header X-Localization-Missing counts them. An unknown code is 400 unsupported_language.
GET/v1/locations/catalogue/datasets/{request_id}EntLocation Catalogue status and download▶

Location Catalogue status and download

ParameterTypeRequiredDescription
request_idstringRequiredrequest_id parameter. (path)
langstringOptionalResponse language: one of the codes below (GET /v1/i18n/languages lists them with their names and coverage; hi-IN is accepted as hi, en-IN/en-GB/en-US as en). Canonical fields never change with the language; localized values are ADDED as <field>_local. Accepted does not mean fully translated: a value with no verified translation in that language has no _local field (never an English stand-in), and the response header X-Localization-Missing counts them. An unknown code is 400 unsupported_language.
POST/v1/locations/catalogue/datasets/{request_id}/cancelEntCancel a queued Location Catalogue request▶

Cancel a queued Location Catalogue request

ParameterTypeRequiredDescription
request_idstringRequiredrequest_id parameter. (path)
langstringOptionalResponse language: one of the codes below (GET /v1/i18n/languages lists them with their names and coverage; hi-IN is accepted as hi, en-IN/en-GB/en-US as en). Canonical fields never change with the language; localized values are ADDED as <field>_local. Accepted does not mean fully translated: a value with no verified translation in that language has no _local field (never an English stand-in), and the response header X-Localization-Missing counts them. An unknown code is 400 unsupported_language.
GET/v1/locations/catalogue/pagesEntPage through the Location Catalogue (offset/limit)▶

The Location Catalogue dataset, read through the API in pages: the same rows, fields and order as the dataset for the same country/state/type, with items, limit, offset, total and next_offset (null on the last page). Pass catalogue_version from the first page to every later page; if the catalogue is refreshed meanwhile the API answers 409 instead of mixing versions. Available on the Enterprise plan (and Enterprise Evaluation keys). Each page is one API request against your quota and rate limit. Place data (c) GeoNames contributors, CC BY 4.0 - attribution required.

representation=locations_v1 returns each item with the /v1/locations field names: id (the GeoNames id - not a /v1/locations id; the calculation endpoints' location_id accepts only curated ids, given here as curated_location_id), name_en (the romanised GeoNames name, not an English translation), latitude, longitude, timezone (source IANA zone), timezone_offset (hours, on the envelope's timezone_offset_as_of; set it with offset_date), country_code, region (the tradition the engine's coordinate resolver applies; region_confidence HIGH/MEDIUM/LOW, null when the point cannot be placed), subdivision_code, is_default (1 only for the curated default location) and name_native (null: no verified native-script name). The catalogue's identity, provenance and quality fields are kept, and review_flags lists source-data items under review (e.g. timezone_outside_country).

Calculating for a selected place: if curated_location_id is set, pass it as location_id; otherwise pass lat, lon and tz (the item's latitude, longitude, timezone). calculation_ready=false means the place is not a verified curated location - coordinate-based calculations are still available.

Types: CITY, TOWN, VILLAGE, LOCALITY, SEAT, OTHER (OTHER is mostly GeoNames PPLQ - abandoned places). To fetch settlements only, page each type separately.

ParameterTypeRequiredDescription
countrystringOptionalRequired. ISO 3166-1 alpha-2. IN, NP and LK to village level; any other country at city level (places of 1,000 people or more).
offsetintegerOptionalRows to skip. 0 for the first page; then next_offset.
limitintegerOptionalRows per page, 1-2000. Default 100.
statestringOptionalISO 3166-2 state code, e.g. IN-MH.
typestringOptionalCITY, TOWN, VILLAGE, LOCALITY, SEAT or OTHER.
catalogue_versionstringOptionalPass back the value from the first page; a refresh between pages then answers 409.
representationstringOptionalcatalogue (default: the original item shape) or locations_v1 (items with the /v1/locations field names plus catalogue identity and quality fields).
offset_datestringOptionallocations_v1 only. YYYY-MM-DD: the date timezone_offset is computed for. Default: today (UTC). Pass the same date on every page of one import.
langstringOptionalResponse language: one of the codes below (GET /v1/i18n/languages lists them with their names and coverage; hi-IN is accepted as hi, en-IN/en-GB/en-US as en). Canonical fields never change with the language; localized values are ADDED as <field>_local. Accepted does not mean fully translated: a value with no verified translation in that language has no _local field (never an English stand-in), and the response header X-Localization-Missing counts them. An unknown code is 400 unsupported_language.
POST/v1/rashifal/vedic/life-areas/datasetsEntRequest a Life-Area Rashifal Dataset for a month or a year (asynchronous)▶

Every day of the month or year for all twelve rashis, exactly as /v1/rashifal/vedic/life-areas/daily/all returns it: career, money, relationship, health & wellbeing, fortune and travel, with the same versions, levels, restrictions and disclaimers. A delivery format only: no monthly or yearly synthesis and no score. 202 while it builds, 200 when ready. Enterprise plan.

ParameterTypeRequiredDescription
langstringOptionalResponse language: one of the codes below (GET /v1/i18n/languages lists them with their names and coverage; hi-IN is accepted as hi, en-IN/en-GB/en-US as en). Canonical fields never change with the language; localized values are ADDED as <field>_local. Accepted does not mean fully translated: a value with no verified translation in that language has no _local field (never an English stand-in), and the response header X-Localization-Missing counts them. An unknown code is 400 unsupported_language.
periodstringOptionalmonth (one calendar month) or year (one calendar year). (body)
yearintegerRequiredYear inside the available window (see /coverage). (body)
monthintegerOptional1-12; required when period is month. (body)
langstringOptionalResponse language: one of the codes below (GET /v1/i18n/languages lists them with their names and coverage; hi-IN is accepted as hi, en-IN/en-GB/en-US as en). Canonical fields never change with the language; localized values are ADDED as <field>_local. Accepted does not mean fully translated: a value with no verified translation in that language has no _local field (never an English stand-in), and the response header X-Localization-Missing counts them. An unknown code is 400 unsupported_language. (body)
formatstringOptionaljson.gz or ndjson.gz (manifest line, then one line per day with the twelve readings). (body)
GET/v1/rashifal/vedic/life-areas/datasetsEntList this account's Life-Area Rashifal Dataset requests▶

List this account's Life-Area Rashifal Dataset requests

ParameterTypeRequiredDescription
beforeintegerOptionalCursor: next of the previous page
langstringOptionalResponse language: one of the codes below (GET /v1/i18n/languages lists them with their names and coverage; hi-IN is accepted as hi, en-IN/en-GB/en-US as en). Canonical fields never change with the language; localized values are ADDED as <field>_local. Accepted does not mean fully translated: a value with no verified translation in that language has no _local field (never an English stand-in), and the response header X-Localization-Missing counts them. An unknown code is 400 unsupported_language.
GET/v1/rashifal/vedic/life-areas/datasets/coverageEntLife-Area Rashifal Dataset: what this account may request▶

Life-Area Rashifal Dataset: what this account may request

ParameterTypeRequiredDescription
langstringOptionalResponse language: one of the codes below (GET /v1/i18n/languages lists them with their names and coverage; hi-IN is accepted as hi, en-IN/en-GB/en-US as en). Canonical fields never change with the language; localized values are ADDED as <field>_local. Accepted does not mean fully translated: a value with no verified translation in that language has no _local field (never an English stand-in), and the response header X-Localization-Missing counts them. An unknown code is 400 unsupported_language.
GET/v1/rashifal/vedic/life-areas/datasets/{request_id}EntLife-Area Rashifal Dataset status and download▶

Life-Area Rashifal Dataset status and download

ParameterTypeRequiredDescription
request_idstringRequiredrequest_id parameter. (path)
langstringOptionalResponse language: one of the codes below (GET /v1/i18n/languages lists them with their names and coverage; hi-IN is accepted as hi, en-IN/en-GB/en-US as en). Canonical fields never change with the language; localized values are ADDED as <field>_local. Accepted does not mean fully translated: a value with no verified translation in that language has no _local field (never an English stand-in), and the response header X-Localization-Missing counts them. An unknown code is 400 unsupported_language.
POST/v1/rashifal/vedic/life-areas/datasets/{request_id}/cancelEntCancel a queued Life-Area Rashifal Dataset request▶

Cancel a queued Life-Area Rashifal Dataset request

ParameterTypeRequiredDescription
request_idstringRequiredrequest_id parameter. (path)
langstringOptionalResponse language: one of the codes below (GET /v1/i18n/languages lists them with their names and coverage; hi-IN is accepted as hi, en-IN/en-GB/en-US as en). Canonical fields never change with the language; localized values are ADDED as <field>_local. Accepted does not mean fully translated: a value with no verified translation in that language has no _local field (never an English stand-in), and the response header X-Localization-Missing counts them. An unknown code is 400 unsupported_language.
Platform

Status, Pricing & Change History

Service health, the published plans, and the machine-readable change history behind the NEW / MODIFIED badges shown across the reference.

GET/v1/account/report-brandingFreeThe report branding configured for your account▶

What an account's reports will look like. Read only.

ParameterTypeRequiredDescription
langstringOptionalResponse language: one of the codes below (GET /v1/i18n/languages lists them with their names and coverage; hi-IN is accepted as hi, en-IN/en-GB/en-US as en). Canonical fields never change with the language; localized values are ADDED as <field>_local. Accepted does not mean fully translated: a value with no verified translation in that language has no _local field (never an English stand-in), and the response header X-Localization-Missing counts them. An unknown code is 400 unsupported_language.
GET/v1/changelogFreeAPI change history▶

What changed in the API, when, and what it used to do.

Entries are append-only and newest first. A modified endpoint gets a new entry rather than an edit to the old one, so the previous contract stays readable — which is what you need if a change broke you.

breaking is true only where a request that worked before now fails or means something different. The same source feeds the NEW/MODIFIED badges in the API reference, so a badge and this list cannot disagree.

ParameterTypeRequiredDescription
endpointstringOptionalOnly entries touching this path, e.g. /v1/panchang
statusstringOptionalNEW | MODIFIED | DEPRECATED | FIXED
sincestringOptionalOnly entries on or after this date, YYYY-MM-DD
langstringOptionalResponse language: one of the codes below (GET /v1/i18n/languages lists them with their names and coverage; hi-IN is accepted as hi, en-IN/en-GB/en-US as en). Canonical fields never change with the language; localized values are ADDED as <field>_local. Accepted does not mean fully translated: a value with no verified translation in that language has no _local field (never an English stand-in), and the response header X-Localization-Missing counts them. An unknown code is 400 unsupported_language.
GET/v1/healthFreeHealth Check▶

Detailed health check.

ParameterTypeRequiredDescription
langstringOptionalResponse language: one of the codes below (GET /v1/i18n/languages lists them with their names and coverage; hi-IN is accepted as hi, en-IN/en-GB/en-US as en). Canonical fields never change with the language; localized values are ADDED as <field>_local. Accepted does not mean fully translated: a value with no verified translation in that language has no _local field (never an English stand-in), and the response header X-Localization-Missing counts them. An unknown code is 400 unsupported_language.
GET/v1/pricingFreePublished pricing plans▶

Every plan the website shows, priced in one currency. Read from the same plans table the admin panel edits, so a price change needs no deploy. No API key required.

ParameterTypeRequiredDescription
currencystringOptionalINR or USD. Defaults by visitor country, then INR.
langstringOptionalResponse language: one of the codes below (GET /v1/i18n/languages lists them with their names and coverage; hi-IN is accepted as hi, en-IN/en-GB/en-US as en). Canonical fields never change with the language; localized values are ADDED as <field>_local. Accepted does not mean fully translated: a value with no verified translation in that language has no _local field (never an English stand-in), and the response header X-Localization-Missing counts them. An unknown code is 400 unsupported_language.
GET/v1/statusFreeGet Status▶

Get API status and statistics.

ParameterTypeRequiredDescription
langstringOptionalResponse language: one of the codes below (GET /v1/i18n/languages lists them with their names and coverage; hi-IN is accepted as hi, en-IN/en-GB/en-US as en). Canonical fields never change with the language; localized values are ADDED as <field>_local. Accepted does not mean fully translated: a value with no verified translation in that language has no _local field (never an English stand-in), and the response header X-Localization-Missing counts them. An unknown code is 400 unsupported_language.
GET/v1/tara/eventsProTara Asta / Udaya events for a location and date range (PRO)▶

PRO. Find Tara Asta (heliacal setting) and Tara Udaya (heliacal rising) events for Budh (Mercury), Shukra (Venus), Mangal (Mars), Guru (Jupiter) or Shani (Saturn).

The calculation follows Sūrya Siddhānta IX.2–IX.9: the kālāṃśa — the interval between the Sun's and the planet's horizon crossings — is compared against the classical threshold. Mars 17, Saturn 15 and Jupiter 11 each have a single limit (IX.6). Mercury and Venus have two, and which applies is fixed by the conjunction the apparition belongs to, not by the planet's motion on the day: Venus 8 approaching or leaving inferior conjunction and 10 for superior (IX.7), Mercury 12 and 14 respectively (IX.8). The limit is set at the Asta and held until the Udaya, so a retrograde station occurring inside a disappearance cannot change it.

It is not an ecliptic longitude separation, and it is not the chart-combustion orb.

The Moon is deliberately not served here: Sūrya Siddhānta treats its heliacal rising and setting at the head of chapter X, under a different rule, so answering for it under this one would apply the wrong rule.

Because the criterion is a horizon relationship, the result depends on where you are. New Delhi and Lima differ by about a week for Shukra Asta 2026. Supplying a timezone does not substitute for supplying coordinates.

astronomical_date is the local civil date *containing* the calculated event instant. It is not an assertion of the date printed by any particular Panchang or almanac; see provenance.date_assignment in the response.

Range is limited to 366 days per request.

ParameterTypeRequiredDescription
planetstringRequiredbudh|mercury, shukra|venus, mangal|kuja|mars, guru|jupiter, shani|saturn
latfloatRequiredObserver latitude. REQUIRED — Tara Asta/Udaya is a local horizon event and the coordinates drive the astronomy.
lonfloatRequiredObserver longitude. REQUIRED.
start_datestringRequiredWindow start, YYYY-MM-DD
end_datestringRequiredWindow end, YYYY-MM-DD (inclusive)
tzstringOptionalIANA timezone for presentation only, e.g. Asia/Kolkata. It never changes the astronomy. Omit it and the zone is resolved from the coordinates.
langstringOptionalResponse language: one of the codes below (GET /v1/i18n/languages lists them with their names and coverage; hi-IN is accepted as hi, en-IN/en-GB/en-US as en). Canonical fields never change with the language; localized values are ADDED as <field>_local. Accepted does not mean fully translated: a value with no verified translation in that language has no _local field (never an English stand-in), and the response header X-Localization-Missing counts them. An unknown code is 400 unsupported_language.
GET/v1/tara/stateProCurrent Tara Asta / Udaya state at a moment and location (PRO)▶

PRO. Is the planet currently Asta?

The verdict is read off this engine's own Asta/Udaya events: the instant is Asta when it falls at or after an Asta and before the Udaya that closes it, and visible otherwise. governing_event names the event the answer came from, so it can be checked against /v1/tara/events directly.

This endpoint does not evaluate visibility independently, and that is deliberate. Sūrya Siddhānta IX specifies event computation and provides no separate point-in-time visibility rule, so deriving the state from the event stream keeps one implementation of the criterion rather than two that can disagree. It is an engineering architecture chosen to stay faithful to the source's event-oriented model; the text is not claimed to prescribe it.

kalamsa is descriptive, not the verdict. Comparing it against threshold will disagree with is_asta near opposition, where the kālāṃśa folds through ±180° — a superior planet twelve hours from the Sun is as visible as it ever gets, and the folded value can read negative. That is the fold, not a contradiction.

Resolving the enclosing apparition costs a bounded scan, so this is not a single-sample lookup: expect roughly 100–500 ms depending on the planet's synodic period. If no governing event is found inside the search, the response is status: "indeterminate" rather than an assumption of visibility — absence of an Asta in the searched span is not evidence that none occurred.

Omitting at uses the current moment in the resolved zone, via the same now_in_zone helper the /now family already uses — this endpoint does not invent its own idea of "now".

ParameterTypeRequiredDescription
planetstringRequiredbudh|mercury, shukra|venus, mangal|kuja|mars, guru|jupiter, shani|saturn
latfloatRequiredObserver latitude. REQUIRED.
lonfloatRequiredObserver longitude. REQUIRED.
atstringOptionalInstant to evaluate, ISO-8601. A naive value is read in the resolved zone; omit it entirely for the current moment there.
tzstringOptionalIANA timezone for presentation only. Omit it and the zone is resolved from the coordinates.
langstringOptionalResponse language: one of the codes below (GET /v1/i18n/languages lists them with their names and coverage; hi-IN is accepted as hi, en-IN/en-GB/en-US as en). Canonical fields never change with the language; localized values are ADDED as <field>_local. Accepted does not mean fully translated: a value with no verified translation in that language has no _local field (never an English stand-in), and the response header X-Localization-Missing counts them. An unknown code is 400 unsupported_language.
Reference

Error Codes

All errors return JSON with error, message, and optional docs link.

401
Unauthorized
Missing or invalid X-API-Key header. Get a key from your dashboard.
403
Forbidden
Valid key but endpoint requires a higher plan tier (Free → Pro → Enterprise).
422
Validation Error
Invalid parameter — wrong date format, out-of-range lat/lon, unsupported event type, or date outside 1700–3100.
429
Rate Limited
Monthly or per-minute quota exceeded. Check X-RateLimit-Remaining header.
500
Engine Error
Internal calculation error. Report with date and coordinates used.
503
Service Unavailable
Live engine temporarily unavailable. Pre-computed dates (1700–3100) still served from DB.
Reference

Rate Limits & Plans

Limits are per-API-key. Every response includes headers so you can track usage in real-time.

PlanRequests / MonthRequests / MinEndpointsPrice
Trial
2005All endpoints — 3-day evaluation₹0
Free
1,00030Core panchang, timings, festivals, rahukaal₹0
Starter
10,00060All core endpoints + Bulk endpoints₹299/mo
Pro
100,00060All endpoints incl. Muhurat, Bulk & Calendar₹999/mo
Business
500,000120All endpoints + Custom rules, Priority phone + email₹2,999/mo
Enterprise
UnlimitedCustom+ Bulk APIs, Full export, SLA, Dedicated supportCustom
Response Headers
X-RateLimit-Limit:     50000
X-RateLimit-Remaining: 49847
X-RateLimit-Reset:     2025-04-01T00:00:00Z
X-Request-Id:          req_01HXXXXXXXXXXXXXXXXXX
Need more requests or Enterprise access?

Upgrade directly from the developer dashboard. Enterprise plans include SLA, dedicated support, and IP allowlisting.

Upgrade Plan →
Reference

Coverage & Engine

TathaAstu uses a two-path architecture — transparent to clients.

⚡
1,400 Years Coverage (1700–3100)The world’s widest Panchang data range. Every date from 1700 to 3100 is pre-computed — 7.6 million rows across 15 reference locations — so those responses come back in <5ms. The Swiss Ephemeris live engine covers the same range for any other coordinates, and reaches to 3599.
🔭
Dual-Path ArchitectureRedis + MySQL cached responses for common dates. Swiss Ephemeris real-time calculation for historical/future dates. Same JSON structure, transparent to clients.
🌏
Worldwide, not India-onlyPass any lat/lon and the Panchang is computed for that place: sunrise, sunset and the tithi/nakshatra boundaries are derived for those coordinates, not mapped onto an Indian city. The civil clock is resolved from the coordinates with daylight saving applied, or name the zone yourself with tz (any IANA zone, e.g. Europe/Paris, America/New_York). Every response reports the zone it used in location.timezone. The 15 pre-computed locations are a fast path, not a limit — coordinates anywhere on Earth are computed live.
🔢
Engine Attribution on Every ResponseEvery endpoint returns engine.name, engine.version, engine.calculation, and engine.ayanamsa so clients can always verify the calculation method.

⚡ Interactive API Reference

Explore and test every endpoint in your browser. Powered by Swagger UI. Requires a valid API key from your dashboard.

⚡
Interactive API Explorer
Click Load to initialise Swagger UI from your deployed OpenAPI spec.

Make sure your FastAPI server is running at api.tathaastuapi.com.

All 136 endpoints, parameters, and response schemas will be available here.
Interactive Sandbox

🧪 Try It Live

Real calls to the production API. Enter your key once and all panels will use it.

🔑 API Key Enter once — auto-fills all panels
⚠️
CORS NoteBrowser sandbox calls require your server to have CORS enabled for this domain, or you can test directly from your server using cURL/Python. The API key is still required even for allowed origins.
GET/v1/panchang— Core panchang for any date
GET/v1/timings— All timing windows for a date
GET/v1/hora— 24 planetary hours Pro
GET/v1/festivals— Festivals for a date
GET/v1/shastra/conditions— Full shastric layer Business
GET/v1/events/suitability— Event ratings Business
Want the full interactive explorer with schemas?

Switch to API Reference for Swagger UI with all 136 endpoints, parameter schemas, and auto-generated code samples.