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. 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. 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. 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. 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 addresshttps://jodiac.in/v1
FormatHTTPS only. Requests and answers are JSON.
ZodiacSidereal, Lahiri ayanamsa. Whole sign houses.
CalculationJPL DE440 ephemeris. Years 1900 to 2100.
Live keyjd_live_... gives real answers and uses credits.
Sandbox keyjd_test_... gives stored samples and is free.
Request idEvery 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.

FieldNeededWhat to send
dateYesYYYY-MM-DD, 1900 to 2100
timeYesHH:MM or HH:MM:SS, 24 hour, local time at the place
latitudeYes-90 to 90
longitudeYes-180 to 180
timezoneYesIANA name, for example Asia/Kolkata
genderNomale or female. Chart call only.
is_dstNoOnly 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. Send is_dst: true for the first occurrence or false for the second.

Endpoints

CallCreditsWhat you get
POST /v1/chart2The full birth chart
POST /v1/dasha1Vimshottari dashas
POST /v1/yogas1Yogas in the chart
POST /v1/divisional/{division}1One divisional chart
POST /v1/panchang1Panchang for a date and place
POST /v1/match3Compatibility of two charts
POST /v1/ashtakavarga
POST /v1/shadbala
2 eachStrength calculations (beta)
POST /v1/reportsWalletA full PDF report

Sky and places calls are in the full reference and on the Developers page, where you can try them.

Birth chart

POST/v1/chart2 credits

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_utc
  • planets
  • houses
  • dashas (Vimshottari with antar dashas)
  • current_dasha
  • yogas
  • mangal_dosha
  • kaal_sarpa_dosha
  • sade_sati
  • panchang
  • divisional_charts (D1 and D9)

Dasha, yogas and divisional charts

1 credit each

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

POST/v1/panchang1 credit

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

POST/v1/match3 credits

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)

POST/v1/ashtakavarga POST/v1/shadbala2 credits each

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):

  • sthana
  • dig
  • kala
  • cheshta
  • naisargika
  • drishti (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 conventions object 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:

HeaderExampleMeaning
X-RateLimit-Limit60Requests allowed per minute
X-RateLimit-Remaining59Requests left in this minute
X-RateLimit-Reset41Seconds until the minute window ends
X-Credits-Limit100000Credits in this period
X-Credits-Used2Credits used so far
X-Credits-Remaining99998Credits 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.

  1. Top up the wallet in the portal.
  2. Send POST /v1/reports with an Idempotency-Key header. You get 202 and an id.
  3. Ask GET /v1/reports/{id} until status is done.
  4. Use the download link. 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}]}'
FieldValues
typechart (one person), match (two people, compatibility) or full (both charts and compatibility)
languageen or hi
webhook_urlOptional. https only. Called when the report is ready.
More about reports
  • Idempotency-Key is 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 t is more than five minutes old.
  • The same event can arrive twice. Use id to 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":"..."}}
StatusCodeMeaning
401invalid_keyKey missing, mistyped or revoked
402no_active_planThe account has no paid period right now
402credits_exhaustedAll credits for this period are used
402spend_cap_reachedYou switched on extra use and the spend cap for this period is reached
402insufficient_walletThe wallet cannot pay for this report; top up in the portal
409idempotency_conflictThat Idempotency-Key was used for a different report
403account_suspendedThe account is not active
403key_not_allowedA sandbox key cannot call this endpoint
413 / 411body_too_large / length_requiredBody over 16 KB, or no Content-Length
422validation_errorAn input is not valid; details lists the fields
422sandbox_sample_onlyA sandbox key was used with an input that is not a sample
429rate_limitedToo many requests this minute; wait Retry-After seconds
503service_unavailableTemporary 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:

CallSample input
Chart, dasha, yogas, divisional1990-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.
Panchang2026-01-01, latitude 28.6139, longitude 77.209, Asia/Kolkata
Matchgroom = the first chart sample, bride = the second
Sky callsAny 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-ID when you write to us about a call.