Festivals
POST https://starsapi.com/api/v3/vedic/panchang/festivals
Returns the Hindu festival calendar for a year — 155 festivals and vrats, computed from the actual panchang for the supplied location. Nothing is a static lookup: every date is derived from its defining tithi and the kaal at which the observance is decided.
Most festivals fall on the day their tithi touches sunrise (udaya), but many do not. Diwali is fixed by Amavasya during pradosh; Maha Shivaratri by Chaturdashi at nishita; Karva Chauth by Chaturthi between sunset and moonrise; Krishna Janmashtami by Ashtami and Rohini together. Each rule is applied per festival, so the returned dates match observed practice rather than a naive sunrise lookup.
Responses include English and Hindi names and descriptions, days-until labels, adhik-maas handling, kshaya-tithi notes, Bhadra windows, and dual dates where Smarta and Vaishnava traditions differ.
Authentication
| Method | Example |
|---|---|
| Header (recommended) | X-Api-Key: sa_live_xxxxxxxxxxxx |
| Bearer | Authorization: Bearer sa_live_xxxxxxxxxxxx |
| Query | ?api_key=sa_live_xxxxxxxxxxxx |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
year | integer | Yes | Calendar year, 1800–2400. |
timezone | string | Yes | IANA timezone (e.g. Asia/Kolkata). Also fixes what “today” means for days_until. |
latitude | number | Yes | Decimal degrees, −90 to 90. |
longitude | number | Yes | Decimal degrees, −180 to 180. |
month | integer | No | 1–12. Narrows the list to one calendar month. |
category | string | No | major, important or vrat. Comma-separated for several: "major,vrat". |
key | string | No | One or more festival keys: "diwali" or "diwali,holi". Keys that do not occur in that year come back in not_found. |
place | string | No | Free-text label, echoed back in location.place. |
Response shape
Top level
| Field | Type | Description |
|---|---|---|
year month month_name | — | Echo of the request. month and month_name are null when no month filter was sent. |
adhik_maas | object | has_adhik_maas, and when true the month name plus its full start–end window. Always present; has_adhik_maas: false in ordinary years. |
next_festival | object | null | The next festival from the returned list. Filter to March and it will be the next one in March — null if that month has already passed. |
total_count | integer | Festivals after all filters. |
festivals | object | Grouped by English month name. Always an object, {} when nothing matches. |
not_found | array | Only when key was sent. Keys that do not occur in that year — e.g. padmini_ekadashi outside an adhik-maas year. |
Festival object
| Field | Type | Description |
|---|---|---|
key | string | Stable identifier — use this, not the name. |
name name_hindi | string | Display names. |
date day day_hindi | string | ISO date and weekday. |
category | string | major, important or vrat. |
hindu_month | string | Purnimant month. "Adhik Jyeshtha" for adhik-maas entries. |
description description_hindi | string | One-line explanation. |
region | string | Primary observing region. |
days_until | integer | Days from today. Negative once past (-134). Independent of any filter. |
days_label days_label_hindi | string | Ready to display: "in 2 days", "Today", "134 days ago". |
tradition | string | null | "smarta", "vaishnava", or "smarta,vaishnava" when both fall together. |
alternate | object | null | Second date when the traditions differ — see below. |
bhadra | object | null | Bhadra window for festivals where it is relevant — see below. |
is_kshaya | boolean | True when the tithi never touched a sunrise. |
tithi_note tithi_note_hindi | string | null | Explains the kshaya case. null otherwise. |
Smarta and Vaishnava dates
Ram Navami and Krishna Janmashtami are decided differently by the two traditions and can land on different days. Rather than emit two entries that the date sort would separate, the endpoint returns one entry with an alternate block.
{
"key": "ram_navami",
"date": "2026-03-26",
"tradition": "smarta",
"alternate": {
"date": "2026-03-27",
"day": "Friday",
"tradition": "vaishnava",
"days_until": -109,
"days_label": "109 days ago"
}
}
When both traditions agree on the day, there is a single date and alternate is null:
{
"key": "krishna_janmashtami",
"date": "2026-09-04",
"tradition": "smarta,vaishnava",
"alternate": null
}
Bhadra
Bhadra (Vishti karana) is inauspicious for Holika Dahan, so the window is reported wherever it is relevant. It is informational — the returned date already accounts for the tithi rules.
"bhadra": {
"present": true,
"in_pradosh": true,
"start": "2026-03-02 17:56",
"end": "2026-03-03 05:28",
"vaas": "mrityu"
}
vaas is swarga, patala or mrityu, from the Moon's sidereal rashi during Bhadra.
Kshaya tithi
A tithi can begin after one sunrise and end before the next — touching no sunrise at all. The festival is not dropped; it is placed by the rule its observance demands (usually the day the tithi begins), and flagged:
"is_kshaya": true,
"tithi_note": "Kshaya tithi — the tithi does not touch any sunrise. Observed on the day the tithi begins."
Gudi Padwa 2026 is one such case, which is why some calendars disagree on it.
Monthly vrats
Three observances repeat every lunar month and are returned with category: "vrat". Their names change with the day or month:
| Key | Per year | Names |
|---|---|---|
pradosh_vrat | ~25 | By weekday — Ravi, Soma, Bhauma, Budha, Guru, Shukra, Shani Pradosh Vrat. |
sankashti_chaturthi | 12–13 | By month — Lambodara, Dwijapriya, Bhalachandra … and Vibhuvana in an adhik month. |
masik_shivratri | 12–13 | Maha Shivaratri in Phalguna, Sawan Shivaratri in Shravana, Masik Shivaratri otherwise. |
Every entry shares the same key, so filter on date or hindu_month, not key, when you need a specific occurrence.
Adhik maas
In an adhik-maas year the festivals stay with the nija month, but the adhik month has observances of its own — Padmini and Parama Ekadashi, plus its own Pradosh, Sankashti and Masik Shivaratri. These appear with hindu_month: "Adhik Jyeshtha".
adhik_maas is present every year; check has_adhik_maas before reading the rest.
Errors
| HTTP | Code | Cause |
|---|---|---|
| 400 | MISSING_FIELD | Required field absent. |
| 400 | INVALID_DATE | Year outside 1800–2400, or month outside 1–12. |
| 400 | INVALID_VALUE | Unknown category, or malformed key. |
| 400 | INVALID_TIMEZONE | Non-IANA timezone. |
| 400 | INVALID_COORDINATE | Lat/lon out of range. |
| 405 | METHOD_NOT_ALLOWED | Non-POST request. |
An unknown key is not an error — it comes back in not_found with an empty festivals object.