Kundli
{error &&{error}
} {candidates.map((c) => ())} {result && (
Lagna: {result.lagna.sign_label}
| Planet | Sign | House |
|---|---|---|
| {p.label}{p.retrograde ? " (R)" : ""} | {p.sign} | {p.house ?? "–"} |
# AstroLogics API: the full docs > Every docs page of https://developers.astrologics.in, in order. The index with links is https://developers.astrologics.in/llms.txt; the API contract is https://developers.astrologics.in/reference/openapi.yaml. # Quickstart Source: https://developers.astrologics.in/docs/quickstart ## 1. Get a test key [Create a free account](/auth/sign-up), open [API keys](/dashboard/keys) and create a **test** key. It starts with `al_test_`. Copy it when it is shown: we keep only a hash, so it is shown once. Test keys run the real engine and are never charged. Each project has a daily allowance of test calls ([rate limits](/docs/rate-limits)). ## 2. Make your first call This asks for the kundli of someone born in New Delhi on 13 August 1990 at 06:30. Replace `al_test_YOUR_KEY` with your key. ### curl
curl -X POST 'https://api.astrologics.in/v1/kundli' \
-H 'Authorization: Bearer al_test_YOUR_KEY' \
-H 'Content-Type: application/json' \
-d '{"birth":{"date":"1990-08-13","time":"06:30","place":{"latitude":28.6139,"longitude":77.209}}}'
### Node.js 18 or later
Save as `first-call.mjs` and run `node first-call.mjs`.
const res = await fetch("https://api.astrologics.in/v1/kundli", {
method: "POST",
headers: { Authorization: "Bearer al_test_YOUR_KEY", "Content-Type": "application/json" },
body: JSON.stringify({
"birth": {
"date": "1990-08-13",
"time": "06:30",
"place": {
"latitude": 28.6139,
"longitude": 77.209
}
}
}),
});
console.log(JSON.stringify(await res.json(), null, 2));
### Python 3
Save as `first-call.py` and run `python3 first-call.py`.
import json
import urllib.error
import urllib.request
body = {
"birth": {
"date": "1990-08-13",
"time": "06:30",
"place": {
"latitude": 28.6139,
"longitude": 77.209,
},
},
}
req = urllib.request.Request(
"https://api.astrologics.in/v1/kundli",
method="POST",
headers={"Authorization": "Bearer al_test_YOUR_KEY", "Content-Type": "application/json"},
data=json.dumps(body).encode(),
)
try:
with urllib.request.urlopen(req) as res:
print(json.dumps(json.load(res), indent=2, ensure_ascii=False))
except urllib.error.HTTPError as err:
print(err.code, err.read().decode())
### PHP with the curl extension
Save as `first-call.php` and run `php first-call.php`.
<?php
$ch = curl_init('https://api.astrologics.in/v1/kundli');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_HTTPHEADER => ['Authorization: Bearer al_test_YOUR_KEY', 'Content-Type: application/json'],
CURLOPT_POSTFIELDS => '{"birth":{"date":"1990-08-13","time":"06:30","place":{"latitude":28.6139,"longitude":77.209}}}',
CURLOPT_RETURNTRANSFER => true,
]);
echo curl_exec($ch), PHP_EOL;
## 3. Read the response
Every JSON response has the same envelope:
- `data`: the result.
- `meta`: `request_id` (quote it when you write to us), `engine_version` (it changes whenever a calculation changes), `mode` (`test` or `live`) and `credits_charged`.
- `warnings`: anything you should know, such as fields left out because the birth time is unknown.
Errors have one shape too: see [errors](/docs/errors).
## 4. Go live
Create a **live** key when you are ready. Live keys spend your plan's credits, and only successful (2xx) calls are charged. Keep test and live keys on your server: never put them in a web page or a mobile app. For widgets, use a [publishable key](/docs/authentication#publishable-keys).
Next: [the birth object](/docs/birth-input) · [API reference](/reference)
Prefer a client library? See the quickstarts for [TypeScript](/docs/quickstart-typescript), [Python](/docs/quickstart-python) and [PHP](/docs/quickstart-php).
# TypeScript quickstart
Source: https://developers.astrologics.in/docs/quickstart-typescript
You need Node.js 18 or later. The client has no dependencies and comes with type declarations for every operation.
## 1. Install
The client is not on npm yet, so install this release from our site:
```bash
npm install https://developers.astrologics.in/downloads/sdks/astrologics-typescript-0.1.0.tgz
```
## 2. Set your key
[Create a test key](/dashboard/keys). Test keys run the real engine and are never charged.
```bash
export ASTROLOGICS_API_KEY=al_test_YOUR_KEY
```
Use a secret key only on a server, never in a web page or a [mobile app](/docs/mobile-apps).
## 3. Make your first call
Save as `first-call.mjs` and run `node first-call.mjs`.
```js
import { AstroLogics } from "astrologics";
const client = new AstroLogics({ apiKey: process.env.ASTROLOGICS_API_KEY });
const { data, meta } = await client.getKundli({
birth: { date: "1990-08-13", time: "06:30", place: { latitude: 28.6139, longitude: 77.209 } },
});
console.log(data.lagna.sign, meta.mode, meta.credits_charged);
```
It prints the lagna's sign, then `test 0`: the call ran in test mode and cost no credits. A place can also be a `place_id` or free text; see [the birth object](/docs/birth-input).
## 4. Save a chart
Save as `save-chart.mjs`. An SVG operation returns a string, and a PNG or PDF operation returns a `Uint8Array`.
```js
import { writeFile } from "node:fs/promises";
import { AstroLogics } from "astrologics";
const client = new AstroLogics({ apiKey: process.env.ASTROLOGICS_API_KEY });
const svg = await client.getChartSvg({
varga: "D1",
birth: { date: "1990-08-13", time: "06:30", place: { latitude: 28.6139, longitude: 77.209 } },
});
await writeFile("chart.svg", svg);
```
## 5. Handle errors
Save as `handle-errors.mjs`. Any failed call throws an `ApiError`. Branch on `code`, not on the message, and quote `requestId` when you write to us. See [errors](/docs/errors).
```js
import { AstroLogics, ApiError } from "astrologics";
const client = new AstroLogics({ apiKey: process.env.ASTROLOGICS_API_KEY });
try {
await client.getKundli({ birth: { date: "1990-13-45" } });
} catch (e) {
if (!(e instanceof ApiError)) throw e;
console.log(e.status, e.code, e.requestId);
for (const issue of e.issues) console.log(issue.param, issue.message);
}
```
`ApiError` also carries `candidates` for an ambiguous place and `suggestions` for an unknown path.
## Retries and timeouts
`429` and `5xx` answers are retried twice by default, honouring `Retry-After`. `quota_exhausted` is not retried. To change this, pass `maxRetries` and `timeoutMs` (default 60000) to the constructor.
## Find a method
Each method is named after the operation's id in the [API reference](/reference), and its arguments are the operation's parameters and body, side by side. There is one method per public operation: 133 today.
## Go live
Swap in a live key (`al_live_`) when you are ready. Live keys spend your plan's credits, and only successful calls are charged.
Next: [SDKs](/products/sdks) · [Next.js tutorial](/docs/tutorial-nextjs) · [Python](/docs/quickstart-python) · [PHP](/docs/quickstart-php)
# Python quickstart
Source: https://developers.astrologics.in/docs/quickstart-python
You need Python 3.8 or later. The client has no dependencies.
## 1. Install
The client is not on PyPI yet, so install this release from our site:
```bash
pip install https://developers.astrologics.in/downloads/sdks/astrologics-python-0.1.0.tar.gz
```
## 2. Set your key
[Create a test key](/dashboard/keys). Test keys run the real engine and are never charged.
```bash
export ASTROLOGICS_API_KEY=al_test_YOUR_KEY
```
Use a secret key only on a server, never in a web page or a [mobile app](/docs/mobile-apps).
## 3. Make your first call
Save as `first_call.py` and run `python3 first_call.py`.
```python
import os
from astrologics import AstroLogics
client = AstroLogics(api_key=os.environ["ASTROLOGICS_API_KEY"])
result = client.get_kundli(birth={"date": "1990-08-13", "time": "06:30", "place": {"latitude": 28.6139, "longitude": 77.209}})
print(result["data"]["lagna"]["sign"], result["meta"]["mode"], result["meta"]["credits_charged"])
```
It prints the lagna's sign, then `test 0`: the call ran in test mode and cost no credits. A place can also be a `place_id` or free text; see [the birth object](/docs/birth-input).
## 4. Save a chart
Save as `save_chart.py`. An SVG operation returns a string, and a PNG or PDF operation returns `bytes`.
```python
import os
from astrologics import AstroLogics
client = AstroLogics(api_key=os.environ["ASTROLOGICS_API_KEY"])
svg = client.get_chart_svg(varga="D1", birth={"date": "1990-08-13", "time": "06:30", "place": {"latitude": 28.6139, "longitude": 77.209}})
with open("chart.svg", "w", encoding="utf-8") as f:
f.write(svg)
```
## 5. Handle errors
Save as `handle_errors.py`. Any failed call raises an `ApiError`. Branch on `code`, not on the message, and quote `request_id` when you write to us. See [errors](/docs/errors).
```python
import os
from astrologics import ApiError, AstroLogics
client = AstroLogics(api_key=os.environ["ASTROLOGICS_API_KEY"])
try:
client.get_kundli(birth={"date": "1990-13-45"})
except ApiError as e:
print(e.status, e.code, e.request_id)
for issue in e.issues:
print(issue["param"], issue["message"])
```
`ApiError` also carries `candidates` for an ambiguous place and `suggestions` for an unknown path.
## Retries and timeouts
`429` and `5xx` answers are retried twice by default, honouring `Retry-After`. `quota_exhausted` is not retried. To change this, pass `max_retries` and `timeout` (in seconds, default 60) to the constructor.
## Find a method
Each method is the operation's id from the [API reference](/reference) in snake case, so `getKundli` is `get_kundli`. Its keyword arguments are the operation's parameters and body, side by side. There is one method per public operation: 133 today.
## Go live
Swap in a live key (`al_live_`) when you are ready. Live keys spend your plan's credits, and only successful calls are charged.
Next: [SDKs](/products/sdks) · [TypeScript](/docs/quickstart-typescript) · [PHP](/docs/quickstart-php)
# PHP quickstart
Source: https://developers.astrologics.in/docs/quickstart-php
You need PHP 8.0 or later with the curl and json extensions. The client has no other dependencies.
## 1. Install
The client is not on Packagist yet, so download this release from our site and unpack it beside your code:
```bash
curl -L https://developers.astrologics.in/downloads/sdks/astrologics-php-0.1.0.tar.gz | tar -xz
```
This creates the folder `astrologics-php-0.1.0`.
## 2. Set your key
[Create a test key](/dashboard/keys). Test keys run the real engine and are never charged.
```bash
export ASTROLOGICS_API_KEY=al_test_YOUR_KEY
```
Use a secret key only on a server, never in a web page or a [mobile app](/docs/mobile-apps).
## 3. Make your first call
Save as `first-call.php` and run `php first-call.php`.
```php
getKundli(['birth' => ['date' => '1990-08-13', 'time' => '06:30', 'place' => ['latitude' => 28.6139, 'longitude' => 77.209]]]);
echo $result['data']['lagna']['sign'], ' ', $result['meta']['mode'], ' ', $result['meta']['credits_charged'], "\n";
```
It prints the lagna's sign, then `test 0`: the call ran in test mode and cost no credits. A place can also be a `place_id` or free text; see [the birth object](/docs/birth-input).
## 4. Save a chart
Save as `save-chart.php`. An SVG, PNG or PDF operation returns a string holding the file's content.
```php
getChartSvg(['varga' => 'D1', 'birth' => ['date' => '1990-08-13', 'time' => '06:30', 'place' => ['latitude' => 28.6139, 'longitude' => 77.209]]]);
file_put_contents('chart.svg', $svg);
```
## 5. Handle errors
Save as `handle-errors.php`. Any failed call throws an `ApiError`. Branch on `errorCode`, not on the message, and quote `requestId` when you write to us. See [errors](/docs/errors).
```php
getKundli(['birth' => ['date' => '1990-13-45']]);
} catch (\AstroLogics\ApiError $e) {
echo $e->status, ' ', $e->errorCode, ' ', $e->requestId, "\n";
foreach ($e->issues as $issue) {
echo $issue['param'], ' ', $issue['message'], "\n";
}
}
```
`ApiError` also carries `candidates` for an ambiguous place and `suggestions` for an unknown path.
## Retries and timeouts
`429` and `5xx` answers are retried twice by default, honouring `Retry-After`. `quota_exhausted` is not retried. To change this, pass `$maxRetries` and `$timeout` (in seconds, default 60) to the constructor, after `$baseUrl`.
## Find a method
Each method is named after the operation's id in the [API reference](/reference). It takes one array holding the operation's parameters and body, side by side. There is one method per public operation: 133 today.
## Go live
Swap in a live key (`al_live_`) when you are ready. Live keys spend your plan's credits, and only successful calls are charged.
Next: [SDKs](/products/sdks) · [TypeScript](/docs/quickstart-typescript) · [Python](/docs/quickstart-python)
# Next.js tutorial
Source: https://developers.astrologics.in/docs/tutorial-nextjs
You will build a page that takes a birth date, time and place, and shows the lagna, the planets and a chart image. The browser talks only to your own route, and the route holds the API key.
You need Node.js 20 or later and a [test key](/dashboard/keys). Test keys run the real engine and are never charged.
## 1. Create the app
```bash
npx create-next-app@latest kundli-demo --ts --app --no-tailwind --no-eslint --no-src-dir --yes
```
```bash
cd kundli-demo
```
## 2. Install the client
```bash
npm install https://developers.astrologics.in/downloads/sdks/astrologics-typescript-0.1.0.tgz
```
## 3. Keep the key on the server
Create `.env.local`. `create-next-app` already keeps `.env*` files out of git.
```bash
ASTROLOGICS_API_KEY=al_test_YOUR_KEY
```
Do not give this variable a `NEXT_PUBLIC_` prefix. That prefix sends a value to the browser, and a secret key must never reach it.
## 4. Add the route
Create `app/api/kundli/route.ts`. Birth details travel in the POST body, never in a URL.
```ts
import { AstroLogics, ApiError } from "astrologics";
export async function POST(request: Request) {
const { date, time, place, placeId } = await request.json().catch(() => ({}));
const birth = { date, time, place: placeId ? { place_id: placeId } : { query: place } };
const client = new AstroLogics({ apiKey: process.env.ASTROLOGICS_API_KEY! });
try {
const [kundli, chart] = await Promise.all([
client.getKundli({ birth }),
client.getChartSvg({ varga: "D1", birth }),
]);
return Response.json({ lagna: kundli.data.lagna, planets: kundli.data.planets, chart });
} catch (e) {
if (!(e instanceof ApiError)) throw e;
if (e.status === 400 || e.status === 422) {
return Response.json({ error: e.message, candidates: e.candidates }, { status: 422 });
}
console.error(e.code, e.requestId);
return Response.json({ error: "The chart could not be calculated. Try again." }, { status: 502 });
}
}
```
The route makes two calls: POST /v1/kundli (2 credits) and POST /v1/charts/{varga}.svg (2 credits). When a place name matches more than one place, the API answers `place_ambiguous` with `candidates`. It never guesses, so the page asks the user to choose.
## 5. Add the page
Replace `app/page.tsx`. The chart goes in an `{error}
} {candidates.map((c) => ())} {result && (
| Planet | Sign | House |
|---|---|---|
| {p.label}{p.retrograde ? " (R)" : ""} | {p.sign} | {p.house ?? "–"} |
POST /v1/kundli (2 credits) and POST /v1/charts/{varga}.png (3 credits). Start it with your key:
```bash
ASTROLOGICS_API_KEY=al_test_YOUR_KEY node server.mjs
```
## 2. Create the app
In another terminal:
```bash
flutter create kundli_app
```
```bash
cd kundli_app
```
```bash
flutter pub add http
```
## 3. Call the backend
Create `lib/kundli_api.dart`.
```dart
import 'dart:convert';
import 'dart:typed_data';
import 'package:http/http.dart' as http;
class Planet {
Planet(this.label, this.sign, this.house, this.retrograde);
factory Planet.fromJson(MapGET /v1/meta/conventions.
## Key kinds
| Kind | Starts with | What it does |
|---|---|---|
| Test | `al_test_` | Real engine, never charged; `meta.mode` is `test`. Each project has a daily allowance of test calls, shared by all its test keys. |
| Live | `al_live_` | Spends your plan's credits. Only successful (2xx) calls are charged. |
| Publishable | `al_pub_` | For widgets in the browser: read-only operations without birth data, and only from the web origins you list. |
Test and live keys are **secret**. Use them only from your server, never in a web page or a mobile app.
## Publishable keys
A publishable key can call only these operations:
GET /v1/planets/now The sky now: sidereal positions at the top of the current hourGET /v1/outer-planets/cycle The retrograde cycle of Saturn, Uranus, Neptune or Pluto: its stations and whether it is retrograde nowGET /v1/panchang Panchang for a date and placeGET /v1/panchang/choghadiya Day and night choghadiyaGET /v1/muhurat/activities Supported muhurat activitiesGET /v1/muhurat/day One day judged for an activity: the panchang, the verdict, the windows left after Rahu Kaal, Yamaganda and GulikaGET /v1/muhurat/{occasion}/year The dated muhurat list of a year for an occasion: the days that hold a window, with the windowsGET /v1/muhurat/{occasion} Every local day between two dates for an occasion: available with its windows, or the reason it is notGET /v1/panchang/hora Hora: the 24 planetary hours of a dayGET /v1/calendar/tithis Tithi start and end moments between two dates, and the tithi at each sunriseGET /v1/calendar/ekadashi Every Ekadashi of a year: the vrat date, the tithi and the paran windowGET /v1/calendar/festivals Festivals of a year, each by its own rule, with its windows and momentsGET /v1/horoscope/{sign} Horoscope for one signGET /v1/horoscope All 12 signs (publisher feed)GET /v1/transits/events Planetary events: sign changes, retrograde stations and eclipses, with IST timesGET /v1/transits Ingresses, stations and combustion between datesGET /v1/transits/graha-yuddha Graha yuddha (planetary war) now: Mercury, Venus, Mars, Jupiter and Saturn within 1.5°GET /v1/horoscope/weekly/rashi-tones The week's tone for each rashi: a 0–100 score per day, the band, the best and worst days and the planet behind itGET /v1/kp/ruling-planets The seven KP ruling planets at a moment and placeGET /v1/kp/horary KP horary (prashna) for a number from 1 to 249GET /v1/vastu/reference The 32 padas with their door effects and verses, the 45 devatas, the room rules and the score's weightsdate string (date) required
e.g. "1990-08-13"
time string
pattern ^([01]\d|2[0-3]):[0-5]\d(:[0-5]\d)?$ · e.g. "06:30"
time_accuracy string
With "unknown", lagna- and house-dependent fields are omitted and listed in warnings — never filled with a noon default.
one of exact, approximate, unknown · default "exact"
place Coordinates or object or object required
Coordinates, a place_id from /v1/places/search, or a free-text query. A vague query returns 422 place_ambiguous with candidates; the API never guesses.
One of:
latitude number required
≥ -90 · ≤ 90
longitude number required
≥ -180 · ≤ 180
No other fields are accepted.
place_id string required
No other fields are accepted.
query string required
at least 2 characters · at most 120 characters
No other fields are accepted.
timezone string
"auto" (from coordinates AND date), an IANA name, or a fixed offset like "+05:30".
default "auto"
No other fields are accepted.
## Place Send the place in one of three ways: - **Coordinates**, the most precise: `{ "latitude": …, "longitude": … }`. - **A place id** from [place search](/reference/places-and-time#searchPlaces): `{ "place_id": "pl_…" }`. - **A name**: `{ "query": "Noida" }`. - If nothing matches, the answer is `422 place_not_found`. - If several places match, it is `422 place_ambiguous`, with `error.candidates` to choose from. - The API never guesses. ## Timezone `timezone` defaults to `"auto"`: the zone and UTC offset in force **at that place on that date**, including historical changes. You can also send an IANA name (`"Asia/Kolkata"`) or a fixed offset (`"+05:30"`). The zone used comes back in `meta.timezone_used`. **Older dates in India.** With `"auto"`, India is +05:30 from 1906, and +06:30 from October 1941 to May 1942 and from September 1942 to October 1945. Before 1906 the timezone database has one zone for all of India, at +05:21, but cities kept their own local time then. For a birth before 1906, send a fixed offset if you know the time the clock was keeping. ## Time accuracy - `exact` (the default) and `approximate` compute everything. - `unknown` omits the fields that depend on the lagna or the houses and lists them in `warnings`. It never fills them with a noon default. - Operations that cannot work without a time answer `422 time_required`. ## Dates Dates must be between 1900-01-01 and 2100-12-31. # Errors Source: https://developers.astrologics.in/docs/errors Every error has the same shape, and its HTTP status matches its type:error object required
type string required
one of invalid_request, authentication_error, permission_error, not_found, conflict, rate_limit, api_error
code string required
one of invalid_parameter, missing_parameter, unsupported_date_range, invalid_api_key, key_revoked, scope_not_allowed, plan_restricted, domain_not_allowed, not_found, idempotency_conflict, place_ambiguous, place_not_found, rate_limited, quota_exhausted, internal_error, engine_unavailable, timeout, time_required
message string required
param string
issues array of object
param string required
message string required
candidates array of object
place_id string required
name string required
state string
country string
suggestions array of object
On a 404 for an unknown path: the operations you may have meant, most likely first. Absent when nothing is close.
method string required
path string required
request_id string required
doc_url string (uri) required
| Code | HTTP | Type | Meaning |
|---|---|---|---|
invalid_parameter | 400 | invalid_request | One or more inputs are invalid; every problem is listed in error.issues. |
missing_parameter | 400 | invalid_request | A required input is missing (the API currently reports these as invalid_parameter with issues). (reserved: not returned today) |
unsupported_date_range | 400 | invalid_request | Dates must be between 1900-01-01 and 2100-12-31. |
invalid_api_key | 401 | authentication_error | Missing, invalid, revoked or expired API key. |
key_revoked | 401 | authentication_error | Revoked keys get invalid_api_key instead, so a prober learns nothing. (reserved: not returned today) |
scope_not_allowed | 403 | permission_error | This key cannot call this operation; publishable keys may call only read-only operations without birth data. |
plan_restricted | 403 | permission_error | Every plan includes every operation, so this is not returned. (reserved: not returned today) |
domain_not_allowed | 403 | permission_error | The request's Origin is not one of this publishable key's allowed origins. |
not_found | 404 | not_found | No such operation or resource. |
idempotency_conflict | 409 | conflict | Idempotency keys are not supported yet. (reserved: not returned today) |
place_ambiguous | 422 | invalid_request | More than one place matches; choose one of error.candidates or send coordinates. |
place_not_found | 422 | invalid_request | No place matches; send coordinates or a place_id. |
time_required | 422 | invalid_request | This operation needs a birth time (time_accuracy exact or approximate). |
rate_limited | 429 | rate_limit | Too many requests per second, or too many at once, for your plan; retry after Retry-After seconds. |
quota_exhausted | 429 | rate_limit | This period's credits (or a paid project's overage cap), or the project's daily test calls, are used up. |
internal_error | 500 | api_error | Something failed on our side; quote the request_id. |
engine_unavailable | 500 | api_error | The calculation engine is not reachable; not returned today because the engine runs in-process. (reserved: not returned today) |
timeout | 500 | api_error | A calculation took too long; not returned today. (reserved: not returned today) |
| Plan | Credits a month | Requests a second | Requests at once | When credits run out | Test calls a day |
|---|---|---|---|---|---|
| Free | 3,000 | 2 | 2 | Calls stop with 429 quota_exhausted | 100 |
| Starter | 75,000 | 5 | 4 | Calls continue as overage | 100 |
| Growth | 4,00,000 | 20 | 8 | Calls continue as overage | 100 |
| Business | 15,00,000 | 50 | 16 | Calls continue as overage | 100 |
| Header | Meaning |
|---|---|
RateLimit-Limit | Requests allowed in the current window. |
RateLimit-Remaining | Requests left in the current window. |
RateLimit-Reset | Seconds until the window resets. |
X-Credits-Remaining | Credits left in the billing period. |
| Operation | Credits |
|---|---|
GET /v1/places/search Search birth places | 1 |
GET /v1/places/{place_id} Get one place | 1 |
GET /v1/places/reverse Nearest real settlement to coordinates | 1 |
POST /v1/timezone IANA zone and UTC offset at a moment and place | 1 |
POST /v1/kundli Birth chart: lagna and the nine grahas | 2 |
POST /v1/kundli/birth-details Avakhada birth details | 1 |
POST /v1/kundli/divisional Divisional charts D1–D60 | 2 |
POST /v1/kundli/aspects Graha drishti: houses and planets aspected | 1 |
POST /v1/kundli/yogas Yogas present, with strength and rule | 2 |
POST /v1/kundli/ashtakavarga Bhinna and Sarva Ashtakavarga, the bindus of the signs being transited, each planet's best and worst signs | 2 |
POST /v1/kundli/wealth Wealth reading from D1, D2, D9 and D10: hora placements, the D10 lagna and 10th lord, vargottama, scores 0–10 | 2 |
POST /v1/kundli/gemstones Gemstones by functional lordship: the lagna lord's, the 9th (or 5th) lord's, the mahadasha lord's, and those to avoid | 2 |
POST /v1/kundli/shadbala Shadbala: the six-fold strength of the seven grahas | 2 |
POST /v1/kundli/classical The classical layer: house cusps, bhava bala, prastara ashtakavarga, graha avasthas, sthira karakas, lucky points | 2 |
POST /v1/kundli/outer-planets Uranus, Neptune and Pluto: sidereal position, house from the lagna, and the house reading in English and Hindi | 2 |
POST /v1/kundli/d12 Dwadasamsa (D12) read for the lineage: father, mother, the 4th and 9th, strength 0–10 | 2 |
POST /v1/kundli/upagrahas Upagrahas: the five from the Sun, and Kala, Mrityu, Ardhaprahara, Yamaghantaka and Gulika from the day's eight parts | 1 |
POST /v1/kundli/arudha Arudha padas of the twelve houses, with Arudha Lagna and Upapada | 1 |
POST /v1/kundli/chara-karakas Jaimini chara karakas on the seven-planet scheme, with the karakamsha | 1 |
POST /v1/kundli/bhav-chalit Bhav chalit: the Sripati bhavas, and which planets shift from their rashi house | 1 |
POST /v1/planets/asta Asta and Uday: when each planet sets and rises near the Sun, for a place | 2 |
POST /v1/planets/series A series of sidereal positions over a range, at up to 400 steps | 2 |
GET /v1/reference/rashis The 12 rashis: span, lord, element, modality, varna, vashya and nakshatras | 1 |
GET /v1/reference/nakshatras The 27 nakshatras: span, lord, gana, yoni, nadi, deity and symbol | 1 |
POST /v1/planets/positions Sidereal positions at any moment and place | 1 |
GET /v1/planets/now The sky now: sidereal positions at the top of the current hour | 1 |
GET /v1/outer-planets/cycle The retrograde cycle of Saturn, Uranus, Neptune or Pluto: its stations and whether it is retrograde now | 1 |
POST /v1/kundli/bundle Several chart operations in one call: one rate-limit slot, charged their sum less one credit | 3 |
POST /v1/dasha/vimshottari Vimshottari periods to 5 levels | 2 |
POST /v1/dasha/vimshottari/current Running Maha → Antar → Pratyantar → Sookshma | 2 |
POST /v1/dasha/yogini Yogini dasha periods | 2 |
POST /v1/dasha/chara Jaimini Chara dasha and the karakas | 2 |
POST /v1/dosha/manglik Manglik: graded, from lagna, Moon and Venus, cancellations named | 1 |
POST /v1/dosha/kaal-sarp Kaal Sarp: none, partial or full | 1 |
POST /v1/dosha/sade-sati Sade Sati: is it running today, which phase, and when it ends | 1 |
POST /v1/dosha/sade-sati/timeline Every Sade Sati and Dhaiya of a lifetime: each sign leg with its phase, start and end | 2 |
POST /v1/match/ashtakoot Ashtakoot Guna Milan (36 points) | 1 |
POST /v1/match/dashakoot The ten South Indian poruthams, from the Moon stars: each result, a score, and Rajju called out | 1 |
POST /v1/match/papasamyam Papasamyam: malefics from lagna, Moon and Venus in both charts, compared | 2 |
POST /v1/match/manglik Manglik status of both and mutual cancellation | 2 |
GET /v1/panchang Panchang for a date and place | 1 |
GET /v1/panchang/choghadiya Day and night choghadiya | 1 |
GET /v1/muhurat/activities Supported muhurat activities | 0 |
GET /v1/muhurat/search Days rated for an activity, with scores and rejection reasons | 2 |
POST /v1/muhurat/personal Muhurat windows with tara bala and chandra bala for one person | 3 |
GET /v1/muhurat/day One day judged for an activity: the panchang, the verdict, the windows left after Rahu Kaal, Yamaganda and Gulika | 1 |
GET /v1/muhurat/{occasion}/year The dated muhurat list of a year for an occasion: the days that hold a window, with the windows | 2 |
GET /v1/muhurat/{occasion} Every local day between two dates for an occasion: available with its windows, or the reason it is not | 2 |
GET /v1/panchang/hora Hora: the 24 planetary hours of a day | 1 |
GET /v1/calendar/tithis Tithi start and end moments between two dates, and the tithi at each sunrise | 1 |
GET /v1/calendar/ekadashi Every Ekadashi of a year: the vrat date, the tithi and the paran window | 1 |
GET /v1/calendar/festivals Festivals of a year, each by its own rule, with its windows and moments | 2 |
GET /v1/horoscope/{sign} Horoscope for one sign | 1 |
GET /v1/horoscope All 12 signs (publisher feed) | 5 |
POST /v1/horoscope/personal A horoscope from the person's own Moon sign | 2 |
GET /v1/transits/events Planetary events: sign changes, retrograde stations and eclipses, with IST times | 1 |
GET /v1/transits Ingresses, stations and combustion between dates | 1 |
POST /v1/transits/natal Transits over the natal Moon and houses | 2 |
GET /v1/transits/graha-yuddha Graha yuddha (planetary war) now: Mercury, Venus, Mars, Jupiter and Saturn within 1.5° | 1 |
POST /v1/transits/aspects Exact conjunctions, sextiles, squares, trines and oppositions over a range | 2 |
POST /v1/transits/parallels Exact parallels and contra-parallels of declination over a range | 2 |
POST /v1/timing/personal Personal timing: today's score and band, the dasha–transit reading, a day-by-day strip and any red zone | 2 |
POST /v1/timing/dasha-transit Dasha–transit confluence: the running mahadasha and antardasha lords against their transit signs and houses | 2 |
POST /v1/timing/favourable-days Favourable days ahead by tara bala: the Moon's nakshatra counted from the birth nakshatra | 1 |
POST /v1/timing/year-outlook A 12-month outlook: the slow planets' transit houses from the lagna on the 15th of each month, scored | 2 |
GET /v1/horoscope/weekly/rashi-tones The week's tone for each rashi: a 0–100 score per day, the band, the best and worst days and the planet behind it | 1 |
POST /v1/muhurat/scan Scan up to 62 days for an activity inside daily hours: the ten best days with their favourable windows | 3 |
POST /v1/timing/eclipses The eclipses of the months ahead over the chart: sign, natal house, reading and shadow period | 2 |
POST /v1/numerology/core Life path, destiny, soul urge, personality (Chaldean) | 1 |
POST /v1/numerology/pythagorean Pythagorean numbers: core, karmic debts and lessons, pinnacles, challenges and personal year | 1 |
POST /v1/numerology/name Chaldean name number | 1 |
POST /v1/numerology/mobile Mobile-number analysis | 1 |
POST /v1/numerology/loshu Lo Shu grid | 1 |
POST /v1/numerology/compatibility Numerology compatibility | 1 |
POST /v1/numerology/business-name Business name number (Chaldean): planet, verdict and the business-friendly numbers | 1 |
POST /v1/numerology/lucky-name Is the name lucky for the person: the name number against the life path and birth numbers | 1 |
POST /v1/charts/{varga}.svg Chart as SVG (North or South Indian) | 2 |
POST /v1/charts/{varga}.png Chart as PNG (the same drawing as the SVG) | 3 |
POST /v1/reports/kundli.pdf A client-ready kundli as a PDF, under your name, logo and colour | 10 |
POST /v1/reports/match.pdf A client-ready matching report as a PDF: Ashtakoot, Dashakoot and Manglik | 10 |
POST /v1/reports/vastu.pdf A client-ready Vastu report as a PDF: mandala, plot, door and rooms | 10 |
POST /v1/kp/chart KP chart: cusps and planets with star, sub and sub-sub lords | 2 |
POST /v1/kp/significators KP 4-step significators and house groups | 2 |
GET /v1/kp/ruling-planets The seven KP ruling planets at a moment and place | 1 |
GET /v1/kp/horary KP horary (prashna) for a number from 1 to 249 | 2 |
POST /v1/kp/changes When each planet changes sign, star lord or sub lord over a range | 2 |
POST /v1/kp/ruling-intervals The seven KP ruling planets over a window, as intervals | 2 |
POST /v1/lal-kitab/chart Lal Kitab teva: houses, planet states, sleeping houses | 2 |
POST /v1/lal-kitab/debts The nine Lal Kitab rin (debts), graded | 1 |
POST /v1/lal-kitab/varshphal Lal Kitab annual chart for a year of life | 2 |
POST /v1/lal-kitab/remedies Lal Kitab remedies, in the order to do them | 1 |
POST /v1/varshaphal Tajik varshaphal: annual chart, muntha, year lord, Mudda dasha | 3 |
POST /v1/biorhythm/reading The three cycles on a date, with their state, trend, next critical date and meaning | 1 |
POST /v1/biorhythm/forecast The three values for each day of a range, ready to chart | 1 |
POST /v1/biorhythm/critical-days The dates a cycle crosses zero, marked single, double or triple | 1 |
POST /v1/biorhythm/compatibility How far two people's cycles sit apart, scored for each cycle | 1 |
POST /v1/biorhythm/phases Where each cycle is: its half, when that half began and ends, and the next peak and trough | 1 |
POST /v1/biorhythm/daily A short daily summary with the coming week's values | 1 |
POST /v1/forecast/timeline Dasha changes, Sade Sati and Dhaiya, and Jupiter, Saturn and Rahu sign changes, in date order | 3 |
POST /v1/forecast/transits Sign changes and the minutes a transiting planet reaches or opposes a natal point | 2 |
POST /v1/forecast/significant-dates The larger dates in a range: dasha changes, Saturn's periods, and Saturn, Jupiter and Rahu returns | 3 |
POST /v1/forecast/digest One month for a chart: the running periods, where the planets stand and the month's dated events | 2 |
POST /v1/forecast/solar-return The minute the Sun returns to its birth longitude in a year, with the chart for that minute | 2 |
POST /v1/western/chart A tropical birth chart: planets, angles, Placidus or other houses, dignities and element balance | 2 |
POST /v1/western/chart.svg The chart drawn as a wheel in SVG, with the ascendant on the left | 2 |
POST /v1/western/aspects Natal aspects with their orbs, and whether each is applying | 1 |
POST /v1/western/synastry Aspects between two charts, and each person's planets in the other's houses | 3 |
POST /v1/western/composite A midpoint composite chart for two people | 3 |
POST /v1/western/transits Exact transits to a birth chart, sign ingresses and stations over a range | 3 |
POST /v1/western/progressions A secondary progressed chart for a date, with solar arc angles | 2 |
POST /v1/western/solar-return The tropical solar return chart for a year, at the birth place or another | 2 |
POST /v1/western/lunar-return The next tropical lunar return chart after a date | 2 |
POST /v1/chinese/bazi The four pillars with hidden stems, ten gods, nayin and element counts | 2 |
POST /v1/chinese/luck-pillars The ten-year luck pillars, their direction and the age they start | 1 |
POST /v1/chinese/annual A solar year's pillar against a chart: Tai Sui, relations and the twelve month pillars | 1 |
POST /v1/chinese/compatibility Harmonies and conflicts between two charts' year and day pillars | 1 |
POST /v1/chinese/zodiac The birth year animal by Li Chun and by Lunar New Year, and whether they agree | 1 |
POST /v1/chinese/date A Gregorian date in the Chinese calendar: lunar month and day, leap month, day pillar and solar term | 1 |
POST /v1/chinese/solar-terms The 24 solar terms of a year, to the minute | 1 |
POST /v1/feng-shui/kua A person's Kua number, East or West group and eight directions | 1 |
POST /v1/feng-shui/house A building's gua from its facing, its eight mansions, and how it fits an occupant's Kua | 1 |
POST /v1/feng-shui/flying-stars A Xuan Kong flying star chart: base, mountain and water stars in all nine palaces, and its structure | 2 |
POST /v1/feng-shui/flying-stars.svg The flying star chart drawn as a nine-palace grid in SVG, south at the top | 2 |
POST /v1/feng-shui/annual A year's flying stars, Five Yellow, Tai Sui, Sui Po and San Sha, with the twelve monthly charts | 1 |
GET /v1/vastu/reference The 32 padas with their door effects and verses, the 45 devatas, the room rules and the score's weights | 1 |
POST /v1/vastu/mandala The Vastu Purusha Mandala over a real plot: every square in metres, the brahmasthan, the vamsa lines and the atimarma points | 2 |
POST /v1/vastu/mandala.svg The mandala drawn as SVG, north up, in English or Hindi, with the door marked | 2 |
POST /v1/vastu/entrance Which of the 32 padas a door falls on, the text's effect and verse, and the better stretches of wall | 1 |
POST /v1/vastu/ayadi The Ayadi formulas on a building's measures: every working shown, the yoni judged, and nearby measures that pass | 1 |
POST /v1/vastu/plot Findings on a plot: proportion, shape, slope, water, cut corners, extensions and roads, each classical or convention | 1 |
POST /v1/vastu/rooms A verdict for each room by zone, what to prefer, and a score with published weights | 1 |
GET /v1/usage Credits used and remaining this period | 0 |
GET /v1/meta/conventions Defaults and conventions (ayanamsa, node, sunrise definition, what is not computed) | 0 |
engine_versionayanamsakp_ayanamsahouse_systemnodesunrisemoonriselunar_monthayanamsa_optionsnot_computed| Body | Median ″ | Max ″ |
|---|---|---|
| Sun | 0.38 | 1.63 |
| Moon | 0.92 | 4.05 |
| Mercury | 1.44 | 9.47 |
| Venus | 1.13 | 13.8 |
| Mars | 1.01 | 9.42 |
| Jupiter | 2.35 | 9.40 |
| Saturn | 2.33 | 11.0 |
| Uranus | 3.18 | 11.6 |
| Neptune | 11.3 | 18.5 |
| Pluto | 1.79 | 3.66 |
POST /v1/kundli (2 credits), POST /v1/dasha/vimshottari/current (2 credits), GET /v1/panchang (1 credit) and POST /v1/match/ashtakoot (1 credit) answer most questions.
When the model calls a tool, your server makes the request and hands back the JSON:
```js
// Your server: the model asked for a kundli. The key never reaches the browser.
async function getKundli(birth) {
const res = await fetch('https://api.astrologics.in/v1/kundli', {
method: 'POST',
headers: { Authorization: `Bearer ${process.env.ASTROLOGICS_KEY}`, 'Content-Type': 'application/json' },
body: JSON.stringify({ birth }),
});
const body = await res.json();
if (!res.ok) return { error: body.error.code, message: body.error.message }; // let the model ask the user again
return body.data;
}
```
Pass errors back to the model as they are. A `place_ambiguous` error carries `candidates`, so the model can ask the user which place they meant; see [errors](/docs/errors).
## Rules for the model
Put these in its instructions:
- Use the tools for every position, period, date and score. Never estimate one.
- If the birth time is not known, say so, and send `time_accuracy: "unknown"` rather than a guessed time.
- Say which method a result follows when it matters, for example the Lahiri ayanamsa or the Ashtakoot table; see [conventions](/docs/conventions).
- Present results as what the tradition says, not as certainty or as medical, legal or financial advice. See the [disclaimer](/legal/disclaimer).
## Keys, costs and data
- **Keys.** Keep the secret key on your server. A chatbot running in a browser or a phone must call your server, not us. See [mobile apps](/docs/mobile-apps).
- **Costs.** Each tool call is an ordinary call, charged its operation's credits; errors are free and test keys are never charged. A chart for one person does not change, so cache it for the conversation instead of asking again. See [caching](/docs/caching-and-data-retention).
- **Hindi.** Add `lang=hi` to get labels and readings in Hindi for a Hindi conversation. See [languages](/docs/languages).
- **Birth details.** They are your user's personal data. We do not store request bodies; decide what your chatbot keeps, and tell your users.
# Languages
Source: https://developers.astrologics.in/docs/languages
Operations that return text take `lang`: `en` (the default) or `hi` (Hindi, Devanagari). Machine ids such as
`"moon"`, `"bharani"` or `"leo"` stay in English in every language, so your code never depends on the language;
labels and readings are localised. Fields that explain a method rather than a result, such as `rule` and `source`, stay in English. More Indian languages will follow demand.
# MCP servers
Source: https://developers.astrologics.in/docs/mcp
We run two MCP servers over Streamable HTTP.
| Server | Address | Key | What it does |
|---|---|---|---|
| API | `https://api.astrologics.in/mcp` | Your API key | Every public operation as a tool |
| Docs | `https://developers.astrologics.in/mcp` | None | Search the docs, read a page, look up an operation |
## How API tools are charged
An MCP call goes through the same checks as a REST call: the same key, rate limits and credits. Only successful calls on a
live key are charged, and a test key is never charged. Arguments are treated like any request body: they are
[never written](/docs/caching-and-data-retention) to our database or logs.
Start with a test key (`al_test_`). Keep keys out of files you commit, because a key in an MCP config is a secret key.
## Set it up
Claude Code:
claude mcp add --transport http astrologics https://api.astrologics.in/mcp --header "Authorization: Bearer al_test_YOUR_KEY"
claude mcp add --transport http astrologics-docs https://developers.astrologics.in/mcp
Cursor (`.cursor/mcp.json`):
{ "mcpServers": {
"astrologics": { "url": "https://api.astrologics.in/mcp", "headers": { "Authorization": "Bearer al_test_YOUR_KEY" } },
"astrologics-docs": { "url": "https://developers.astrologics.in/mcp" } } }
VS Code (`.vscode/mcp.json`):
{ "servers": {
"astrologics": { "type": "http", "url": "https://api.astrologics.in/mcp", "headers": { "Authorization": "Bearer al_test_YOUR_KEY" } },
"astrologics-docs": { "type": "http", "url": "https://developers.astrologics.in/mcp" } } }
## Fewer tools
The API server lists every operation, which is a lot for an agent to hold in mind. To list only some domains, add
`?domains=` with the slugs from the [reference](/reference), for example `https://api.astrologics.in/mcp?domains=kundli,dasha`.
Add `?compact=1` to spend less of the agent's context: tools come with a one-line summary and no field descriptions, and a
call answers with `data` and any `warnings`, without `meta`. It works with `domains`, as in
`https://api.astrologics.in/mcp?domains=vastu&compact=1`.
# Shopify guide
Source: https://developers.astrologics.in/docs/shopify
You can show a daily panchang or a horoscope on a Shopify store in a few minutes, with no app and no code beyond one short snippet.
> **Early guide:** we have tested the widgets in a browser, but not yet on a real Shopify store. Try this on a page that is not your home page first, and tell us at developers@astrologics.in if anything differs.
## What works this way
| Widget | On Shopify |
|---|---|
| Panchang | Yes, with a publishable key |
| Horoscope | Yes, with a publishable key |
| Kundli, matching and Vastu | No. They carry birth details or plot details, so they need [a server of your own](/docs/widgets), and a Shopify store does not give you one |
There is no AstroLogics app in the Shopify App Store.
## 1. Create a publishable key
Open [API keys](/dashboard/keys) and create a **publishable** key. Under allowed origins, list each address your store is reached at, one per line. An origin must match exactly, so include each variant your visitors use:
```text
https://your-store.myshopify.com
https://www.your-domain.com
https://your-domain.com
```
A publishable key is safe in a page because it works only for read-only operations and only from these origins. Never paste a test or live key (`al_test_`, `al_live_`) into a theme: anyone can read it.
## 2. Add a section to your theme
1. In Shopify admin, go to **Online Store**, then **Themes**, and choose **Customize**.
2. Open the page you want, and choose **Add section**, then **Custom Liquid**.
3. Paste one of the snippets below, replacing `YOUR_PUBLISHABLE_KEY`.
4. Save, then open the page on your store's real address to check it.
Custom Liquid is available in Online Store 2.0 themes. The theme editor's preview may not count as one of your origins, so if the widget shows a refusal there, check the real page before changing anything.
### Today's panchang
Set `lat` and `lon` to the place the panchang is for. Without them, it uses New Delhi.
```html
curl 'https://api.astrologics.in/v1/horoscope/leo?period=weekly&date=2026-10-02&lang=hi' \
-H 'Authorization: Bearer al_test_YOUR_KEY'
Use `data.sign_label` for `{{2}}` and `data.reading` for `{{3}}`. With `lang=hi` both are in Hindi.
## 3. Send it through your provider
Providers are in alphabetical order. We know of no neutral ranking, so choose on price, support and what your business already uses.
| Provider | Good to know |
|---|---|
| [AiSensy](#aisensy) | You send through a campaign you create in its dashboard |
| [Gupshup](#gupshup) | Takes a form post, and identifies a template by its ID |
| [Interakt](#interakt) | Its public API is not on its Starter plan |
| [LeadNXT](#leadnxt) | Offers a WhatsApp Business API. We found no public API documentation |
| [WATI](#wati) | A request needs your tenant ID, and a success means accepted, not delivered |
The values in these requests are made up. Each provider's key is a secret, so send these from a server or from n8n, never from a web page.
### AiSensy
Create the template, then an API campaign that uses it, and set the campaign to Live. Your API key is in the dashboard. See [AiSensy's API reference](https://wiki.aisensy.com/en/articles/11501889-api-reference-docs).
```bash
curl -X POST https://backend.aisensy.com/campaign/t1/api/v2 \
-H "Content-Type: application/json" \
-d '{
"apiKey": "YOUR_AISENSY_KEY",
"campaignName": "daily_horoscope",
"destination": "+910000000000",
"userName": "Your AiSensy project name",
"templateParams": ["Asha", "Leo", "A good day to finish what you started."]
}'
```
The `templateParams` list must have as many values as the template has variables, or AiSensy rejects the request.
There is an n8n workflow for this one: [Daily horoscope on WhatsApp](/downloads/n8n/astrologics-daily-horoscope-whatsapp.json). Follow the [n8n guide](/docs/n8n), and for the AiSensy step create a **Custom Auth** credential, so that your key is not stored in the workflow:
```json
{ "body": { "apiKey": "YOUR_AISENSY_KEY" } }
```
### Gupshup
A template is identified by its ID, which you get from Gupshup once it is created. `source` is your registered number, and neither number has a `+`. See [Gupshup's template messages](https://docs.gupshup.io/docs/template-messages).
```bash
curl -X POST https://api.gupshup.io/wa/api/v1/template/msg \
-H "apikey: YOUR_GUPSHUP_KEY" \
--data-urlencode "source=910000000001" \
--data-urlencode "destination=910000000000" \
--data-urlencode 'template={"id":"YOUR_TEMPLATE_ID","params":["Asha","Leo","A good day to finish what you started."]}'
```
A success means that Gupshup has accepted the message. Whether it was delivered comes to your webhook.
### Interakt
Your key is in the dashboard under Developer Settings, and is sent after the word `Basic`, as it is. The template's language must match the one you created it in. See [Interakt's guide](https://www.interakt.shop/resource-center/how-to-send-whatsapp-templates-using-apis-webhooks).
```bash
curl -X POST https://api.interakt.ai/v1/public/message/ \
-H "Authorization: Basic YOUR_INTERAKT_KEY" \
-H "Content-Type: application/json" \
-d '{
"countryCode": "+91",
"phoneNumber": "0000000000",
"type": "Template",
"template": {
"name": "daily_horoscope",
"languageCode": "en",
"bodyValues": ["Asha", "Leo", "A good day to finish what you started."]
}
}'
```
### LeadNXT
[LeadNXT](https://www.leadnxt.com/whatsapp-business-api-ai-chatbot/) offers bulk WhatsApp campaigns, a chatbot and missed-call-to-WhatsApp, along with its lead management tools. We did not find public API documentation, so ask LeadNXT how to send a template by API. The horoscope call in step 2 stays the same.
### WATI
Your tenant ID and token are in the dashboard under API Settings. WATI recommends its newer v3 API for new work, so check [its reference](https://docs.wati.io/v2.5/reference/sendtemplatemessage) first. This is the documented v1 request:
```bash
curl -X POST "https://live-mt-server.wati.io/YOUR_TENANT_ID/api/v1/sendTemplateMessage?whatsappNumber=910000000000" \
-H "Authorization: Bearer YOUR_WATI_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"template_name": "daily_horoscope",
"broadcast_name": "daily_horoscope",
"channel_number": "910000000001",
"parameters": [
{ "name": "1", "value": "Asha" },
{ "name": "2", "value": "Leo" },
{ "name": "3", "value": "A good day to finish what you started." }
]
}'
```
## Other messages
The [panchang](/reference/panchang-and-muhurat#getPanchang) works the same way, at 1 credit for each date and place. It returns no paragraph of text, so build your line from `data.tithi.label`, `data.nakshatra.label` and `data.rahu_kaal`, as the [daily panchang workflow](/docs/n8n) does.
Keep to readings that are the same for many people. A message built from one person's birth details is that person's data, so check what your provider stores and keeps before you send it.
# Moving from another astrology API
Source: https://developers.astrologics.in/docs/migrating
Two astrology APIs can both be correct and still disagree, because each chooses an ayanamsa, a house system, a sunrise and a matching table. Most differences you will see after a move come from those choices, not from errors. Check them first, then compare the results side by side with a test key, which is never charged.
## 1. Settle the conventions
engine_versionayanamsakp_ayanamsahouse_systemnodesunrisemoonriselunar_monthayanamsa_optionsnot_computedPOST /v1/kundli/bhav-chalit (1 credit) gives the Sripati bhavas.
- **Node.** Ours is the true node. A mean node differs from it by up to about 1.7°.
- **Sunrise.** Ours is the upper limb of the Sun, with refraction. A centre-of-disc sunrise is a few minutes later, which can change the vara, Rahu Kaal and choghadiya near their edges.
## 2. Send the birth the same way
- **Time and place.** Send the local birth time and the place. We work out the timezone in force at that date, including India's offsets before 1947 (see [historical timezones](/blog/historical-timezones-in-birth-charts)). If your old API took a fixed offset such as `+05:30`, an older birth can move by an hour; send `timezone` to match it while you compare. See [birth input](/docs/birth-input).
- **An unknown time.** Old APIs often fill in noon. We do not: set `time_accuracy` to `unknown` and the fields that depend on it are left out and listed in `warnings`.
## 3. Map the operations
Look up each call you make today in the [reference](/reference) or in the [glossary](/glossary), which names the operation for each term. Several chart calls can be made at once with POST /v1/kundli/bundle (3 credits).
## 4. Compare side by side
1. Pick some made-up births that cover your users: different decades, places and times of day.
2. Call both APIs, and ours with a test key.
3. Compare the planets' longitudes first. They should agree closely once the ayanamsa and node match; see [accuracy](/docs/accuracy) for ours against NASA JPL Horizons.
4. Then compare what is built on them: houses, nakshatras, dasha dates, matching scores. A difference there usually traces back to a convention above.
## Kundli matching scores
Ashtakoot tables differ between published sources, so two APIs can give different totals for the same couple. Ours uses one published table for each koota, named on [conventions](/docs/conventions#ashtakoot-tables), so a score can be checked by hand.
## When you are ready
Switch your server to a live key (`al_live_`). Nothing else changes: the same calls, the same results. If you find a difference you cannot explain, write to us at developers@astrologics.in with the `request_id` and the input.
# Notes for coding agents
Vedic astrology API over HTTPS. Base URL `https://api.astrologics.in`. The contract is OpenAPI 3.1: https://developers.astrologics.in/reference/openapi.yaml. Every docs page is also markdown: https://developers.astrologics.in/llms.txt lists them.
## Keys
Send `Authorization: Bearer