Free Vedic astrology API

Four JSON endpoints for Panchang, Choghadiya, Rahu Kaal, daily horoscopes, 36-guna Kundli matching and dosha checks. No API key. No signup. No cost. Charts are computed with the Swiss Ephemeris using the Lahiri ayanamsa — the same engine behind the Kundli matching tool and the city panchang pages on this site.

These are the endpoints that power this website. They are public because the website is public, and documented because an undocumented endpoint is useless to anyone else. Use them in your own site, app, bot or weekend project.

Base URL

https://kundlidost-api-833851802975.asia-south1.run.app

This address is provisional. It is an auto-generated Cloud Run hostname, and it is tied to where the service happens to run today. A permanent api.kundlidost.in is being set up and will replace it on this page. Until then, keep the base URL in a single constant in your code rather than scattered through it, so the switch is a one-line change. We will not remove this host without saying so here first.

All responses are application/json. CORS is restricted to this site's origins, so call these from a server, a script, or a native app rather than from browser JavaScript on another domain.

Panchang, Choghadiya & Rahu Kaal

GET /api/panchang/public

Tithi, paksha, nakshatra, yoga, karana, sunrise, sunset, Rahu Kaal, Yamaganda, Gulika, Abhijit, and the full 16-slot Choghadiya table (8 day + 8 night) for any coordinates on Earth.

Parameters

NameTypeRequiredNotes
latnumberyes−90 to 90
lngnumberyes−180 to 180
datestringnoYYYY-MM-DD. Defaults to today in IST.

Example

curl "https://kundlidost-api-833851802975.asia-south1.run.app/api/panchang/public?lat=28.6139&lng=77.2090&date=2026-09-09"
{
  "date": "2026-09-09",
  "weekday": 3,
  "tithiIndex": 27,
  "tithiNumber": 13,
  "paksha": "krishna",
  "nakshatraIndex": 8,
  "nakshatra": "Ashlesha",
  "yogaIndex": 19,
  "karanaIndex": 5,
  "sunrise": "06:02",
  "sunset": "18:33",
  "rahuKaal":  { "start": "12:18", "end": "13:52" },
  "yamaganda": { "start": "07:36", "end": "09:10" },
  "gulika":    { "start": "10:44", "end": "12:18" },
  "abhijit":   { "start": "11:53", "end": "12:43" },
  "muhurat": {
    "date": "2026-09-09",
    "sunrise": "06:02",
    "sunset": "18:33",
    "day": [
      { "name": "labh",  "quality": "good",    "start": "06:02", "end": "07:36" },
      { "name": "amrit", "quality": "good",    "start": "07:36", "end": "09:10" },
      { "name": "kaal",  "quality": "bad",     "start": "09:10", "end": "10:44" },
      { "name": "shubh", "quality": "good",    "start": "10:44", "end": "12:18" },
      { "name": "rog",   "quality": "bad",     "start": "12:18", "end": "13:52" },
      { "name": "udveg", "quality": "bad",     "start": "13:52", "end": "15:26" },
      { "name": "char",  "quality": "neutral", "start": "15:26", "end": "16:59" },
      { "name": "labh",  "quality": "good",    "start": "16:59", "end": "18:33" }
    ],
    "night": [ "...8 more slots, sunset to next sunrise..." ],
    "abhijit": { "start": "11:53", "end": "12:43" }
  }
}

Every time is IST (UTC+5:30), as HH:mm on a 24-hour clock — not local time at the coordinates, and date is an IST calendar date too. The instants are correct for any point on Earth, but they are expressed on an Indian clock: ask for London on 21 June and sunrise comes back as 09:12, which is 04:42 BST. Convert on your side if your users are not in India. A slot whose end is smaller than its start has crossed midnight. Cached for one hour.

Daily horoscope

GET /api/horoscope/public/{rashiIndex}

Today's reading for one moon sign, in English or Hindi, with an upay, three ratings, and a lucky number and colour. Regenerated once a day and served from cache, so every caller gets the same text for the same day.

Parameters

NameTypeRequiredNotes
rashiIndexintegeryesPath segment, 0–11. See the sign table.
langstringnoen (default) or hi

Example

curl "https://kundlidost-api-833851802975.asia-south1.run.app/api/horoscope/public/0?lang=en"
{
  "date": "2026-09-09",
  "rashiIndex": 0,
  "rashi": "Mesha",
  "language": "en",
  "text": "The energy today calls for focus and steady progress, Mesha. ...",
  "upay": "Offer water to the rising Sun to cultivate clarity and inner strength.",
  "ratings": { "love": 3, "career": 2, "health": 3 },
  "luckyNumber": 9,
  "luckyColor": { "key": "silver", "hex": "#C0C4CE" }
}

Ratings are 1–5. text is generated by a language model from the day's planetary positions, so if you display it, tell your users it is computer-generated — the terms below ask this of you.

Kundli matching (36 guna)

POST /api/matching/public

Full Ashtakoota compatibility: the eight kootas with points scored and available, the total out of 36, a verdict, and the Nadi, Bhakoot and Mangal dosha flags. Two Swiss Ephemeris charts per call. Nothing is stored — the request body is the only place the birth details exist.

Request body

Two people, boy and girl, each with a name and a birth object:

FieldTypeRequiredNotes
namestringyes1–80 characters. Echoed back, not stored.
birth.datestringyesYYYY-MM-DD
birth.timestring or nullyesHH:mm, or null if unknown
birth.latnumberyes−90 to 90
birth.lngnumberyes−180 to 180
birth.placestringnoLabel only, max 200 characters
birth.utcOffsetMinutesintegerno−720 to 840. Inferred from the coordinates if omitted.

Example

curl -X POST "https://kundlidost-api-833851802975.asia-south1.run.app/api/matching/public" \
  -H "Content-Type: application/json" \
  -d '{
        "boy":  { "name": "Ravi",  "birth": { "date": "1995-04-12", "time": "07:30", "lat": 28.6139, "lng": 77.2090, "place": "Delhi" } },
        "girl": { "name": "Meera", "birth": { "date": "1997-11-03", "time": "14:15", "lat": 19.0760, "lng": 72.8777, "place": "Mumbai" } }
      }'
{
  "total": 24.5,
  "max": 36,
  "verdict": "average",
  "kootas": [
    { "key": "varna",       "got": 1,   "max": 1 },
    { "key": "vashya",      "got": 2,   "max": 2 },
    { "key": "tara",        "got": 1.5, "max": 3 },
    { "key": "yoni",        "got": 3,   "max": 4 },
    { "key": "grahaMaitri", "got": 5,   "max": 5 },
    { "key": "gana",        "got": 6,   "max": 6 },
    { "key": "bhakoot",     "got": 0,   "max": 7 },
    { "key": "nadi",        "got": 8,   "max": 8 }
  ],
  "nadiDosha": false,
  "bhakootDosha": true,
  "mangalCompatible": true,
  "boy":  { "name": "Ravi",  "rashi": "Kanya", "nakshatra": "Hasta" },
  "girl": { "name": "Meera", "rashi": "Meena", "nakshatra": "Revati" }
}

The numbers above are an illustration of the shape — run the call to get the real result for those dates. got can be fractional, because Tara koota awards half points. The eight key values and their maximums are fixed and always returned in the order shown.

Dosha check

POST /api/doshas/public

Sade Sati, Kaal Sarp and Mangal (Manglik) for one person, with the placement that causes each. Sade Sati depends on where Saturn is today, so unlike the other two it changes over time — the transit sign is returned so you can show why.

Request body

A single birth object, with the same fields as above minus utcOffsetMinutes:

{ "birth": { "date": "1995-04-12", "time": "07:30", "lat": 28.6139, "lng": 77.2090, "place": "Delhi" } }

Response

{
  "sadeSati": {
    "active": true,
    "phase": "peak",
    "dhaiya": false,
    "saturnRashiIndex": 11,
    "saturnRashi": "Meena",
    "moonRashiIndex": 11,
    "moonRashi": "Meena"
  },
  "kaalSarp": { "present": false, "typeIndex": null },
  "mangal":   { "manglik": true, "houses": [7] },
  "moonRashi": "Meena",
  "nakshatra": "Revati",
  "hadBirthTime": true
}
FieldMeaning
sadeSati.phaserising (Saturn in the 12th from the natal Moon), peak (1st), setting (2nd), or null when inactive
sadeSati.dhaiyaKantaka Shani, sometimes called "small panoti" — Saturn in the 4th or 8th from the Moon
kaalSarp.typeIndex0–11 by the house Rahu occupies (Anant through Sheshnag), or null when absent
mangal.housesHouses from the lagna where Mars sits and causes the dosha. Empty when not Manglik.
hadBirthTimefalse when you sent time: null. The Mangal test is house-based and shifts with the lagna, so treat the result as approximate.

The remedy steps are not in this response. They are the part of the product that funds it, and they live in the app.

Sign index

The moon sign index the horoscope endpoint takes, and that every endpoint returns.

#RashiWestern#RashiWestern
0MeshaAries6TulaLibra
1VrishabhaTaurus7VrishchikaScorpio
2MithunaGemini8DhanuSagittarius
3KarkaCancer9MakaraCapricorn
4SimhaLeo10KumbhaAquarius
5KanyaVirgo11MeenaPisces

Enumerated values

FieldValues
verdictexcellent (total 33 or more), veryGood (25–32.5), average (18–24.5), notRecommended (below 18)
muhurat[].nameamrit, shubh, labh, char, udveg, kaal, rog
muhurat[].qualitygood, neutral, bad
pakshashukla (waxing), krishna (waning)
weekday0 = Sunday, through 6 = Saturday

Rate limits

Per IP, with standard RateLimit-* response headers, so you can back off before you are refused.

EndpointLimitCached for
GET /api/panchang/public60 per minute1 hour
GET /api/horoscope/public/…unmetered30 minutes
POST /api/matching/public20 per minute, shared between the two5 minutes
POST /api/doshas/public5 minutes

The two POST endpoints draw on one budget, not 20 each — they are the expensive calls, one or two full ephemeris solves apiece rather than a cached lookup. If you need more than this, cache on your side: the panchang for a given date and place never changes, and neither does the horoscope for a given day and sign.

Errors

Every error is a JSON object with a single human-readable message:

{ "message": "lat must be a number between -90 and 90." }
StatusMeaning
400A parameter is missing, malformed, or out of range
422Well-formed, but no chart could be computed from those birth details
429Rate limited. Check RateLimit-Reset and retry after it.
5xxOur problem. Retry with backoff; if it persists, tell us.

Terms of use

Questions

Write to support@kundlidost.in. If you build something with this, we would like to see it.

These endpoints power the free tools on this site — try them in a browser first:

Kundli matching Dosha check Today's panchang