API reference / Location astrology
Location astrology
Astrocartography, relocation, city ranking and place-based timing for a birth chart.
15 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.
Astrocartography Lines
POSTAvailable
https://api.96astro.com/v1/location-astrology/acg-linesAll planetary ASC/MC/DC/IC lines for a birth moment as map line segments, plus aspect lines, zenith points, parans and midheaven sign bands.
- Credits
- 1 credit
- Input
- Birth details
- 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 |
|---|---|
datetimestringRequired | Local date and time, ISO 8601 without offset, e.g. 1990-10-18T14:30:00 Limits: format local-date-time, pattern ^\d{4}-\d{2}-\d{2}[T ]\d{2}:\d{2}(:\d{2}(\.\d{1,6})?)?$ Example: |
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: |
ayanamshastringOptional | Default: Allowed values: lahirikrishnamurtiraman |
languagestringOptional | Output language (ISO 639-1). The values listed are the ones this capability supports; any other is refused with 422 unsupported_language. Identifiers, enum values and numbers never change with language. Default: Allowed value: en |
nodestringOptional | Lunar node for the Rahu/Ketu lines: true (osculating) or mean. Default: Allowed values: truemean |
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.
coordinates· stringnode· stringayanamsha· stringgreenwich_sidereal_time_hours· numberlines· array of objectaspect_lines· array of objectmidheaven_signs· objectzenith_points· array of objectparans· array of object
Example request
curl -X POST https://api.96astro.com/v1/location-astrology/acg-lines \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209
}'const response = await fetch("https://api.96astro.com/v1/location-astrology/acg-lines", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
"datetime": "1990-10-18T14:30:00",
"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.locationAstrology.acgLines({
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209
});
console.log(data);import requests
response = requests.post(
"https://api.96astro.com/v1/location-astrology/acg-lines",
headers={
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
json={
"datetime": "1990-10-18T14:30:00",
"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.location_astrology.acg_lines({
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209,
})
print(res.data)<?php
$ch = curl_init('https://api.96astro.com/v1/location-astrology/acg-lines');
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([
'datetime' => '1990-10-18T14:30:00',
'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(`{
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209
}`)
req, err := http.NewRequest("POST", "https://api.96astro.com/v1/location-astrology/acg-lines", 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": {
"coordinates": "Points are [longitude, latitude] in signed decimal degrees (east and north positive), GeoJSON order.",
"node": "true",
"ayanamsha": "lahiri",
"greenwich_sidereal_time_hours": 10.772952,
"lines": [
{
"planet": "Sun",
"angle": "MC",
"theme": "Career, recognition, public visibility, leadership.",
"segments": [
[
[
41.3104,
-85
],
[
41.3104,
-84
…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.
Transit Astrocartography Lines
POSTAvailable
https://api.96astro.com/v1/location-astrology/transit-acg-linesPlanetary ASC/MC/DC/IC lines for any moment as map line segments.
- 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 |
|---|---|
datetimestringRequired | Local date and time of the moment, ISO 8601 without offset. Limits: format local-date-time, pattern ^\d{4}-\d{2}-\d{2}[T ]\d{2}:\d{2}(:\d{2}(\.\d{1,6})?)?$ Example: |
timezonestring | nullOptional | IANA time zone, e.g. Asia/Kolkata Default: Example: |
utc_offsetstring | nullOptional | Fixed offset such as +05:30 Default: |
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.
coordinates· stringnode· stringjulian_day_ut· numbergreenwich_sidereal_time_hours· numberlines· array of object
Example request
curl -X POST https://api.96astro.com/v1/location-astrology/transit-acg-lines \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"datetime": "2026-10-13T12:00:00",
"timezone": "Asia/Kolkata"
}'const response = await fetch("https://api.96astro.com/v1/location-astrology/transit-acg-lines", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
"datetime": "2026-10-13T12:00:00",
"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.locationAstrology.transitAcgLines({
"datetime": "2026-10-13T12:00:00",
"timezone": "Asia/Kolkata"
});
console.log(data);import requests
response = requests.post(
"https://api.96astro.com/v1/location-astrology/transit-acg-lines",
headers={
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
json={
"datetime": "2026-10-13T12:00:00",
"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.location_astrology.transit_acg_lines({
"datetime": "2026-10-13T12:00:00",
"timezone": "Asia/Kolkata",
})
print(res.data)<?php
$ch = curl_init('https://api.96astro.com/v1/location-astrology/transit-acg-lines');
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([
'datetime' => '2026-10-13T12:00:00',
'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(`{
"datetime": "2026-10-13T12:00:00",
"timezone": "Asia/Kolkata"
}`)
req, err := http.NewRequest("POST", "https://api.96astro.com/v1/location-astrology/transit-acg-lines", 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": {
"coordinates": "Points are [longitude, latitude] in signed decimal degrees (east and north positive), GeoJSON order.",
"node": "mean",
"julian_day_ut": 2461326.770833,
"greenwich_sidereal_time_hours": 7.955955,
"lines": [
{
"planet": "Sun",
"angle": "MC",
"theme": "Career, recognition, public visibility, leadership.",
"segments": [
[
[
79.0745,
-85
],
[
79.0745,
-84
…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.
Relocated Chart
POSTAvailable
https://api.96astro.com/v1/location-astrology/relocation-chartThe chart recast for a new place: angles, house cusps with their lords, and each planet's house there and at the birthplace.
- Credits
- 1 credit
- Input
- Birth details
- 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 |
|---|---|
datetimestringRequired | Local date and time, ISO 8601 without offset, e.g. 1990-10-18T14:30:00 Limits: format local-date-time, pattern ^\d{4}-\d{2}-\d{2}[T ]\d{2}:\d{2}(:\d{2}(\.\d{1,6})?)?$ Example: |
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: |
ayanamshastringOptional | Default: Allowed values: lahirikrishnamurtiraman |
languagestringOptional | Output language (ISO 639-1). The values listed are the ones this capability supports; any other is refused with 422 unsupported_language. Identifiers, enum values and numbers never change with language. Default: Allowed value: en |
placeobjectRequired | Where the chart is relocated to. |
place.latitudenumberRequired | Limits: minimum -90, maximum 90 Example: |
place.longitudenumberRequired | Limits: minimum -180, maximum 180 Example: |
place.labelstringOptional | Name to echo back, e.g. Tokyo. Default: Limits: at most 120 characters Example: |
nodestringOptional | Lunar node: true (osculating) or mean. Default: Allowed values: truemean |
house_systemstringOptional | Default: Allowed values: placiduskochwhole_signequalcampanusregiomontanusporphyrymorinus |
topocentricbooleanOptional | Parallax-correct positions for an observer at the new place. Default: |
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 |
|---|---|
placidus | Placidus (default) |
Response · fields in data
Inferred from the example response: a guide to the shape, not a contract.
place· objectdistance_from_birthplace_km· numberayanamsha· stringnode· stringhouse_system· stringtopocentric· booleanangles· objecthouse_cusps· array of objectplanets· array of object
Example request
curl -X POST https://api.96astro.com/v1/location-astrology/relocation-chart \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209,
"place": {
"latitude": 35.6762,
"longitude": 139.6503,
"label": "Tokyo"
}
}'const response = await fetch("https://api.96astro.com/v1/location-astrology/relocation-chart", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209,
"place": {
"latitude": 35.6762,
"longitude": 139.6503,
"label": "Tokyo"
}
}),
});
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.locationAstrology.relocationChart({
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209,
"place": {
"latitude": 35.6762,
"longitude": 139.6503,
"label": "Tokyo"
}
});
console.log(data);import requests
response = requests.post(
"https://api.96astro.com/v1/location-astrology/relocation-chart",
headers={
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
json={
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209,
"place": {
"latitude": 35.6762,
"longitude": 139.6503,
"label": "Tokyo",
},
},
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.location_astrology.relocation_chart({
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209,
"place": {
"latitude": 35.6762,
"longitude": 139.6503,
"label": "Tokyo",
},
})
print(res.data)<?php
$ch = curl_init('https://api.96astro.com/v1/location-astrology/relocation-chart');
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([
'datetime' => '1990-10-18T14:30:00',
'timezone' => 'Asia/Kolkata',
'latitude' => 28.6139,
'longitude' => 77.209,
'place' => [
'latitude' => 35.6762,
'longitude' => 139.6503,
'label' => 'Tokyo',
],
]),
]);
$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(`{
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209,
"place": {
"latitude": 35.6762,
"longitude": 139.6503,
"label": "Tokyo"
}
}`)
req, err := http.NewRequest("POST", "https://api.96astro.com/v1/location-astrology/relocation-chart", 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": {
"place": {
"latitude": 35.6762,
"longitude": 139.6503,
"label": "Tokyo"
},
"distance_from_birthplace_km": 5834,
"ayanamsha": "lahiri",
"node": "true",
"house_system": "placidus",
"topocentric": false,
"angles": {
"ascendant": {
"longitude": 22.3889,
"sign": "Aries",
"degree": 22.3889,
"sign_lord": "Mars",
"nakshatra": "Bharani",
"pada": 3,
…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.
Best Cities for a Goal
POSTAvailable
https://api.96astro.com/v1/location-astrology/rank-citiesRanks catalogue cities for one life goal: score, distance, rising and midheaven signs with their lords, and the reasons for each.
- Credits
- 3 credits
- Input
- Birth details
- 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 |
|---|---|
datetimestringRequired | Local date and time, ISO 8601 without offset, e.g. 1990-10-18T14:30:00 Limits: format local-date-time, pattern ^\d{4}-\d{2}-\d{2}[T ]\d{2}:\d{2}(:\d{2}(\.\d{1,6})?)?$ Example: |
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: |
ayanamshastringOptional | Default: Allowed values: lahirikrishnamurtiraman |
languagestringOptional | Output language (ISO 639-1). The values listed are the ones this capability supports; any other is refused with 422 unsupported_language. Identifiers, enum values and numbers never change with language. Default: Allowed value: en |
goalstringOptional | The life goal to score places for. Default: Allowed values: careermarriagewealthspiritualhealtheducationpeacechildrenpropertyromancefameforeigntravelpoliticsartsbusiness Example: |
regionstringOptional | Limit the catalogue to one region. Default: Allowed values: worldasiaeuropeamericasafricaoceania Example: |
limitintegerOptional | How many places to return, best first. Default: Limits: minimum 1, maximum 100 Example: |
max_city_rankinteger | nullOptional | Only catalogue cities of this importance rank or better (1 = global hubs). Default: Limits: minimum 1, maximum 9 |
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 |
|---|---|
career | Career |
marriage | Marriage |
wealth | Wealth |
spiritual | Spiritual |
health | Health |
education | Education |
peace | Peace of mind |
children | Children |
property | Property |
romance | Romance |
fame | Fame |
foreign | Foreign settlement |
travel | Travel |
politics | Politics |
arts | Arts |
business | Business |
Response · fields in data
Inferred from the example response: a guide to the shape, not a contract.
goal· stringregion· stringformula· array of objectcities_in_catalogue· integercities_scored· integercities· array of object
Example request
curl -X POST https://api.96astro.com/v1/location-astrology/rank-cities \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209,
"goal": "career",
"region": "asia",
"limit": 5
}'const response = await fetch("https://api.96astro.com/v1/location-astrology/rank-cities", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209,
"goal": "career",
"region": "asia",
"limit": 5
}),
});
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.locationAstrology.rankCities({
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209,
"goal": "career",
"region": "asia",
"limit": 5
});
console.log(data);import requests
response = requests.post(
"https://api.96astro.com/v1/location-astrology/rank-cities",
headers={
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
json={
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209,
"goal": "career",
"region": "asia",
"limit": 5,
},
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.location_astrology.rank_cities({
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209,
"goal": "career",
"region": "asia",
"limit": 5,
})
print(res.data)<?php
$ch = curl_init('https://api.96astro.com/v1/location-astrology/rank-cities');
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([
'datetime' => '1990-10-18T14:30:00',
'timezone' => 'Asia/Kolkata',
'latitude' => 28.6139,
'longitude' => 77.209,
'goal' => 'career',
'region' => 'asia',
'limit' => 5,
]),
]);
$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(`{
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209,
"goal": "career",
"region": "asia",
"limit": 5
}`)
req, err := http.NewRequest("POST", "https://api.96astro.com/v1/location-astrology/rank-cities", 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": {
"goal": "career",
"region": "asia",
"formula": [
{
"house": 10,
"weight": 0.4
},
{
"house": 11,
"weight": 0.3
},
{
"house": 6,
"weight": 0.2
}
],
"cities_in_catalogue": 246,
"cities_scored": 108,
…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.
Dasha-Aware City Ranking
POSTAvailable
https://api.96astro.com/v1/location-astrology/dasha-optimizeCity ranking for one goal weighted by the dashas running on a date, with the running Vimshottari, Char and Yogini periods.
- Credits
- 3 credits
- Input
- Birth details
- 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 |
|---|---|
datetimestringRequired | Local date and time, ISO 8601 without offset, e.g. 1990-10-18T14:30:00 Limits: format local-date-time, pattern ^\d{4}-\d{2}-\d{2}[T ]\d{2}:\d{2}(:\d{2}(\.\d{1,6})?)?$ Example: |
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: |
ayanamshastringOptional | Default: Allowed values: lahirikrishnamurtiraman |
languagestringOptional | Output language (ISO 639-1). The values listed are the ones this capability supports; any other is refused with 422 unsupported_language. Identifiers, enum values and numbers never change with language. Default: Allowed value: en |
goalstringOptional | The life goal to score places for. Default: Allowed values: careermarriagewealthspiritualhealtheducationpeacechildrenpropertyromancefameforeigntravelpoliticsartsbusiness Example: |
regionstringOptional | Limit the catalogue to one region. Default: Allowed values: worldasiaeuropeamericasafricaoceania |
limitintegerOptional | How many places to return, best first. Default: Limits: minimum 1, maximum 100 |
max_city_rankinteger | nullOptional | Only catalogue cities of this importance rank or better (1 = global hubs). Default: Limits: minimum 1, maximum 9 |
dasha_systemstringOptional | Which running dasha weights the ranking. Default: Allowed values: vimshottaricharyoginicombined Example: |
as_ofstring | nullOptional | Date whose running dasha is used (YYYY-MM-DD). Today in UTC when omitted. Default: Limits: format date 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 |
| Value | Meaning |
|---|---|
vimshottari | Vimshottari |
char | Char |
yogini | Yogini |
combined | Combined |
Response · fields in data
Inferred from the example response: a guide to the shape, not a contract.
as_of· stringdasha_system· stringrunning· objectgoal· stringregion· stringformula· array of objectcities_in_catalogue· integercities_scored· integercities· array of object
Example request
curl -X POST https://api.96astro.com/v1/location-astrology/dasha-optimize \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209,
"goal": "career",
"dasha_system": "combined",
"as_of": "2026-10-13"
}'const response = await fetch("https://api.96astro.com/v1/location-astrology/dasha-optimize", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209,
"goal": "career",
"dasha_system": "combined",
"as_of": "2026-10-13"
}),
});
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.locationAstrology.dashaOptimize({
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209,
"goal": "career",
"dasha_system": "combined",
"as_of": "2026-10-13"
});
console.log(data);import requests
response = requests.post(
"https://api.96astro.com/v1/location-astrology/dasha-optimize",
headers={
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
json={
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209,
"goal": "career",
"dasha_system": "combined",
"as_of": "2026-10-13",
},
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.location_astrology.dasha_optimize({
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209,
"goal": "career",
"dasha_system": "combined",
"as_of": "2026-10-13",
})
print(res.data)<?php
$ch = curl_init('https://api.96astro.com/v1/location-astrology/dasha-optimize');
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([
'datetime' => '1990-10-18T14:30:00',
'timezone' => 'Asia/Kolkata',
'latitude' => 28.6139,
'longitude' => 77.209,
'goal' => 'career',
'dasha_system' => 'combined',
'as_of' => '2026-10-13',
]),
]);
$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(`{
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209,
"goal": "career",
"dasha_system": "combined",
"as_of": "2026-10-13"
}`)
req, err := http.NewRequest("POST", "https://api.96astro.com/v1/location-astrology/dasha-optimize", 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": {
"as_of": "2026-10-13",
"dasha_system": "combined",
"running": {
"vimshottari": {
"mahadasha": "Jupiter",
"antardasha": "Mars",
"mahadasha_end": "2029-05-30",
"antardasha_end": "2027-01-04"
},
"char": {
"sign": "Leo",
"lord": "Sun",
"end": "2031-10-18"
},
"yogini": {
"yogini": "Mangala",
"lord": "Moon",
"end": "2027-06-16"
…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.
KP Verdict for a Place
POSTAvailable
https://api.96astro.com/v1/location-astrology/location-kp-analysisKP cusps and planets with star, sub and sub-sub lords and significations for one place and date, the running dashas, and a verdict per goal.
- Credits
- 1 credit
- Input
- Birth details
- 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 |
|---|---|
datetimestringRequired | Local date and time, ISO 8601 without offset, e.g. 1990-10-18T14:30:00 Limits: format local-date-time, pattern ^\d{4}-\d{2}-\d{2}[T ]\d{2}:\d{2}(:\d{2}(\.\d{1,6})?)?$ Example: |
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: |
ayanamshastringOptional | Default: Allowed values: lahirikrishnamurtiraman |
languagestringOptional | Output language (ISO 639-1). The values listed are the ones this capability supports; any other is refused with 422 unsupported_language. Identifiers, enum values and numbers never change with language. Default: Allowed value: en |
placeobjectRequired | |
place.latitudenumberRequired | Limits: minimum -90, maximum 90 Example: |
place.longitudenumberRequired | Limits: minimum -180, maximum 180 Example: |
place.labelstringOptional | Name to echo back, e.g. Tokyo. Default: Limits: at most 120 characters Example: |
as_ofstring | nullOptional | Date whose running dasha is read (YYYY-MM-DD). Today in UTC when omitted. Default: Limits: format date Example: |
goalsarray of string | nullOptional | Goals to judge; all sixteen when omitted. Default: Each item one of: careermarriagewealthspiritualhealtheducationpeacechildrenpropertyromancefameforeigntravelpoliticsartsbusiness Limits: at least 1 item |
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.
place· objectdistance_from_birthplace_km· numberas_of· stringrunning· objectcusps· array of objectplanets· array of objectverdicts· array of object
Example request
curl -X POST https://api.96astro.com/v1/location-astrology/location-kp-analysis \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209,
"place": {
"latitude": 35.6762,
"longitude": 139.6503,
"label": "Tokyo"
},
"as_of": "2026-10-13"
}'const response = await fetch("https://api.96astro.com/v1/location-astrology/location-kp-analysis", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209,
"place": {
"latitude": 35.6762,
"longitude": 139.6503,
"label": "Tokyo"
},
"as_of": "2026-10-13"
}),
});
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.locationAstrology.locationKpAnalysis({
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209,
"place": {
"latitude": 35.6762,
"longitude": 139.6503,
"label": "Tokyo"
},
"as_of": "2026-10-13"
});
console.log(data);import requests
response = requests.post(
"https://api.96astro.com/v1/location-astrology/location-kp-analysis",
headers={
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
json={
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209,
"place": {
"latitude": 35.6762,
"longitude": 139.6503,
"label": "Tokyo",
},
"as_of": "2026-10-13",
},
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.location_astrology.location_kp_analysis({
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209,
"place": {
"latitude": 35.6762,
"longitude": 139.6503,
"label": "Tokyo",
},
"as_of": "2026-10-13",
})
print(res.data)<?php
$ch = curl_init('https://api.96astro.com/v1/location-astrology/location-kp-analysis');
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([
'datetime' => '1990-10-18T14:30:00',
'timezone' => 'Asia/Kolkata',
'latitude' => 28.6139,
'longitude' => 77.209,
'place' => [
'latitude' => 35.6762,
'longitude' => 139.6503,
'label' => 'Tokyo',
],
'as_of' => '2026-10-13',
]),
]);
$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(`{
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209,
"place": {
"latitude": 35.6762,
"longitude": 139.6503,
"label": "Tokyo"
},
"as_of": "2026-10-13"
}`)
req, err := http.NewRequest("POST", "https://api.96astro.com/v1/location-astrology/location-kp-analysis", 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": {
"place": {
"latitude": 35.6762,
"longitude": 139.6503,
"label": "Tokyo"
},
"distance_from_birthplace_km": 5834,
"as_of": "2026-10-13",
"running": {
"vimshottari": {
"mahadasha": "Jupiter",
"antardasha": "Mars",
"mahadasha_end": "2029-05-30",
"antardasha_end": "2027-01-04"
},
"char": {
"sign": "Leo",
"lord": "Sun",
"end": "2031-10-18"
…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.
Compare Two Places
POSTAvailable
https://api.96astro.com/v1/location-astrology/compare-locationsScores two places per goal under the same birth and date, with each place's angles and KP verdicts, the totals and the overall winner.
- Credits
- 1 credit
- Input
- Birth details
- 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 |
|---|---|
datetimestringRequired | Local date and time, ISO 8601 without offset, e.g. 1990-10-18T14:30:00 Limits: format local-date-time, pattern ^\d{4}-\d{2}-\d{2}[T ]\d{2}:\d{2}(:\d{2}(\.\d{1,6})?)?$ Example: |
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: |
ayanamshastringOptional | This capability is computed with Lahiri only. Default: Allowed value: lahiri |
languagestringOptional | Output language (ISO 639-1). The values listed are the ones this capability supports; any other is refused with 422 unsupported_language. Identifiers, enum values and numbers never change with language. Default: Allowed value: en |
place_aobjectRequired | |
place_a.latitudenumberRequired | Limits: minimum -90, maximum 90 Example: |
place_a.longitudenumberRequired | Limits: minimum -180, maximum 180 Example: |
place_a.labelstringOptional | Name to echo back, e.g. Tokyo. Default: Limits: at most 120 characters Example: |
place_bobjectRequired | |
place_b.latitudenumberRequired | Limits: minimum -90, maximum 90 Example: |
place_b.longitudenumberRequired | Limits: minimum -180, maximum 180 Example: |
place_b.labelstringOptional | Name to echo back, e.g. Tokyo. Default: Limits: at most 120 characters Example: |
as_ofstring | nullOptional | Date whose running dasha is read (YYYY-MM-DD). Today in UTC when omitted. Default: Limits: format date 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.
as_of· stringrunning· objectdistance_between_km· numberplace_a· objectplace_b· objectper_goal· objecttotal_a· numbertotal_b· numberoverall_winner· string
Example request
curl -X POST https://api.96astro.com/v1/location-astrology/compare-locations \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209,
"place_a": {
"latitude": 35.6762,
"longitude": 139.6503,
"label": "Tokyo"
},
"place_b": {
"latitude": 51.5074,
"longitude": -0.1278,
"label": "London"
},
"as_of": "2026-10-13"
}'const response = await fetch("https://api.96astro.com/v1/location-astrology/compare-locations", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209,
"place_a": {
"latitude": 35.6762,
"longitude": 139.6503,
"label": "Tokyo"
},
"place_b": {
"latitude": 51.5074,
"longitude": -0.1278,
"label": "London"
},
"as_of": "2026-10-13"
}),
});
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.locationAstrology.compareLocations({
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209,
"place_a": {
"latitude": 35.6762,
"longitude": 139.6503,
"label": "Tokyo"
},
"place_b": {
"latitude": 51.5074,
"longitude": -0.1278,
"label": "London"
},
"as_of": "2026-10-13"
});
console.log(data);import requests
response = requests.post(
"https://api.96astro.com/v1/location-astrology/compare-locations",
headers={
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
json={
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209,
"place_a": {
"latitude": 35.6762,
"longitude": 139.6503,
"label": "Tokyo",
},
"place_b": {
"latitude": 51.5074,
"longitude": -0.1278,
"label": "London",
},
"as_of": "2026-10-13",
},
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.location_astrology.compare_locations({
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209,
"place_a": {
"latitude": 35.6762,
"longitude": 139.6503,
"label": "Tokyo",
},
"place_b": {
"latitude": 51.5074,
"longitude": -0.1278,
"label": "London",
},
"as_of": "2026-10-13",
})
print(res.data)<?php
$ch = curl_init('https://api.96astro.com/v1/location-astrology/compare-locations');
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([
'datetime' => '1990-10-18T14:30:00',
'timezone' => 'Asia/Kolkata',
'latitude' => 28.6139,
'longitude' => 77.209,
'place_a' => [
'latitude' => 35.6762,
'longitude' => 139.6503,
'label' => 'Tokyo',
],
'place_b' => [
'latitude' => 51.5074,
'longitude' => -0.1278,
'label' => 'London',
],
'as_of' => '2026-10-13',
]),
]);
$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(`{
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209,
"place_a": {
"latitude": 35.6762,
"longitude": 139.6503,
"label": "Tokyo"
},
"place_b": {
"latitude": 51.5074,
"longitude": -0.1278,
"label": "London"
},
"as_of": "2026-10-13"
}`)
req, err := http.NewRequest("POST", "https://api.96astro.com/v1/location-astrology/compare-locations", 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": {
"as_of": "2026-10-13",
"running": {
"vimshottari": {
"mahadasha": "Jupiter",
"antardasha": "Mars",
"mahadasha_end": "2029-05-30",
"antardasha_end": "2027-01-04"
}
},
"distance_between_km": 9559,
"place_a": {
"place": {
"latitude": 35.6762,
"longitude": 139.6503,
"label": "Tokyo"
},
"ascendant": {
"longitude": 22.3889,
…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.
Char Dasha Schedule (Phaladeepika)
POSTAvailable
https://api.96astro.com/v1/location-astrology/location-char-dashaTwelve-row Char dasha schedule with each sign's lord, years and dates, and the period running on a date.
- Credits
- 1 credit
- Input
- Birth details
- 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 |
|---|---|
datetimestringRequired | Local date and time, ISO 8601 without offset, e.g. 1990-10-18T14:30:00 Limits: format local-date-time, pattern ^\d{4}-\d{2}-\d{2}[T ]\d{2}:\d{2}(:\d{2}(\.\d{1,6})?)?$ Example: |
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: |
ayanamshastringOptional | Default: Allowed values: lahirikrishnamurtiraman |
languagestringOptional | Output language (ISO 639-1). The values listed are the ones this capability supports; any other is refused with 422 unsupported_language. Identifiers, enum values and numbers never change with language. Default: Allowed value: en |
as_ofstring | nullOptional | Date for `current` (YYYY-MM-DD). Today in UTC when omitted. Default: Limits: format date 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.
method· stringayanamsha· stringascendant_sign· stringascendant_sign_type· stringtotal_years· integerperiods· array of objectcurrent· object
Example request
curl -X POST https://api.96astro.com/v1/location-astrology/location-char-dasha \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209,
"as_of": "2026-10-13"
}'const response = await fetch("https://api.96astro.com/v1/location-astrology/location-char-dasha", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209,
"as_of": "2026-10-13"
}),
});
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.locationAstrology.locationCharDasha({
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209,
"as_of": "2026-10-13"
});
console.log(data);import requests
response = requests.post(
"https://api.96astro.com/v1/location-astrology/location-char-dasha",
headers={
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
json={
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209,
"as_of": "2026-10-13",
},
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.location_astrology.location_char_dasha({
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209,
"as_of": "2026-10-13",
})
print(res.data)<?php
$ch = curl_init('https://api.96astro.com/v1/location-astrology/location-char-dasha');
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([
'datetime' => '1990-10-18T14:30:00',
'timezone' => 'Asia/Kolkata',
'latitude' => 28.6139,
'longitude' => 77.209,
'as_of' => '2026-10-13',
]),
]);
$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(`{
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209,
"as_of": "2026-10-13"
}`)
req, err := http.NewRequest("POST", "https://api.96astro.com/v1/location-astrology/location-char-dasha", 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": {
"method": "phaladeepika",
"ayanamsha": "lahiri",
"ascendant_sign": "Capricorn",
"ascendant_sign_type": "movable",
"total_years": 75,
"periods": [
{
"sign": "Capricorn",
"sign_type": "movable",
"lord": "Saturn",
"lord_sign": "Sagittarius",
"years": 11,
"start": "1990-10-18",
"end": "2001-10-17"
},
{
"sign": "Aquarius",
"sign_type": "fixed",
…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.
Yogini Dasha Schedule
POSTAvailable
https://api.96astro.com/v1/location-astrology/location-yogini-dashaLifetime Yogini schedule from the birth nakshatra with each period's lord, years and dates, and the period running on a date.
- Credits
- 1 credit
- Input
- Birth details
- 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 |
|---|---|
datetimestringRequired | Local date and time, ISO 8601 without offset, e.g. 1990-10-18T14:30:00 Limits: format local-date-time, pattern ^\d{4}-\d{2}-\d{2}[T ]\d{2}:\d{2}(:\d{2}(\.\d{1,6})?)?$ Example: |
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: |
ayanamshastringOptional | Default: Allowed values: lahirikrishnamurtiraman |
languagestringOptional | Output language (ISO 639-1). The values listed are the ones this capability supports; any other is refused with 422 unsupported_language. Identifiers, enum values and numbers never change with language. Default: Allowed value: en |
as_ofstring | nullOptional | Date for `current` (YYYY-MM-DD). Today in UTC when omitted. Default: Limits: format date 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.
ayanamsha· stringjanma_nakshatra· stringjanma_yogini· stringjanma_lord· stringbalance_at_birth_years· numbercycle_years· integerperiods· array of objectcurrent· object
Example request
curl -X POST https://api.96astro.com/v1/location-astrology/location-yogini-dasha \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209,
"as_of": "2026-10-13"
}'const response = await fetch("https://api.96astro.com/v1/location-astrology/location-yogini-dasha", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209,
"as_of": "2026-10-13"
}),
});
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.locationAstrology.locationYoginiDasha({
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209,
"as_of": "2026-10-13"
});
console.log(data);import requests
response = requests.post(
"https://api.96astro.com/v1/location-astrology/location-yogini-dasha",
headers={
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
json={
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209,
"as_of": "2026-10-13",
},
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.location_astrology.location_yogini_dasha({
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209,
"as_of": "2026-10-13",
})
print(res.data)<?php
$ch = curl_init('https://api.96astro.com/v1/location-astrology/location-yogini-dasha');
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([
'datetime' => '1990-10-18T14:30:00',
'timezone' => 'Asia/Kolkata',
'latitude' => 28.6139,
'longitude' => 77.209,
'as_of' => '2026-10-13',
]),
]);
$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(`{
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209,
"as_of": "2026-10-13"
}`)
req, err := http.NewRequest("POST", "https://api.96astro.com/v1/location-astrology/location-yogini-dasha", 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": {
"ayanamsha": "lahiri",
"janma_nakshatra": "Chitra",
"janma_yogini": "Mangala",
"janma_lord": "Moon",
"balance_at_birth_years": 0.659,
"cycle_years": 36,
"periods": [
{
"yogini": "Mangala",
"lord": "Moon",
"years": 0.659,
"start": "1990-10-18",
"end": "1991-06-16"
},
{
"yogini": "Pingala",
"lord": "Sun",
"years": 2,
…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.
Solar Return Moment
POSTAvailable
https://api.96astro.com/v1/location-astrology/solar-returnThe sidereal solar return instant for a target year, returned as birth data for reuse.
- Credits
- 1 credit
- Input
- Birth details
- 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 |
|---|---|
datetimestringRequired | Local date and time, ISO 8601 without offset, e.g. 1990-10-18T14:30:00 Limits: format local-date-time, pattern ^\d{4}-\d{2}-\d{2}[T ]\d{2}:\d{2}(:\d{2}(\.\d{1,6})?)?$ Example: |
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: |
ayanamshastringOptional | Default: Allowed values: lahirikrishnamurtiraman |
languagestringOptional | Output language (ISO 639-1). The values listed are the ones this capability supports; any other is refused with 422 unsupported_language. Identifiers, enum values and numbers never change with language. Default: Allowed value: en |
yearintegerRequired | Year of the solar return. Limits: minimum 1001, maximum 2200 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.
year· integerayanamsha· stringnatal_sun_longitude· numberjulian_day_ut· numbermoment_utc· stringminutes_off_birthday· numbermoment_local· object
Example request
curl -X POST https://api.96astro.com/v1/location-astrology/solar-return \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209,
"year": 2026
}'const response = await fetch("https://api.96astro.com/v1/location-astrology/solar-return", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209,
"year": 2026
}),
});
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.locationAstrology.solarReturn({
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209,
"year": 2026
});
console.log(data);import requests
response = requests.post(
"https://api.96astro.com/v1/location-astrology/solar-return",
headers={
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
json={
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209,
"year": 2026,
},
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.location_astrology.solar_return({
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209,
"year": 2026,
})
print(res.data)<?php
$ch = curl_init('https://api.96astro.com/v1/location-astrology/solar-return');
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([
'datetime' => '1990-10-18T14:30:00',
'timezone' => 'Asia/Kolkata',
'latitude' => 28.6139,
'longitude' => 77.209,
'year' => 2026,
]),
]);
$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(`{
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209,
"year": 2026
}`)
req, err := http.NewRequest("POST", "https://api.96astro.com/v1/location-astrology/solar-return", 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,
"ayanamsha": "lahiri",
"natal_sun_longitude": 180.9951,
"julian_day_ut": 2461332.101061,
"moment_utc": "2026-10-18T14:25:32Z",
"minutes_off_birthday": 325.5,
"moment_local": {
"datetime": "2026-10-18T19:55:32",
"timezone": "Asia/Kolkata",
"utc_offset": "+05:30"
}
},
"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.
Davison Relationship Chart
POSTAvailable
https://api.96astro.com/v1/location-astrology/davison-chartTime and place midpoint of two births, returned as birth data for reuse.
- Credits
- 1 credit
- Input
- Two people's birth details
- 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 |
|---|---|
person_aobjectRequired | For routes whose engine ignores the ayanamsha (geometry, or Lahiri fixed). |
person_a.datetimestringRequired | Local date and time, ISO 8601 without offset, e.g. 1990-10-18T14:30:00 Limits: format local-date-time, pattern ^\d{4}-\d{2}-\d{2}[T ]\d{2}:\d{2}(:\d{2}(\.\d{1,6})?)?$ Example: |
person_a.timezonestring | nullOptional | IANA time zone, e.g. Asia/Kolkata Default: Example: |
person_a.utc_offsetstring | nullOptional | Fixed offset such as +05:30, if no IANA zone is known Default: |
person_a.latitudenumberRequired | Limits: minimum -90, maximum 90 Example: |
person_a.longitudenumberRequired | Limits: minimum -180, maximum 180 Example: |
person_a.ayanamshastringOptional | This capability is computed with Lahiri only. Default: Allowed value: lahiri |
person_a.languagestringOptional | Output language (ISO 639-1). Each capability lists the languages it supports. Default: |
person_bobjectRequired | For routes whose engine ignores the ayanamsha (geometry, or Lahiri fixed). |
person_b.datetimestringRequired | Local date and time, ISO 8601 without offset, e.g. 1990-10-18T14:30:00 Limits: format local-date-time, pattern ^\d{4}-\d{2}-\d{2}[T ]\d{2}:\d{2}(:\d{2}(\.\d{1,6})?)?$ Example: |
person_b.timezonestring | nullOptional | IANA time zone, e.g. Asia/Kolkata Default: Example: |
person_b.utc_offsetstring | nullOptional | Fixed offset such as +05:30, if no IANA zone is known Default: |
person_b.latitudenumberRequired | Limits: minimum -90, maximum 90 Example: |
person_b.longitudenumberRequired | Limits: minimum -180, maximum 180 Example: |
person_b.ayanamshastringOptional | This capability is computed with Lahiri only. Default: Allowed value: lahiri |
person_b.languagestringOptional | Output language (ISO 639-1). Each capability lists the languages it supports. Default: |
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.
julian_day_ut· numbermoment_utc· stringlatitude· numberlongitude· numberyears_apart· numberdistance_apart_km· numberas_birth· object
Example request
curl -X POST https://api.96astro.com/v1/location-astrology/davison-chart \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"person_a": {
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209
},
"person_b": {
"datetime": "1992-03-02T05:47:00",
"timezone": "Asia/Kolkata",
"latitude": 19.0767,
"longitude": 72.8767
}
}'const response = await fetch("https://api.96astro.com/v1/location-astrology/davison-chart", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
"person_a": {
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209
},
"person_b": {
"datetime": "1992-03-02T05:47:00",
"timezone": "Asia/Kolkata",
"latitude": 19.0767,
"longitude": 72.8767
}
}),
});
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.locationAstrology.davisonChart({
"person_a": {
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209
},
"person_b": {
"datetime": "1992-03-02T05:47:00",
"timezone": "Asia/Kolkata",
"latitude": 19.0767,
"longitude": 72.8767
}
});
console.log(data);import requests
response = requests.post(
"https://api.96astro.com/v1/location-astrology/davison-chart",
headers={
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
json={
"person_a": {
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209,
},
"person_b": {
"datetime": "1992-03-02T05:47:00",
"timezone": "Asia/Kolkata",
"latitude": 19.0767,
"longitude": 72.8767,
},
},
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.location_astrology.davison_chart({
"person_a": {
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209,
},
"person_b": {
"datetime": "1992-03-02T05:47:00",
"timezone": "Asia/Kolkata",
"latitude": 19.0767,
"longitude": 72.8767,
},
})
print(res.data)<?php
$ch = curl_init('https://api.96astro.com/v1/location-astrology/davison-chart');
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([
'person_a' => [
'datetime' => '1990-10-18T14:30:00',
'timezone' => 'Asia/Kolkata',
'latitude' => 28.6139,
'longitude' => 77.209,
],
'person_b' => [
'datetime' => '1992-03-02T05:47:00',
'timezone' => 'Asia/Kolkata',
'latitude' => 19.0767,
'longitude' => 72.8767,
],
]),
]);
$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(`{
"person_a": {
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209
},
"person_b": {
"datetime": "1992-03-02T05:47:00",
"timezone": "Asia/Kolkata",
"latitude": 19.0767,
"longitude": 72.8767
}
}`)
req, err := http.NewRequest("POST", "https://api.96astro.com/v1/location-astrology/davison-chart", 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": {
"julian_day_ut": 2448433.193403,
"moment_utc": "1991-06-25T16:38:30Z",
"latitude": 23.860427,
"longitude": 74.962943,
"years_apart": 1.37,
"distance_apart_km": 1148,
"as_birth": {
"datetime": "1991-06-25T16:38:30",
"utc_offset": "+00:00",
"latitude": 23.860427,
"longitude": 74.962943
}
},
"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.
Navatara by Place
POSTAvailable
https://api.96astro.com/v1/location-astrology/location-navataraThe tara of the nakshatras rising and culminating at a place, counted from the birth nakshatra, with a reading; or catalogue cities ranked by it.
- Credits
- 1 credit
- Input
- Birth details
- 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 |
|---|---|
datetimestringRequired | Local date and time, ISO 8601 without offset, e.g. 1990-10-18T14:30:00 Limits: format local-date-time, pattern ^\d{4}-\d{2}-\d{2}[T ]\d{2}:\d{2}(:\d{2}(\.\d{1,6})?)?$ Example: |
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: |
ayanamshastringOptional | Default: Allowed values: lahirikrishnamurtiraman |
languagestringOptional | Output language (ISO 639-1). The values listed are the ones this capability supports; any other is refused with 422 unsupported_language. Identifiers, enum values and numbers never change with language. Default: Allowed value: en |
variantstringOptional | One place, or every catalogue city ranked. Default: Allowed values: placeranking |
placeobject | nullOptional | For `place`; the birthplace when omitted. Default: |
place.latitudenumberRequired | Limits: minimum -90, maximum 90 |
place.longitudenumberRequired | Limits: minimum -180, maximum 180 |
place.labelstringOptional | Name to echo back, e.g. Tokyo. Default: Limits: at most 120 characters |
limitintegerOptional | For `ranking`: how many cities to return. Default: Limits: minimum 1, maximum 100 |
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 |
|---|---|
place | Single place (lat/lon) |
ranking | City ranking |
Response · fields in data
Inferred from the example response: a guide to the shape, not a contract.
variant· stringrule· stringplace· objectjanma_nakshatra· stringrising· objectreading· stringmidheaven· objectangles_agree· boolean
Example request
curl -X POST https://api.96astro.com/v1/location-astrology/location-navatara \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209
}'const response = await fetch("https://api.96astro.com/v1/location-astrology/location-navatara", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
"datetime": "1990-10-18T14:30:00",
"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.locationAstrology.locationNavatara({
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209
});
console.log(data);import requests
response = requests.post(
"https://api.96astro.com/v1/location-astrology/location-navatara",
headers={
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
json={
"datetime": "1990-10-18T14:30:00",
"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.location_astrology.location_navatara({
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209,
})
print(res.data)<?php
$ch = curl_init('https://api.96astro.com/v1/location-astrology/location-navatara');
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([
'datetime' => '1990-10-18T14:30:00',
'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(`{
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209
}`)
req, err := http.NewRequest("POST", "https://api.96astro.com/v1/location-astrology/location-navatara", 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": {
"variant": "place",
"rule": "tara = (rising nakshatra - janma nakshatra) mod 9",
"place": {
"latitude": 28.6139,
"longitude": 77.209,
"label": null
},
"janma_nakshatra": "Chitra",
"rising": {
"nakshatra": "Dhanishta",
"sign": "Capricorn",
"tara": {
"number": 1,
"name": "Janma",
"alternate_name": null,
"nature": "Neutral / Tense",
"score": 40,
"nakshatra_lord": "Mars",
…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.
Region Analysis
POSTAvailable
https://api.96astro.com/v1/location-astrology/zone-analysisScores a drawn polygon or bounding box from the cities inside it, with lines and strongest planets.
- Credits
- 3 credits
- Input
- Birth details
- 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 |
|---|---|
datetimestringRequired | Local date and time, ISO 8601 without offset, e.g. 1990-10-18T14:30:00 Limits: format local-date-time, pattern ^\d{4}-\d{2}-\d{2}[T ]\d{2}:\d{2}(:\d{2}(\.\d{1,6})?)?$ Example: |
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: |
ayanamshastringOptional | This capability is computed with Lahiri only. Default: Allowed value: lahiri |
languagestringOptional | Output language (ISO 639-1). The values listed are the ones this capability supports; any other is refused with 422 unsupported_language. Identifiers, enum values and numbers never change with language. Default: Allowed value: en |
polygonarray of objects | nullOptional | Region outline, 3+ vertices. Default: Limits: 3 to 500 items |
polygon[].latitudenumberRequired | Limits: minimum -90, maximum 90 |
polygon[].longitudenumberRequired | Limits: minimum -180, maximum 180 |
bboxobject | nullOptional | Default: |
bbox.westnumberRequired | Limits: minimum -180, maximum 180 Example: |
bbox.southnumberRequired | Limits: minimum -90, maximum 90 Example: |
bbox.eastnumberRequired | May be less than west for a box across the antimeridian. Limits: minimum -180, maximum 180 Example: |
bbox.northnumberRequired | Limits: minimum -90, maximum 90 Example: |
goalstring | nullOptional | Score for one goal; the mean of all sixteen when omitted. Default: Allowed values: careermarriagewealthspiritualhealtheducationpeacechildrenpropertyromancefameforeigntravelpoliticsartsbusiness 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 |
| Value | Meaning |
|---|---|
career | Career |
marriage | Marriage |
wealth | Wealth |
spiritual | Spiritual |
health | Health |
education | Education |
peace | Peace of mind |
children | Children |
property | Property |
romance | Romance |
fame | Fame |
foreign | Foreign settlement |
travel | Travel |
politics | Politics |
arts | Arts |
business | Business |
Response · fields in data
Inferred from the example response: a guide to the shape, not a contract.
goal· stringformula· array of objectarea_km2· numbercities_inside· integercities_in_catalogue· integerscore· objectbest_goals· array of objectlines_crossing· array of objectparans_inside· array of objectstrongest_planets· array of objecttop_cities· array of objectbounds· object
Example request
curl -X POST https://api.96astro.com/v1/location-astrology/zone-analysis \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209,
"bbox": {
"west": -10,
"south": 35,
"east": 30,
"north": 60
},
"goal": "career"
}'const response = await fetch("https://api.96astro.com/v1/location-astrology/zone-analysis", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209,
"bbox": {
"west": -10,
"south": 35,
"east": 30,
"north": 60
},
"goal": "career"
}),
});
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.locationAstrology.zoneAnalysis({
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209,
"bbox": {
"west": -10,
"south": 35,
"east": 30,
"north": 60
},
"goal": "career"
});
console.log(data);import requests
response = requests.post(
"https://api.96astro.com/v1/location-astrology/zone-analysis",
headers={
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
json={
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209,
"bbox": {
"west": -10,
"south": 35,
"east": 30,
"north": 60,
},
"goal": "career",
},
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.location_astrology.zone_analysis({
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209,
"bbox": {
"west": -10,
"south": 35,
"east": 30,
"north": 60,
},
"goal": "career",
})
print(res.data)<?php
$ch = curl_init('https://api.96astro.com/v1/location-astrology/zone-analysis');
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([
'datetime' => '1990-10-18T14:30:00',
'timezone' => 'Asia/Kolkata',
'latitude' => 28.6139,
'longitude' => 77.209,
'bbox' => [
'west' => -10,
'south' => 35,
'east' => 30,
'north' => 60,
],
'goal' => 'career',
]),
]);
$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(`{
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209,
"bbox": {
"west": -10,
"south": 35,
"east": 30,
"north": 60
},
"goal": "career"
}`)
req, err := http.NewRequest("POST", "https://api.96astro.com/v1/location-astrology/zone-analysis", 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": {
"goal": "career",
"formula": [
{
"house": 10,
"weight": 0.4
},
{
"house": 11,
"weight": 0.3
},
{
"house": 6,
"weight": 0.2
}
],
"area_km2": 8287124,
"cities_inside": 55,
"cities_in_catalogue": 246,
…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.
Local Space Directions
POSTAvailable
https://api.96astro.com/v1/location-astrology/local-spaceEach planet's compass bearing and altitude from where the person stands, with its themes and the cities along its great-circle ray.
- Credits
- 1 credit
- Input
- Birth details
- 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 |
|---|---|
datetimestringRequired | Local date and time, ISO 8601 without offset, e.g. 1990-10-18T14:30:00 Limits: format local-date-time, pattern ^\d{4}-\d{2}-\d{2}[T ]\d{2}:\d{2}(:\d{2}(\.\d{1,6})?)?$ Example: |
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: |
ayanamshastringOptional | This capability is computed with Lahiri only. Default: Allowed value: lahiri |
languagestringOptional | Output language (ISO 639-1). The values listed are the ones this capability supports; any other is refused with 422 unsupported_language. Identifiers, enum values and numbers never change with language. Default: Allowed value: en |
observerobject | nullOptional | Where the native stands now; the birthplace when omitted. Default: |
observer.latitudenumberRequired | Limits: minimum -90, maximum 90 Example: |
observer.longitudenumberRequired | Limits: minimum -180, maximum 180 Example: |
observer.labelstringOptional | Name to echo back, e.g. Tokyo. Default: Limits: at most 120 characters Example: |
corridor_kmnumberOptional | How near a city must lie to a ray to be listed. Default: Limits: minimum 10, maximum 2000 |
nodestringOptional | Lunar node: true (osculating) or mean. Default: Allowed values: truemean |
topocentricbooleanOptional | Parallax-correct positions for the observer. Default: |
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.
coordinates· stringobserver· objectnode· stringtopocentric· booleanlocal_sidereal_time_degrees· numbercorridor_km· numberrays· array of object
Example request
curl -X POST https://api.96astro.com/v1/location-astrology/local-space \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209,
"observer": {
"latitude": 51.5074,
"longitude": -0.1278,
"label": "London"
}
}'const response = await fetch("https://api.96astro.com/v1/location-astrology/local-space", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209,
"observer": {
"latitude": 51.5074,
"longitude": -0.1278,
"label": "London"
}
}),
});
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.locationAstrology.localSpace({
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209,
"observer": {
"latitude": 51.5074,
"longitude": -0.1278,
"label": "London"
}
});
console.log(data);import requests
response = requests.post(
"https://api.96astro.com/v1/location-astrology/local-space",
headers={
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
json={
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209,
"observer": {
"latitude": 51.5074,
"longitude": -0.1278,
"label": "London",
},
},
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.location_astrology.local_space({
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209,
"observer": {
"latitude": 51.5074,
"longitude": -0.1278,
"label": "London",
},
})
print(res.data)<?php
$ch = curl_init('https://api.96astro.com/v1/location-astrology/local-space');
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([
'datetime' => '1990-10-18T14:30:00',
'timezone' => 'Asia/Kolkata',
'latitude' => 28.6139,
'longitude' => 77.209,
'observer' => [
'latitude' => 51.5074,
'longitude' => -0.1278,
'label' => 'London',
],
]),
]);
$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(`{
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209,
"observer": {
"latitude": 51.5074,
"longitude": -0.1278,
"label": "London"
}
}`)
req, err := http.NewRequest("POST", "https://api.96astro.com/v1/location-astrology/local-space", 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": {
"coordinates": "Points are [longitude, latitude] in signed decimal degrees (east and north positive), GeoJSON order.",
"observer": {
"latitude": 51.5074,
"longitude": -0.1278,
"label": "London"
},
"node": "true",
"topocentric": false,
"local_sidereal_time_degrees": 161.4665,
"corridor_km": 300,
"rays": [
{
"planet": "Jupiter",
"azimuth": 223.95,
"altitude": 49.77,
"above_horizon": true,
"compass": "SW",
"themes": [
…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.
Location Goal Catalogue
POSTAvailable
https://api.96astro.com/v1/location-astrology/location-categoriesThe scoring goals with their house formulas and significators.
- 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 |
|---|---|
goalstring | nullOptional | Return only this goal; all sixteen when omitted. Default: Allowed values: careermarriagewealthspiritualhealtheducationpeacechildrenpropertyromancefameforeigntravelpoliticsartsbusiness 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.
goals· array of object
Example request
curl -X POST https://api.96astro.com/v1/location-astrology/location-categories \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"goal": "career"
}'const response = await fetch("https://api.96astro.com/v1/location-astrology/location-categories", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
"goal": "career"
}),
});
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.locationAstrology.locationCategories({
"goal": "career"
});
console.log(data);import requests
response = requests.post(
"https://api.96astro.com/v1/location-astrology/location-categories",
headers={
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
json={
"goal": "career",
},
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.location_astrology.location_categories({
"goal": "career",
})
print(res.data)<?php
$ch = curl_init('https://api.96astro.com/v1/location-astrology/location-categories');
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([
'goal' => 'career',
]),
]);
$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(`{
"goal": "career"
}`)
req, err := http.NewRequest("POST", "https://api.96astro.com/v1/location-astrology/location-categories", 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": {
"goals": [
{
"id": "career",
"houses": [
10,
11,
6
],
"formula": [
{
"house": 10,
"weight": 0.4
},
{
"house": 11,
"weight": 0.3
},
{
…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.