API guide
Use the Jodiac API
Get a key, make one call, read the answer. The rest is below when you need it. Every field is listed in the full reference.
Quick start
1. Get a free sandbox key
Sign up on the account page, open API keys and create a sandbox key. It starts with
jd_test_, costs nothing and answers the sample inputs on this page.2. Make a call
Paste this into a terminal. Put your key in place of
jd_test_YOUR_KEY.curl https://jodiac.in/v1/chart \ -H "Authorization: Bearer jd_test_YOUR_KEY" \ -H "Content-Type: application/json" \ -d '{"date":"1990-05-15","time":"04:00","latitude":19.076, "longitude":72.8777,"timezone":"Asia/Kolkata"}'The same call in Python and JavaScript
import requests r = requests.post( "https://jodiac.in/v1/chart", headers={"Authorization": "Bearer jd_test_YOUR_KEY"}, json={"date": "1990-05-15", "time": "04:00", "latitude": 19.076, "longitude": 72.8777, "timezone": "Asia/Kolkata"}, ) print(r.json()["current_dasha"])const url = "https://jodiac.in/v1/chart"; const r = await fetch(url, { method: "POST", headers: { "Authorization": "Bearer jd_test_YOUR_KEY", "Content-Type": "application/json" }, body: JSON.stringify({ date: "1990-05-15", time: "04:00", latitude: 19.076, longitude: 72.8777, timezone: "Asia/Kolkata" }), }); console.log((await r.json()).current_dasha);3. Read the answer
You get JSON with the planets, houses, dashas, yogas and more. A sandbox answer is a stored sample and says
"sandbox": true.4. Go live
Choose a plan on the pricing page, create a key that starts with
jd_live_and use it instead. Live calls use credits.
Keys and basics
| Base address | https://jodiac.in/v1 |
|---|---|
| Format | HTTPS only. Requests and answers are JSON. |
| Zodiac | Sidereal, Lahiri ayanamsa. Whole sign houses. |
| Calculation | JPL DE440 ephemeris. Years 1900 to 2100. |
| Live key | jd_live_... gives real answers and uses credits. |
| Sandbox key | jd_test_... gives stored samples and is free. |
| Request id | Every answer has an X-Request-ID header. Quote it if you ask us about a call. |
Send the key in either header:
Authorization: Bearer jd_live_YOUR_KEY X-API-Key: jd_live_YOUR_KEY
Create and revoke keys on the account page. A key is shown once, when you create it. Keep it on your server, never in a web page or an app.
Birth details
Most calls take the same birth fields. Unknown fields are refused.
| Field | Needed | What to send |
|---|---|---|
| date | Yes | YYYY-MM-DD, 1900 to 2100 |
| time | Yes | HH:MM or HH:MM:SS, 24 hour, local time at the place |
| latitude | Yes | -90 to 90 |
| longitude | Yes | -180 to 180 |
| timezone | Yes | IANA name, for example Asia/Kolkata |
| gender | No | male or female. Chart call only. |
| is_dst | No | Only for a local time that happens twice. See below. |
No coordinates? Use places search to get them and the time zone from a city name.
Local times that do not exist or happen twice
When clocks go forward, some local times do not exist. When they go back, some happen twice. We never guess.
- A time that does not exist gives
422 nonexistent_local_time. - A time that happens twice gives
422 ambiguous_local_time. Sendis_dst: truefor the first occurrence orfalsefor the second.
Endpoints
| Call | Credits | What you get |
|---|---|---|
| POST /v1/chart | 2 | The full birth chart |
| POST /v1/dasha | 1 | Vimshottari dashas |
| POST /v1/yogas | 1 | Yogas in the chart |
| POST /v1/divisional/{division} | 1 | One divisional chart |
| POST /v1/panchang | 1 | Panchang for a date and place |
| POST /v1/match | 3 | Compatibility of two charts |
| POST /v1/ashtakavarga POST /v1/shadbala | 2 each | Strength calculations (beta) |
| POST /v1/reports | Wallet | A full PDF report |
Sky and places calls are in the full reference and on the Developers page, where you can try them.
Birth chart
Send the birth details.
curl https://jodiac.in/v1/chart \
-H "Authorization: Bearer jd_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"date":"1990-05-15","time":"04:00","latitude":19.076,
"longitude":72.8777,"timezone":"Asia/Kolkata"}'
The answer holds:
birth_utcplanetshousesdashas(Vimshottari with antar dashas)current_dashayogasmangal_doshakaal_sarpa_doshasade_satipanchangdivisional_charts(D1 and D9)
Dasha, yogas and divisional charts
Three smaller calls for when you do not need the whole chart. Each takes the birth details without gender and costs 1 credit.
POST /v1/dasha: all nine mahadashas with their antardashas, and the periods running now. Times are UTC.POST /v1/yogas: every yoga the rule set checks, how it is formed in this chart, and whether it is full, cancelled or reversed.POST /v1/divisional/{division}: one divisional chart.
{division} is one of D1, D2, D3, D4, D7, D9, D10, D12, D16, D20, D24, D27, D30, D40, D45, D60. Use a capital D.
curl https://jodiac.in/v1/divisional/D9 \
-H "Authorization: Bearer jd_live_YOUR_KEY" -H "Content-Type: application/json" \
-d '{"date":"1990-05-15","time":"04:00","latitude":19.076,"longitude":72.8777,"timezone":"Asia/Kolkata"}'
Panchang
Send date, latitude, longitude and timezone. No time is needed.
It is read at local sunrise, or at local noon where the sun does not rise. Times are local to the place.
curl https://jodiac.in/v1/panchang \
-H "Authorization: Bearer jd_live_YOUR_KEY" -H "Content-Type: application/json" \
-d '{"date":"2026-01-01","latitude":28.6139,"longitude":77.209,"timezone":"Asia/Kolkata"}'
{"date":"2026-01-01","weekday":"Wednesday","read_at":"sunrise",
"tithi":{"number":13,"name":"Trayodashi","paksha":"Shukla","remaining":17.69},
"nakshatra":{"number":4,"name":"Rohini","pada":2},
"sunrise":"07:13:53","sunset":"17:35:27","rahu_kalam":{"start":"13:42","end":"15:00"}, ...}
Compatibility
Send two sets of birth details, groom and bride.
{"groom":{"date":"1990-05-15","time":"04:00","latitude":19.076,"longitude":72.8777,"timezone":"Asia/Kolkata"},
"bride":{"date":"1992-03-10","time":"08:30","latitude":28.6139,"longitude":77.209,"timezone":"Asia/Kolkata"}}
The answer has total (points out of 36), compatibility_level, recommendation, the eight gunas, doshas with remedies, and detailed_analysis.
Ashtakavarga and Shadbala (beta)
The input is exactly that of /v1/chart.
Both are beta. Every answer carries "status": "beta", "ruleset": "bphs-calibrated-1" and a conventions object. It lists each reading we chose where the classical books leave a point open, and where we know the answer differs from our two reference charts.
The zodiac is sidereal (Lahiri) with whole signs. Rahu and Ketu give no points and have no Shadbala.
curl https://jodiac.in/v1/shadbala \
-H "Authorization: Bearer jd_live_YOUR_KEY" -H "Content-Type: application/json" \
-d '{"date":"1990-05-15","time":"04:00","latitude":19.076,"longitude":72.8777,"timezone":"Asia/Kolkata"}'
What Ashtakavarga returns
- The eight Bhinnashtakavarga charts (seven planets and the ascendant) as 12 numbers each, from Aries to Pisces.
- The Sarvashtakavarga: the seven planet charts added. The total is always 337.
- The Trikona and Ekadhipatya reductions and the pindas, as in Brihat Parashara Hora Shastra, chapters 66 to 69.
Signs with 28 or more bindus are usually called strong and 25 or fewer weak. These are traditional reading aids, not predictions.
What Shadbala returns
The six-fold strength of the seven planets Sun to Saturn, in virupas (60 virupas = 1 rupa):
sthanadigkalacheshtanaisargikadrishti(can be negative)
Also total_rupas, required_rupas, ratio (total divided by the minimum), strong (ratio at least 1), rank (by ratio, 1 is strongest) and the Ishta and Kashta phala. bhava_bala gives the strength of the twelve houses and is experimental.
Read before you rely on the numbers
- We compared both calls with two reference charts and with the worked example of a textbook. Ashtakavarga matches seven of the eight charts of each reference chart. Shadbala planet totals are within about 0.07 rupa. Several choices rest on those two charts only; the
conventionsobject says which. - The Moon's motional strength (Cheshta) follows a rule that matches both reference charts but is not the classical one. It can be unusually high just after New Moon. It feeds the Moon's total, ratio, rank and the strength of the Cancer house.
- Bhava Bala totals can be off by up to half a rupa for some houses. The ascendant's own Ashtakavarga chart differs in two entries from the reference charts.
- For reflection and study, not for decisions about health, money or law.
Sandbox keys answer for the two sample births of /v1/chart only, with "sandbox": true.
Credits and limits
Each plan has credits per period and requests per minute. See pricing. Every answer shows where you stand:
| Header | Example | Meaning |
|---|---|---|
| X-RateLimit-Limit | 60 | Requests allowed per minute |
| X-RateLimit-Remaining | 59 | Requests left in this minute |
| X-RateLimit-Reset | 41 | Seconds until the minute window ends |
| X-Credits-Limit | 100000 | Credits in this period |
| X-Credits-Used | 2 | Credits used so far |
| X-Credits-Remaining | 99998 | Credits left |
- Calls that fail cost no credits.
- The per-minute limit is counted per account, not per key.
PDF reports (prepaid wallet)
Reports are paid from a prepaid wallet that you top up in the portal. They use no plan credits.
- Top up the wallet in the portal.
- Send
POST /v1/reportswith anIdempotency-Keyheader. You get202and anid. - Ask
GET /v1/reports/{id}untilstatusisdone. - Use the
downloadlink. It works for five minutes; ask again for a fresh one. The file stays available for 30 days.
curl -X POST https://jodiac.in/v1/reports \
-H "Authorization: Bearer $JODIAC_KEY" -H "Content-Type: application/json" \
-H "Idempotency-Key: order-2026-0001" \
-d '{"type":"chart","language":"en","people":[{"name":"Asha","date":"1990-05-15","time":"04:00","timezone":"Asia/Kolkata","latitude":19.076,"longitude":72.8777}]}'
| Field | Values |
|---|---|
| type | chart (one person), match (two people, compatibility) or full (both charts and compatibility) |
| language | en or hi |
| webhook_url | Optional. https only. Called when the report is ready. |
More about reports
Idempotency-Keyis 8 to 80 letters, digits, - or _. If a request is repeated with the same key and content, you get the same order back and are charged once.- If a report cannot be made, its price goes back into the wallet and the status says
failed. - Birth details are deleted from our system as soon as the report is finished.
- A wallet that is too low gives
402 insufficient_wallet. - A sandbox key returns a stored sample order and touches no money.
Webhooks
Add a web address under Webhooks in the portal. We call it when something happens to your account.
Events include plan.renewed, payment.failed, credits.80, credits.100, spend.cap_reached, invoice.issued and report.completed.
Your address
- It must be https, on a public host name, port 443 or 8443.
- We do not follow redirects and do not read your answer. Any 2xx answer means received.
- If it fails we try again after 1 minute, 5 minutes, 30 minutes, 2 hours, 6 hours and 24 hours.
What we send
{"id":"evt_1042","type":"plan.renewed","created":"2026-12-10T00:00:07Z","data":{"plan":"developer","period_end":"2027-01-10T00:00:00+00:00"}}
Check the signature
Every call has a header Jodiac-Signature: t=1700000000,v1=.... The value v1 is the hex HMAC-SHA256 of "{t}." + raw body, made with your secret.
- Refuse messages whose
tis more than five minutes old. - The same event can arrive twice. Use
idto ignore repeats.
import hmac, hashlib, time
def valid(secret, header, raw_body):
parts = dict(p.split("=", 1) for p in header.split(","))
if abs(time.time() - int(parts["t"])) > 300: return False
expected = hmac.new(secret.encode(), parts["t"].encode() + b"." + raw_body, hashlib.sha256).hexdigest()
return hmac.compare_digest(expected, parts["v1"])
Errors
Errors always look like this:
{"error":{"code":"credits_exhausted","message":"...","request_id":"..."}}
| Status | Code | Meaning |
|---|---|---|
| 401 | invalid_key | Key missing, mistyped or revoked |
| 402 | no_active_plan | The account has no paid period right now |
| 402 | credits_exhausted | All credits for this period are used |
| 402 | spend_cap_reached | You switched on extra use and the spend cap for this period is reached |
| 402 | insufficient_wallet | The wallet cannot pay for this report; top up in the portal |
| 409 | idempotency_conflict | That Idempotency-Key was used for a different report |
| 403 | account_suspended | The account is not active |
| 403 | key_not_allowed | A sandbox key cannot call this endpoint |
| 413 / 411 | body_too_large / length_required | Body over 16 KB, or no Content-Length |
| 422 | validation_error | An input is not valid; details lists the fields |
| 422 | sandbox_sample_only | A sandbox key was used with an input that is not a sample |
| 429 | rate_limited | Too many requests this minute; wait Retry-After seconds |
| 503 | service_unavailable | Temporary problem on our side; retry after a few seconds |
Retry 503 and 429 after the wait we send. Do not retry other 4xx errors without changing the call.
Sandbox
A sandbox key (jd_test_...) always returns the same stored answer with "sandbox": true. It costs nothing and allows 30 requests a minute. It answers only for these samples:
| Call | Sample input |
|---|---|
| Chart, dasha, yogas, divisional | 1990-05-15 04:00, latitude 19.076, longitude 72.8777, Asia/Kolkata. Or 1992-03-10 08:30, latitude 28.6139, longitude 77.209, Asia/Kolkata. Any division. |
| Panchang | 2026-01-01, latitude 28.6139, longitude 77.209, Asia/Kolkata |
| Match | groom = the first chart sample, bride = the second |
| Sky calls | Any parameters. The answer is a stored sky for 2026-01-01 00:00 UTC. City search gives real answers. |
Good practice
- Cache answers on your side. A birth chart for the same input never changes.
- Birth details are sent in the request body, are used only to answer the call, and are not stored or logged by us.
- Quote the
X-Request-IDwhen you write to us about a call.