API reference / Festivals & muhurta
Festivals & muhurta
Recurring observances, shraddha dates, auspicious-window search and naming syllables.
7 endpoints. Every endpoint is POST with a JSON body and your key in the Authorization header. Request schemas and examples come from the OpenAPI document; each example response was captured from the live engine and its data fields are a guide to the shape, not a contract.
Vrat Calendar
POSTAvailable
https://api.96astro.com/v1/festivals-muhurta/vrat-calendarEvery date in a year on which one recurring observance falls at a place, with its tithi, paksha, lunar month and the moment it was judged at.
- Credits
- 3 credits
- Input
- Date and place
- Output
- JSON
- Delivery
- Direct response
- Languages
- English; translated term names with
labels
| Header | Value and description |
|---|---|
AuthorizationRequired | Bearer YOUR_API_KEYYour sandbox (sk_test_...) or live (sk_live_...) key. X-API-Key: <key> is accepted instead. |
Content-TypeRequired | application/jsonThe body is JSON. |
Idempotency-KeyOptional | <unique string>Makes retries safe: a repeated key with the same body replays the stored response and is never charged twice. (1 to 200 characters) |
| Field | Description |
|---|---|
timezonestring | nullOptional | IANA time zone, e.g. Asia/Kolkata Default: Example: |
utc_offsetstring | nullOptional | Fixed offset such as +05:30, if no IANA zone is known Default: |
latitudenumberRequired | Limits: minimum -90, maximum 90 Example: |
longitudenumberRequired | Limits: minimum -180, maximum 180 Example: |
yearintegerRequired | Calendar year, 1900-2200. Example: |
observancestringOptional | Which observance; see vrat-observances. Default: Allowed values: amavasyaashtamichandra-darshanchaturdashidwadashiekadashimasik-durgashtamimasik-janmashtamimasik-kalashtamimasik-karthigaimasik-shivaratrinavamipradoshampurnimasankashti-chaturthisatyanarayana-pujashashthiskanda-sashtitrayodashivinayaka-chaturthi Example: |
ayanamshastringOptional | Default: Allowed value: lahiri |
labelsstringOptional | Optional. Adds `meta.labels`: translated display names for the identifiers in the answer. `data` is unchanged. Free. Any other code is refused with 422 unsupported_language. Allowed values: asbndeesfrguhiitknkomlmrnenlorpaplptrusitatetrur |
| Value | Meaning |
|---|---|
amavasya | Amavasya |
ashtami | Ashtami |
chandra-darshan | Chandra Darshan |
chaturdashi | Chaturdashi |
dwadashi | Dwadashi |
ekadashi | Ekadashi |
masik-durgashtami | Masik Durgashtami |
masik-janmashtami | Masik Janmashtami |
masik-kalashtami | Masik Kalashtami |
masik-karthigai | Masik Karthigai |
masik-shivaratri | Masik Shivaratri |
navami | Navami |
pradosham | Pradosham |
purnima | Purnima |
sankashti-chaturthi | Sankashti Chaturthi |
satyanarayana-puja | Satyanarayana Puja |
shashthi | Shashthi |
skanda-sashti | Skanda Sashti |
trayodashi | Trayodashi |
vinayaka-chaturthi | Vinayaka Chaturthi |
Response · fields in data
Inferred from the example response: a guide to the shape, not a contract.
year· integerlocation· objectobservance· objectdates· array of object
Example request
curl -X POST https://api.96astro.com/v1/festivals-muhurta/vrat-calendar \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"year": 2026,
"observance": "ekadashi",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209
}'const response = await fetch("https://api.96astro.com/v1/festivals-muhurta/vrat-calendar", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
"year": 2026,
"observance": "ekadashi",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209
}),
});
const { data, meta } = await response.json();
console.log(data);import { Astro96Client } from "@96astro/api";
const astro = new Astro96Client({ apiKey: "YOUR_API_KEY" });
const { data, meta } = await astro.festivalsMuhurta.vratCalendar({
"year": 2026,
"observance": "ekadashi",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209
});
console.log(data);import requests
response = requests.post(
"https://api.96astro.com/v1/festivals-muhurta/vrat-calendar",
headers={
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
json={
"year": 2026,
"observance": "ekadashi",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209,
},
timeout=60,
)
response.raise_for_status()
data = response.json()["data"]
print(data)from astro96_api import Astro96Client
astro = Astro96Client(api_key="YOUR_API_KEY")
res = astro.festivals_muhurta.vrat_calendar({
"year": 2026,
"observance": "ekadashi",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209,
})
print(res.data)<?php
$ch = curl_init('https://api.96astro.com/v1/festivals-muhurta/vrat-calendar');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'year' => 2026,
'observance' => 'ekadashi',
'timezone' => 'Asia/Kolkata',
'latitude' => 28.6139,
'longitude' => 77.209,
]),
]);
$response = curl_exec($ch);
curl_close($ch);
$result = json_decode($response, true);
print_r($result['data']);package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"year": 2026,
"observance": "ekadashi",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209
}`)
req, err := http.NewRequest("POST", "https://api.96astro.com/v1/festivals-muhurta/vrat-calendar", body)
if err != nil {
panic(err)
}
req.Header.Set("Authorization", "Bearer YOUR_API_KEY")
req.Header.Set("Content-Type", "application/json")
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
out, _ := io.ReadAll(res.Body)
fmt.Println(res.Status, string(out))
}Example response
{
"data": {
"year": 2026,
"location": {
"latitude": 28.6139,
"longitude": 77.209,
"timezone": "Asia/Kolkata"
},
"observance": {
"id": "ekadashi",
"label": "Ekadashi",
"cadence": "twice a lunar month",
"judged": "sunrise"
},
"dates": [
{
"date": "2026-01-14",
"tithi": "Ekadashi",
"paksha": "Krishna",
"lunar_month": "Pausha",
…Captured from the live engine with a sandbox key (so credits_used is 0) and trimmed: long arrays keep their first items.
Error responses
- 400invalid_request
- 401invalid_key, expired_key
- 402payment_required
- 403account_suspended
- 404not_found
- 409idempotency_conflict
- 413payload_too_large
- 422invalid_request, unsupported_language
- 429rate_limited, quota_exhausted, spend_cap_reached, project_budget_exceeded
- 500computation_failed
- 502unavailable
- 503unavailable
- 504deadline_exceeded
Errors are never charged. What each status means and what to do: errors.
Vrat Observance Catalogue
POSTAvailable
https://api.96astro.com/v1/festivals-muhurta/vrat-observancesLists the observances the vrat calendar supports with cadence and the moment each is judged at.
- Credits
- 1 credit
- Input
- No input
- Output
- JSON
- Delivery
- Direct response
- Languages
- English; translated term names with
labels
| Header | Value and description |
|---|---|
AuthorizationRequired | Bearer YOUR_API_KEYYour sandbox (sk_test_...) or live (sk_live_...) key. X-API-Key: <key> is accepted instead. |
Content-TypeRequired | application/jsonThe body is JSON. |
Idempotency-KeyOptional | <unique string>Makes retries safe: a repeated key with the same body replays the stored response and is never charged twice. (1 to 200 characters) |
| Field | Description |
|---|---|
observancestring | nullOptional | Return only this observance. Default: Allowed values: amavasyaashtamichandra-darshanchaturdashidwadashiekadashimasik-durgashtamimasik-janmashtamimasik-kalashtamimasik-karthigaimasik-shivaratrinavamipradoshampurnimasankashti-chaturthisatyanarayana-pujashashthiskanda-sashtitrayodashivinayaka-chaturthi Example: |
labelsstringOptional | Optional. Adds `meta.labels`: translated display names for the identifiers in the answer. `data` is unchanged. Free. Any other code is refused with 422 unsupported_language. Allowed values: asbndeesfrguhiitknkomlmrnenlorpaplptrusitatetrur |
Response · fields in data
Inferred from the example response: a guide to the shape, not a contract.
observances· array of object
Example request
curl -X POST https://api.96astro.com/v1/festivals-muhurta/vrat-observances \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"observance": "ekadashi"
}'const response = await fetch("https://api.96astro.com/v1/festivals-muhurta/vrat-observances", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
"observance": "ekadashi"
}),
});
const { data, meta } = await response.json();
console.log(data);import { Astro96Client } from "@96astro/api";
const astro = new Astro96Client({ apiKey: "YOUR_API_KEY" });
const { data, meta } = await astro.festivalsMuhurta.vratObservances({
"observance": "ekadashi"
});
console.log(data);import requests
response = requests.post(
"https://api.96astro.com/v1/festivals-muhurta/vrat-observances",
headers={
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
json={
"observance": "ekadashi",
},
timeout=60,
)
response.raise_for_status()
data = response.json()["data"]
print(data)from astro96_api import Astro96Client
astro = Astro96Client(api_key="YOUR_API_KEY")
res = astro.festivals_muhurta.vrat_observances({
"observance": "ekadashi",
})
print(res.data)<?php
$ch = curl_init('https://api.96astro.com/v1/festivals-muhurta/vrat-observances');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'observance' => 'ekadashi',
]),
]);
$response = curl_exec($ch);
curl_close($ch);
$result = json_decode($response, true);
print_r($result['data']);package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"observance": "ekadashi"
}`)
req, err := http.NewRequest("POST", "https://api.96astro.com/v1/festivals-muhurta/vrat-observances", body)
if err != nil {
panic(err)
}
req.Header.Set("Authorization", "Bearer YOUR_API_KEY")
req.Header.Set("Content-Type", "application/json")
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
out, _ := io.ReadAll(res.Body)
fmt.Println(res.Status, string(out))
}Example response
{
"data": {
"observances": [
{
"id": "ekadashi",
"label": "Ekadashi",
"cadence": "twice a lunar month",
"judged": "at sunrise",
"note": "A sunrise-to-sunrise fast, so the tithi running at sunrise decides the day."
}
]
},
"meta": {
"request_id": "req_00000000000000000000",
"api_version": "v1",
"credits_used": 0,
"warnings": [],
"language": "en"
}
}Captured from the live engine with a sandbox key (so credits_used is 0) and trimmed: long arrays keep their first items.
Error responses
- 400invalid_request
- 401invalid_key, expired_key
- 402payment_required
- 403account_suspended
- 404not_found
- 409idempotency_conflict
- 413payload_too_large
- 422invalid_request, unsupported_language
- 429rate_limited, quota_exhausted, spend_cap_reached, project_budget_exceeded
- 500computation_failed
- 502unavailable
- 503unavailable
- 504deadline_exceeded
Errors are never charged. What each status means and what to do: errors.
Muhurta Finder
POSTAvailable
https://api.96astro.com/v1/festivals-muhurta/muhurta-finderSuitable days for one undertaking over a date range at a place, scored with clear windows; rejected days are returned with what blocked them.
- Credits
- 3 credits
- Input
- Date and place
- Output
- JSON
- Delivery
- Direct response
- Languages
- English; translated term names with
labels
| Header | Value and description |
|---|---|
AuthorizationRequired | Bearer YOUR_API_KEYYour sandbox (sk_test_...) or live (sk_live_...) key. X-API-Key: <key> is accepted instead. |
Content-TypeRequired | application/jsonThe body is JSON. |
Idempotency-KeyOptional | <unique string>Makes retries safe: a repeated key with the same body replays the stored response and is never charged twice. (1 to 200 characters) |
| Field | Description |
|---|---|
timezonestring | nullOptional | IANA time zone, e.g. Asia/Kolkata Default: Example: |
utc_offsetstring | nullOptional | Fixed offset such as +05:30, if no IANA zone is known Default: |
latitudenumberRequired | Limits: minimum -90, maximum 90 Example: |
longitudenumberRequired | Limits: minimum -180, maximum 180 Example: |
purposestringOptional | The undertaking; see muhurta-purposes. Default: Allowed values: bhoomi-pujanbusinessengagementgold-purchasegriha-praveshpropertygeneraltravelvehiclevivah Example: |
start_datestringRequired | Limits: format date Example: |
daysintegerOptional | Days searched from start_date. Default: Limits: minimum 1, maximum 400 Example: |
ayanamshastringOptional | Default: Allowed value: lahiri |
labelsstringOptional | Optional. Adds `meta.labels`: translated display names for the identifiers in the answer. `data` is unchanged. Free. Any other code is refused with 422 unsupported_language. Allowed values: asbndeesfrguhiitknkomlmrnenlorpaplptrusitatetrur |
| Value | Meaning |
|---|---|
bhoomi-pujan | Bhoomi Pujan |
business | Business Opening |
engagement | Engagement |
gold-purchase | Gold & Valuables Purchase |
griha-pravesh | Griha Pravesh |
property | Property Purchase |
general | Shubha (general) |
travel | Travel |
vehicle | Vehicle Purchase |
vivah | Vivah (Marriage) |
Response · fields in data
Inferred from the example response: a guide to the shape, not a contract.
purpose· objectrules· objectstart_date· stringdays· integerlocation· objectsuitable_days· array of objectrejected_days· array of object
Example request
curl -X POST https://api.96astro.com/v1/festivals-muhurta/muhurta-finder \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"purpose": "vivah",
"start_date": "2026-11-01",
"days": 30,
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209
}'const response = await fetch("https://api.96astro.com/v1/festivals-muhurta/muhurta-finder", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
"purpose": "vivah",
"start_date": "2026-11-01",
"days": 30,
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209
}),
});
const { data, meta } = await response.json();
console.log(data);import { Astro96Client } from "@96astro/api";
const astro = new Astro96Client({ apiKey: "YOUR_API_KEY" });
const { data, meta } = await astro.festivalsMuhurta.muhurtaFinder({
"purpose": "vivah",
"start_date": "2026-11-01",
"days": 30,
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209
});
console.log(data);import requests
response = requests.post(
"https://api.96astro.com/v1/festivals-muhurta/muhurta-finder",
headers={
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
json={
"purpose": "vivah",
"start_date": "2026-11-01",
"days": 30,
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209,
},
timeout=60,
)
response.raise_for_status()
data = response.json()["data"]
print(data)from astro96_api import Astro96Client
astro = Astro96Client(api_key="YOUR_API_KEY")
res = astro.festivals_muhurta.muhurta_finder({
"purpose": "vivah",
"start_date": "2026-11-01",
"days": 30,
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209,
})
print(res.data)<?php
$ch = curl_init('https://api.96astro.com/v1/festivals-muhurta/muhurta-finder');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'purpose' => 'vivah',
'start_date' => '2026-11-01',
'days' => 30,
'timezone' => 'Asia/Kolkata',
'latitude' => 28.6139,
'longitude' => 77.209,
]),
]);
$response = curl_exec($ch);
curl_close($ch);
$result = json_decode($response, true);
print_r($result['data']);package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"purpose": "vivah",
"start_date": "2026-11-01",
"days": 30,
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209
}`)
req, err := http.NewRequest("POST", "https://api.96astro.com/v1/festivals-muhurta/muhurta-finder", body)
if err != nil {
panic(err)
}
req.Header.Set("Authorization", "Bearer YOUR_API_KEY")
req.Header.Set("Content-Type", "application/json")
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
out, _ := io.ReadAll(res.Body)
fmt.Println(res.Status, string(out))
}Example response
{
"data": {
"purpose": {
"id": "vivah",
"label": "Vivah (Marriage)",
"tradition": "Muhurta Chintamani, as commonly published. Eleven nakshatras, the bright-fortnight tithis, and the benefic weekdays."
},
"rules": {
"favourable_nakshatras": [
"Rohini",
"Mrigashira",
"Magha"
],
"favourable_tithis": [
"Dvitiya",
"Tritiya",
"Panchami"
],
"favourable_weekdays": [
"Monday",
…Captured from the live engine with a sandbox key (so credits_used is 0) and trimmed: long arrays keep their first items.
Error responses
- 400invalid_request
- 401invalid_key, expired_key
- 402payment_required
- 403account_suspended
- 404not_found
- 409idempotency_conflict
- 413payload_too_large
- 422invalid_request, unsupported_language
- 429rate_limited, quota_exhausted, spend_cap_reached, project_budget_exceeded
- 500computation_failed
- 502unavailable
- 503unavailable
- 504deadline_exceeded
Errors are never charged. What each status means and what to do: errors.
Muhurta Purpose Catalogue
POSTAvailable
https://api.96astro.com/v1/festivals-muhurta/muhurta-purposesLists the purposes the muhurta finder can search for, with each tradition's nakshatra preference and blockers.
- Credits
- 1 credit
- Input
- No input
- Output
- JSON
- Delivery
- Direct response
- Languages
- English; translated term names with
labels
| Header | Value and description |
|---|---|
AuthorizationRequired | Bearer YOUR_API_KEYYour sandbox (sk_test_...) or live (sk_live_...) key. X-API-Key: <key> is accepted instead. |
Content-TypeRequired | application/jsonThe body is JSON. |
Idempotency-KeyOptional | <unique string>Makes retries safe: a repeated key with the same body replays the stored response and is never charged twice. (1 to 200 characters) |
| Field | Description |
|---|---|
purposestring | nullOptional | Return only this purpose. Default: Allowed values: bhoomi-pujanbusinessengagementgold-purchasegriha-praveshpropertygeneraltravelvehiclevivah Example: |
labelsstringOptional | Optional. Adds `meta.labels`: translated display names for the identifiers in the answer. `data` is unchanged. Free. Any other code is refused with 422 unsupported_language. Allowed values: asbndeesfrguhiitknkomlmrnenlorpaplptrusitatetrur |
Response · fields in data
Inferred from the example response: a guide to the shape, not a contract.
purposes· array of object
Example request
curl -X POST https://api.96astro.com/v1/festivals-muhurta/muhurta-purposes \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"purpose": "vivah"
}'const response = await fetch("https://api.96astro.com/v1/festivals-muhurta/muhurta-purposes", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
"purpose": "vivah"
}),
});
const { data, meta } = await response.json();
console.log(data);import { Astro96Client } from "@96astro/api";
const astro = new Astro96Client({ apiKey: "YOUR_API_KEY" });
const { data, meta } = await astro.festivalsMuhurta.muhurtaPurposes({
"purpose": "vivah"
});
console.log(data);import requests
response = requests.post(
"https://api.96astro.com/v1/festivals-muhurta/muhurta-purposes",
headers={
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
json={
"purpose": "vivah",
},
timeout=60,
)
response.raise_for_status()
data = response.json()["data"]
print(data)from astro96_api import Astro96Client
astro = Astro96Client(api_key="YOUR_API_KEY")
res = astro.festivals_muhurta.muhurta_purposes({
"purpose": "vivah",
})
print(res.data)<?php
$ch = curl_init('https://api.96astro.com/v1/festivals-muhurta/muhurta-purposes');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'purpose' => 'vivah',
]),
]);
$response = curl_exec($ch);
curl_close($ch);
$result = json_decode($response, true);
print_r($result['data']);package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"purpose": "vivah"
}`)
req, err := http.NewRequest("POST", "https://api.96astro.com/v1/festivals-muhurta/muhurta-purposes", body)
if err != nil {
panic(err)
}
req.Header.Set("Authorization", "Bearer YOUR_API_KEY")
req.Header.Set("Content-Type", "application/json")
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
out, _ := io.ReadAll(res.Body)
fmt.Println(res.Status, string(out))
}Example response
{
"data": {
"purposes": [
{
"id": "vivah",
"label": "Vivah (Marriage)",
"tradition": "Muhurta Chintamani, as commonly published. Eleven nakshatras, the bright-fortnight tithis, and the benefic weekdays.",
"blockers": [
"Bhadra (Vishti karana) runs at sunrise",
"Amavasya",
"Adhik masa (intercalary month)"
]
}
]
},
"meta": {
"request_id": "req_00000000000000000000",
"api_version": "v1",
"credits_used": 0,
"warnings": [],
"language": "en"
}
}Captured from the live engine with a sandbox key (so credits_used is 0) and trimmed: long arrays keep their first items.
Error responses
- 400invalid_request
- 401invalid_key, expired_key
- 402payment_required
- 403account_suspended
- 404not_found
- 409idempotency_conflict
- 413payload_too_large
- 422invalid_request, unsupported_language
- 429rate_limited, quota_exhausted, spend_cap_reached, project_budget_exceeded
- 500computation_failed
- 502unavailable
- 503unavailable
- 504deadline_exceeded
Errors are never charged. What each status means and what to do: errors.
Shraddha Dates
POSTAvailable
https://api.96astro.com/v1/festivals-muhurta/shraddha-datesThe tithi of a death and, for a year, the annual (varshik) shraddha date and the Pitru Paksha shraddha date.
- Credits
- 1 credit
- Input
- Date and place
- Output
- JSON
- Delivery
- Direct response
- Languages
- English; translated term names with
labels
| Header | Value and description |
|---|---|
AuthorizationRequired | Bearer YOUR_API_KEYYour sandbox (sk_test_...) or live (sk_live_...) key. X-API-Key: <key> is accepted instead. |
Content-TypeRequired | application/jsonThe body is JSON. |
Idempotency-KeyOptional | <unique string>Makes retries safe: a repeated key with the same body replays the stored response and is never charged twice. (1 to 200 characters) |
| Field | Description |
|---|---|
timezonestring | nullOptional | IANA time zone, e.g. Asia/Kolkata Default: Example: |
utc_offsetstring | nullOptional | Fixed offset such as +05:30, if no IANA zone is known Default: |
latitudenumberRequired | Limits: minimum -90, maximum 90 Example: |
longitudenumberRequired | Limits: minimum -180, maximum 180 Example: |
death_datestringRequired | Civil date of the death; its tithi is read at that day's sunrise. Limits: format date Example: |
yearintegerRequired | Year to find the shraddha dates in, 1900-2200. Example: |
ayanamshastringOptional | Default: Allowed value: lahiri |
labelsstringOptional | Optional. Adds `meta.labels`: translated display names for the identifiers in the answer. `data` is unchanged. Free. Any other code is refused with 422 unsupported_language. Allowed values: asbndeesfrguhiitknkomlmrnenlorpaplptrusitatetrur |
Response · fields in data
Inferred from the example response: a guide to the shape, not a contract.
death_date· stringyear· integerlocation· objecttithi_of_death· objectvarshik_shraddha· objectpitru_paksha_shraddha· object
Example request
curl -X POST https://api.96astro.com/v1/festivals-muhurta/shraddha-dates \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"death_date": "2020-05-10",
"year": 2026,
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209
}'const response = await fetch("https://api.96astro.com/v1/festivals-muhurta/shraddha-dates", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
"death_date": "2020-05-10",
"year": 2026,
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209
}),
});
const { data, meta } = await response.json();
console.log(data);import { Astro96Client } from "@96astro/api";
const astro = new Astro96Client({ apiKey: "YOUR_API_KEY" });
const { data, meta } = await astro.festivalsMuhurta.shraddhaDates({
"death_date": "2020-05-10",
"year": 2026,
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209
});
console.log(data);import requests
response = requests.post(
"https://api.96astro.com/v1/festivals-muhurta/shraddha-dates",
headers={
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
json={
"death_date": "2020-05-10",
"year": 2026,
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209,
},
timeout=60,
)
response.raise_for_status()
data = response.json()["data"]
print(data)from astro96_api import Astro96Client
astro = Astro96Client(api_key="YOUR_API_KEY")
res = astro.festivals_muhurta.shraddha_dates({
"death_date": "2020-05-10",
"year": 2026,
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209,
})
print(res.data)<?php
$ch = curl_init('https://api.96astro.com/v1/festivals-muhurta/shraddha-dates');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'death_date' => '2020-05-10',
'year' => 2026,
'timezone' => 'Asia/Kolkata',
'latitude' => 28.6139,
'longitude' => 77.209,
]),
]);
$response = curl_exec($ch);
curl_close($ch);
$result = json_decode($response, true);
print_r($result['data']);package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"death_date": "2020-05-10",
"year": 2026,
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209
}`)
req, err := http.NewRequest("POST", "https://api.96astro.com/v1/festivals-muhurta/shraddha-dates", body)
if err != nil {
panic(err)
}
req.Header.Set("Authorization", "Bearer YOUR_API_KEY")
req.Header.Set("Content-Type", "application/json")
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
out, _ := io.ReadAll(res.Body)
fmt.Println(res.Status, string(out))
}Example response
{
"data": {
"death_date": "2020-05-10",
"year": 2026,
"location": {
"latitude": 28.6139,
"longitude": 77.209,
"timezone": "Asia/Kolkata"
},
"tithi_of_death": {
"tithi": "Tritiya",
"paksha": "Krishna",
"number": 3,
"lunar_month": "Vaishakha",
"judged_at": "sunrise"
},
"varshik_shraddha": {
"date": "2026-05-04",
"tithi": "Tritiya",
"paksha": "Krishna",
…Captured from the live engine with a sandbox key (so credits_used is 0) and trimmed: long arrays keep their first items.
Error responses
- 400invalid_request
- 401invalid_key, expired_key
- 402payment_required
- 403account_suspended
- 404not_found
- 409idempotency_conflict
- 413payload_too_large
- 422invalid_request, unsupported_language
- 429rate_limited, quota_exhausted, spend_cap_reached, project_budget_exceeded
- 500computation_failed
- 502unavailable
- 503unavailable
- 504deadline_exceeded
Errors are never charged. What each status means and what to do: errors.
Sahasra Chandrodaya
POSTAvailable
https://api.96astro.com/v1/festivals-muhurta/sahasra-chandrodayaCounts full moons after a birth to find the nth (1000th by default) and its date.
- Credits
- 1 credit
- Input
- Date
- Output
- JSON
- Delivery
- Direct response
- Languages
- English; translated term names with
labels
| Header | Value and description |
|---|---|
AuthorizationRequired | Bearer YOUR_API_KEYYour sandbox (sk_test_...) or live (sk_live_...) key. X-API-Key: <key> is accepted instead. |
Content-TypeRequired | application/jsonThe body is JSON. |
Idempotency-KeyOptional | <unique string>Makes retries safe: a repeated key with the same body replays the stored response and is never charged twice. (1 to 200 characters) |
| Field | Description |
|---|---|
timezonestring | nullOptional | IANA time zone, e.g. Asia/Kolkata Default: Example: |
utc_offsetstring | nullOptional | Fixed offset such as +05:30, if no IANA zone is known Default: |
birth_datestringRequired | Limits: format date Example: |
countintegerOptional | Which full moon after the birth. Default: Limits: minimum 1, maximum 2000 |
labelsstringOptional | Optional. Adds `meta.labels`: translated display names for the identifiers in the answer. `data` is unchanged. Free. Any other code is refused with 422 unsupported_language. Allowed values: asbndeesfrguhiitknkomlmrnenlorpaplptrusitatetrur |
Response · fields in data
Inferred from the example response: a guide to the shape, not a contract.
birth_date· stringcount· integerfull_moon_at· stringdate· stringage· object
Example request
curl -X POST https://api.96astro.com/v1/festivals-muhurta/sahasra-chandrodaya \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"birth_date": "1946-01-01",
"timezone": "Asia/Kolkata"
}'const response = await fetch("https://api.96astro.com/v1/festivals-muhurta/sahasra-chandrodaya", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
"birth_date": "1946-01-01",
"timezone": "Asia/Kolkata"
}),
});
const { data, meta } = await response.json();
console.log(data);import { Astro96Client } from "@96astro/api";
const astro = new Astro96Client({ apiKey: "YOUR_API_KEY" });
const { data, meta } = await astro.festivalsMuhurta.sahasraChandrodaya({
"birth_date": "1946-01-01",
"timezone": "Asia/Kolkata"
});
console.log(data);import requests
response = requests.post(
"https://api.96astro.com/v1/festivals-muhurta/sahasra-chandrodaya",
headers={
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
json={
"birth_date": "1946-01-01",
"timezone": "Asia/Kolkata",
},
timeout=60,
)
response.raise_for_status()
data = response.json()["data"]
print(data)from astro96_api import Astro96Client
astro = Astro96Client(api_key="YOUR_API_KEY")
res = astro.festivals_muhurta.sahasra_chandrodaya({
"birth_date": "1946-01-01",
"timezone": "Asia/Kolkata",
})
print(res.data)<?php
$ch = curl_init('https://api.96astro.com/v1/festivals-muhurta/sahasra-chandrodaya');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'birth_date' => '1946-01-01',
'timezone' => 'Asia/Kolkata',
]),
]);
$response = curl_exec($ch);
curl_close($ch);
$result = json_decode($response, true);
print_r($result['data']);package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"birth_date": "1946-01-01",
"timezone": "Asia/Kolkata"
}`)
req, err := http.NewRequest("POST", "https://api.96astro.com/v1/festivals-muhurta/sahasra-chandrodaya", body)
if err != nil {
panic(err)
}
req.Header.Set("Authorization", "Bearer YOUR_API_KEY")
req.Header.Set("Content-Type", "application/json")
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
out, _ := io.ReadAll(res.Body)
fmt.Println(res.Status, string(out))
}Example response
{
"data": {
"birth_date": "1946-01-01",
"count": 1000,
"full_moon_at": "2026-10-26T09:41:00+05:30",
"date": "2026-10-26",
"age": {
"years": 80.82,
"days": 29518
}
},
"meta": {
"request_id": "req_00000000000000000000",
"api_version": "v1",
"credits_used": 0,
"warnings": [],
"language": "en"
}
}Captured from the live engine with a sandbox key (so credits_used is 0) and trimmed: long arrays keep their first items.
Error responses
- 400invalid_request
- 401invalid_key, expired_key
- 402payment_required
- 403account_suspended
- 404not_found
- 409idempotency_conflict
- 413payload_too_large
- 422invalid_request, unsupported_language
- 429rate_limited, quota_exhausted, spend_cap_reached, project_budget_exceeded
- 500computation_failed
- 502unavailable
- 503unavailable
- 504deadline_exceeded
Errors are never charged. What each status means and what to do: errors.
Name Syllables (Naamakshar)
POSTAvailable
https://api.96astro.com/v1/festivals-muhurta/name-syllablesNaming syllables for a nakshatra pada, or for a Moon longitude.
- Credits
- 1 credit
- Input
- Specific input
- Output
- JSON
- Delivery
- Direct response
- Languages
- English; translated term names with
labels
| Header | Value and description |
|---|---|
AuthorizationRequired | Bearer YOUR_API_KEYYour sandbox (sk_test_...) or live (sk_live_...) key. X-API-Key: <key> is accepted instead. |
Content-TypeRequired | application/jsonThe body is JSON. |
Idempotency-KeyOptional | <unique string>Makes retries safe: a repeated key with the same body replays the stored response and is never charged twice. (1 to 200 characters) |
| Field | Description |
|---|---|
nakshatrastring | nullOptional | Default: Allowed values: AshwiniBharaniKrittikaRohiniMrigashiraArdraPunarvasuPushyaAshleshaMaghaPurva PhalguniUttara PhalguniHastaChitraSwatiVishakhaAnuradhaJyeshthaMulaPurva AshadhaUttara AshadhaShravanaDhanishtaShatabhishaPurva BhadrapadaUttara BhadrapadaRevati Example: |
padainteger | nullOptional | With `nakshatra`; omit for all four. Default: Limits: minimum 1, maximum 4 Example: |
moon_longitudenumber | nullOptional | Sidereal (Lahiri) Moon longitude. Default: Limits: minimum 0, less than 360 |
labelsstringOptional | Optional. Adds `meta.labels`: translated display names for the identifiers in the answer. `data` is unchanged. Free. Any other code is refused with 422 unsupported_language. Allowed values: asbndeesfrguhiitknkomlmrnenlorpaplptrusitatetrur |
Response · fields in data
Inferred from the example response: a guide to the shape, not a contract.
nakshatra· stringnakshatra_number· integerpada· integersyllable· stringsyllables_by_pada· array of object
Example request
curl -X POST https://api.96astro.com/v1/festivals-muhurta/name-syllables \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"nakshatra": "Rohini",
"pada": 2
}'const response = await fetch("https://api.96astro.com/v1/festivals-muhurta/name-syllables", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
"nakshatra": "Rohini",
"pada": 2
}),
});
const { data, meta } = await response.json();
console.log(data);import { Astro96Client } from "@96astro/api";
const astro = new Astro96Client({ apiKey: "YOUR_API_KEY" });
const { data, meta } = await astro.festivalsMuhurta.nameSyllables({
"nakshatra": "Rohini",
"pada": 2
});
console.log(data);import requests
response = requests.post(
"https://api.96astro.com/v1/festivals-muhurta/name-syllables",
headers={
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
json={
"nakshatra": "Rohini",
"pada": 2,
},
timeout=60,
)
response.raise_for_status()
data = response.json()["data"]
print(data)from astro96_api import Astro96Client
astro = Astro96Client(api_key="YOUR_API_KEY")
res = astro.festivals_muhurta.name_syllables({
"nakshatra": "Rohini",
"pada": 2,
})
print(res.data)<?php
$ch = curl_init('https://api.96astro.com/v1/festivals-muhurta/name-syllables');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'nakshatra' => 'Rohini',
'pada' => 2,
]),
]);
$response = curl_exec($ch);
curl_close($ch);
$result = json_decode($response, true);
print_r($result['data']);package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"nakshatra": "Rohini",
"pada": 2
}`)
req, err := http.NewRequest("POST", "https://api.96astro.com/v1/festivals-muhurta/name-syllables", body)
if err != nil {
panic(err)
}
req.Header.Set("Authorization", "Bearer YOUR_API_KEY")
req.Header.Set("Content-Type", "application/json")
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
out, _ := io.ReadAll(res.Body)
fmt.Println(res.Status, string(out))
}Example response
{
"data": {
"nakshatra": "Rohini",
"nakshatra_number": 4,
"pada": 2,
"syllable": "Va",
"syllables_by_pada": [
{
"pada": 1,
"syllable": "O"
},
{
"pada": 2,
"syllable": "Va"
},
{
"pada": 3,
"syllable": "Vi"
}
]
…Captured from the live engine with a sandbox key (so credits_used is 0) and trimmed: long arrays keep their first items.
Error responses
- 400invalid_request
- 401invalid_key, expired_key
- 402payment_required
- 403account_suspended
- 404not_found
- 409idempotency_conflict
- 413payload_too_large
- 422invalid_request, unsupported_language
- 429rate_limited, quota_exhausted, spend_cap_reached, project_budget_exceeded
- 500computation_failed
- 502unavailable
- 503unavailable
- 504deadline_exceeded
Errors are never charged. What each status means and what to do: errors.