API reference / Compatibility matching
Compatibility matching
Vedic and South Indian compatibility between two people, from full charts or from birth stars, singly or in bulk.
13 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.
Kundli Matching (Ayu Milan)
POSTAvailable
https://api.96astro.com/v1/matching/ayu-milanAshtakoot matching from two births: koota scores and total, Manglik for both with cancellations, Papasamya, Rajju and Vedha, and classical longevity (Ayurdaya) spans for each.
- Credits
- 3 credits
- 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 |
|---|---|
groomobjectRequired | |
groom.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: |
groom.timezonestring | nullOptional | IANA time zone, e.g. Asia/Kolkata Default: Example: |
groom.utc_offsetstring | nullOptional | Fixed offset such as +05:30, if no IANA zone is known Default: |
groom.latitudenumberRequired | Limits: minimum -90, maximum 90 Example: |
groom.longitudenumberRequired | Limits: minimum -180, maximum 180 Example: |
groom.ayanamshastringOptional | Default: |
groom.languagestringOptional | Output language (ISO 639-1). Each capability lists the languages it supports. Default: |
groom.nodestringOptional | Lunar node: true (osculating) or mean. Default: Allowed values: truemean |
brideobjectRequired | |
bride.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: |
bride.timezonestring | nullOptional | IANA time zone, e.g. Asia/Kolkata Default: Example: |
bride.utc_offsetstring | nullOptional | Fixed offset such as +05:30, if no IANA zone is known Default: |
bride.latitudenumberRequired | Limits: minimum -90, maximum 90 Example: |
bride.longitudenumberRequired | Limits: minimum -180, maximum 180 Example: |
bride.ayanamshastringOptional | Default: |
bride.languagestringOptional | Output language (ISO 639-1). Each capability lists the languages it supports. Default: |
bride.nodestringOptional | Lunar node: true (osculating) or mean. Default: Allowed values: truemean |
report_typestringOptional | half: the matching tables. full: also both birth charts' positions. Default: Allowed values: fullhalf 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 |
|---|---|
full | Full (with both charts and images) |
half | Half (matching tables only) |
Response · fields in data
Inferred from the example response: a guide to the shape, not a contract.
ayanamsha· objectreport_type· stringgroom· objectbride· objectashtakoot· objectmanglik· objectpapasamya· objectrajju· objectvedha· nulllongevity· object
Example request
curl -X POST https://api.96astro.com/v1/matching/ayu-milan \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"groom": {
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209
},
"bride": {
"datetime": "1992-03-02T05:47:00",
"timezone": "Asia/Kolkata",
"latitude": 19.0767,
"longitude": 72.8767
},
"report_type": "half"
}'const response = await fetch("https://api.96astro.com/v1/matching/ayu-milan", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
"groom": {
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209
},
"bride": {
"datetime": "1992-03-02T05:47:00",
"timezone": "Asia/Kolkata",
"latitude": 19.0767,
"longitude": 72.8767
},
"report_type": "half"
}),
});
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.matching.ayuMilan({
"groom": {
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209
},
"bride": {
"datetime": "1992-03-02T05:47:00",
"timezone": "Asia/Kolkata",
"latitude": 19.0767,
"longitude": 72.8767
},
"report_type": "half"
});
console.log(data);import requests
response = requests.post(
"https://api.96astro.com/v1/matching/ayu-milan",
headers={
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
json={
"groom": {
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209,
},
"bride": {
"datetime": "1992-03-02T05:47:00",
"timezone": "Asia/Kolkata",
"latitude": 19.0767,
"longitude": 72.8767,
},
"report_type": "half",
},
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.matching.ayu_milan({
"groom": {
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209,
},
"bride": {
"datetime": "1992-03-02T05:47:00",
"timezone": "Asia/Kolkata",
"latitude": 19.0767,
"longitude": 72.8767,
},
"report_type": "half",
})
print(res.data)<?php
$ch = curl_init('https://api.96astro.com/v1/matching/ayu-milan');
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([
'groom' => [
'datetime' => '1990-10-18T14:30:00',
'timezone' => 'Asia/Kolkata',
'latitude' => 28.6139,
'longitude' => 77.209,
],
'bride' => [
'datetime' => '1992-03-02T05:47:00',
'timezone' => 'Asia/Kolkata',
'latitude' => 19.0767,
'longitude' => 72.8767,
],
'report_type' => 'half',
]),
]);
$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(`{
"groom": {
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209
},
"bride": {
"datetime": "1992-03-02T05:47:00",
"timezone": "Asia/Kolkata",
"latitude": 19.0767,
"longitude": 72.8767
},
"report_type": "half"
}`)
req, err := http.NewRequest("POST", "https://api.96astro.com/v1/matching/ayu-milan", 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": {
"id": "lahiri",
"name": "N.C. Lahiri",
"degrees": 23.7285
},
"report_type": "half",
"groom": {
"moon_sign": "Virgo",
"nakshatra": "Chitra",
"pada": 2
},
"bride": {
"moon_sign": "Capricorn",
"nakshatra": "Shravana",
"pada": 3
},
"ashtakoot": {
"total": 19,
…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.
Quick Nakshatra Match
POSTAvailable
https://api.96astro.com/v1/matching/quick-matchAshtakoot score from two birth stars (optionally with padas): total, percentage, verdict, each koota's score and the Nadi and Bhakoot doshas.
- Credits
- 1 credit
- Input
- Specific 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 |
|---|---|
groomobjectRequired | |
groom.nakshatrastringRequired | Moon's nakshatra, e.g. Rohini. Example: |
groom.padainteger | nullOptional | Moon's pada (1-4). Makes the score exact. Default: Limits: minimum 1, maximum 4 Example: |
brideobjectRequired | |
bride.nakshatrastringRequired | Moon's nakshatra, e.g. Rohini. Example: |
bride.padainteger | nullOptional | Moon's pada (1-4). Makes the score exact. Default: Limits: minimum 1, maximum 4 Example: |
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 |
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.
system· stringtotal· numbermaximum· integerpercentage· numberverdict· stringexact· booleangroom· objectbride· objectkootas· array of objectdoshas· object
Example request
curl -X POST https://api.96astro.com/v1/matching/quick-match \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"groom": {
"nakshatra": "Rohini",
"pada": 2
},
"bride": {
"nakshatra": "Hasta",
"pada": 1
}
}'const response = await fetch("https://api.96astro.com/v1/matching/quick-match", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
"groom": {
"nakshatra": "Rohini",
"pada": 2
},
"bride": {
"nakshatra": "Hasta",
"pada": 1
}
}),
});
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.matching.quickMatch({
"groom": {
"nakshatra": "Rohini",
"pada": 2
},
"bride": {
"nakshatra": "Hasta",
"pada": 1
}
});
console.log(data);import requests
response = requests.post(
"https://api.96astro.com/v1/matching/quick-match",
headers={
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
json={
"groom": {
"nakshatra": "Rohini",
"pada": 2,
},
"bride": {
"nakshatra": "Hasta",
"pada": 1,
},
},
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.matching.quick_match({
"groom": {
"nakshatra": "Rohini",
"pada": 2,
},
"bride": {
"nakshatra": "Hasta",
"pada": 1,
},
})
print(res.data)<?php
$ch = curl_init('https://api.96astro.com/v1/matching/quick-match');
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([
'groom' => [
'nakshatra' => 'Rohini',
'pada' => 2,
],
'bride' => [
'nakshatra' => 'Hasta',
'pada' => 1,
],
]),
]);
$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(`{
"groom": {
"nakshatra": "Rohini",
"pada": 2
},
"bride": {
"nakshatra": "Hasta",
"pada": 1
}
}`)
req, err := http.NewRequest("POST", "https://api.96astro.com/v1/matching/quick-match", 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": {
"system": "ashtakoot",
"total": 25,
"maximum": 36,
"percentage": 69.4,
"verdict": "Good",
"exact": true,
"groom": {
"nakshatra": "Rohini",
"pada": 2,
"moon_sign": "Taurus",
"moon_sign_lord": "Venus"
},
"bride": {
"nakshatra": "Hasta",
"pada": 1,
"moon_sign": "Virgo",
"moon_sign_lord": "Mercury"
},
…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.
Ashtakoot Details
POSTAvailable
https://api.96astro.com/v1/matching/ashtakoot-detailsKoota-by-koota Ashtakoot breakdown for two birth stars, with each side's profile, the total, verdict and Nadi and Bhakoot doshas.
- Credits
- 1 credit
- Input
- Specific 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 |
|---|---|
groomobjectRequired | |
groom.nakshatrastringRequired | Moon's nakshatra, e.g. Rohini. Example: |
groom.padainteger | nullOptional | Moon's pada (1-4). Makes the score exact. Default: Limits: minimum 1, maximum 4 Example: |
brideobjectRequired | |
bride.nakshatrastringRequired | Moon's nakshatra, e.g. Rohini. Example: |
bride.padainteger | nullOptional | Moon's pada (1-4). Makes the score exact. Default: Limits: minimum 1, maximum 4 Example: |
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 |
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.
system· stringtotal· numbermaximum· integerpercentage· numberverdict· stringexact· booleangroom· objectbride· objectkootas· array of objectdoshas· object
Example request
curl -X POST https://api.96astro.com/v1/matching/ashtakoot-details \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"groom": {
"nakshatra": "Rohini",
"pada": 2
},
"bride": {
"nakshatra": "Hasta",
"pada": 1
}
}'const response = await fetch("https://api.96astro.com/v1/matching/ashtakoot-details", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
"groom": {
"nakshatra": "Rohini",
"pada": 2
},
"bride": {
"nakshatra": "Hasta",
"pada": 1
}
}),
});
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.matching.ashtakootDetails({
"groom": {
"nakshatra": "Rohini",
"pada": 2
},
"bride": {
"nakshatra": "Hasta",
"pada": 1
}
});
console.log(data);import requests
response = requests.post(
"https://api.96astro.com/v1/matching/ashtakoot-details",
headers={
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
json={
"groom": {
"nakshatra": "Rohini",
"pada": 2,
},
"bride": {
"nakshatra": "Hasta",
"pada": 1,
},
},
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.matching.ashtakoot_details({
"groom": {
"nakshatra": "Rohini",
"pada": 2,
},
"bride": {
"nakshatra": "Hasta",
"pada": 1,
},
})
print(res.data)<?php
$ch = curl_init('https://api.96astro.com/v1/matching/ashtakoot-details');
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([
'groom' => [
'nakshatra' => 'Rohini',
'pada' => 2,
],
'bride' => [
'nakshatra' => 'Hasta',
'pada' => 1,
],
]),
]);
$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(`{
"groom": {
"nakshatra": "Rohini",
"pada": 2
},
"bride": {
"nakshatra": "Hasta",
"pada": 1
}
}`)
req, err := http.NewRequest("POST", "https://api.96astro.com/v1/matching/ashtakoot-details", 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": {
"system": "ashtakoot",
"total": 25,
"maximum": 36,
"percentage": 69.4,
"verdict": "Good",
"exact": true,
"groom": {
"nakshatra": "Rohini",
"pada": 2,
"moon_sign": "Taurus",
"moon_sign_lord": "Venus",
"profile": {
"number": 4,
"deity": "Brahma/Prajapati",
"symbol": "Oxcart/Temple",
"element": "Earth",
"nature": "Fixed (Sthira)",
"gana": "Manushya",
…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.
Dashakoot Match (Ashtakoot + Rajju + Vedha)
POSTAvailable
https://api.96astro.com/v1/matching/south-matchTen-koota match from two birth stars: the eight Ashtakoot kootas plus Rajju and Vedha.
- Credits
- 1 credit
- Input
- Specific 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 |
|---|---|
groomobjectRequired | |
groom.nakshatrastringRequired | Moon's nakshatra, e.g. Rohini. Example: |
groom.padainteger | nullOptional | Moon's pada (1-4). Makes the score exact. Default: Limits: minimum 1, maximum 4 Example: |
brideobjectRequired | |
bride.nakshatrastringRequired | Moon's nakshatra, e.g. Rohini. Example: |
bride.padainteger | nullOptional | Moon's pada (1-4). Makes the score exact. Default: Limits: minimum 1, maximum 4 Example: |
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 |
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.
system· stringtotal· numbermaximum· integerpercentage· numberverdict· stringexact· booleangroom· objectbride· objectkootas· array of objectdoshas· objectrajju· objectvedha· objectcombined· object
Example request
curl -X POST https://api.96astro.com/v1/matching/south-match \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"groom": {
"nakshatra": "Rohini",
"pada": 2
},
"bride": {
"nakshatra": "Hasta",
"pada": 1
}
}'const response = await fetch("https://api.96astro.com/v1/matching/south-match", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
"groom": {
"nakshatra": "Rohini",
"pada": 2
},
"bride": {
"nakshatra": "Hasta",
"pada": 1
}
}),
});
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.matching.southMatch({
"groom": {
"nakshatra": "Rohini",
"pada": 2
},
"bride": {
"nakshatra": "Hasta",
"pada": 1
}
});
console.log(data);import requests
response = requests.post(
"https://api.96astro.com/v1/matching/south-match",
headers={
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
json={
"groom": {
"nakshatra": "Rohini",
"pada": 2,
},
"bride": {
"nakshatra": "Hasta",
"pada": 1,
},
},
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.matching.south_match({
"groom": {
"nakshatra": "Rohini",
"pada": 2,
},
"bride": {
"nakshatra": "Hasta",
"pada": 1,
},
})
print(res.data)<?php
$ch = curl_init('https://api.96astro.com/v1/matching/south-match');
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([
'groom' => [
'nakshatra' => 'Rohini',
'pada' => 2,
],
'bride' => [
'nakshatra' => 'Hasta',
'pada' => 1,
],
]),
]);
$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(`{
"groom": {
"nakshatra": "Rohini",
"pada": 2
},
"bride": {
"nakshatra": "Hasta",
"pada": 1
}
}`)
req, err := http.NewRequest("POST", "https://api.96astro.com/v1/matching/south-match", 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": {
"system": "ashtakoot_rajju_vedha",
"total": 25,
"maximum": 36,
"percentage": 69.4,
"verdict": "Good",
"exact": true,
"groom": {
"nakshatra": "Rohini",
"pada": 2,
"moon_sign": "Taurus",
"moon_sign_lord": "Venus"
},
"bride": {
"nakshatra": "Hasta",
"pada": 1,
"moon_sign": "Virgo",
"moon_sign_lord": "Mercury"
},
…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.
Porutham (Tamil)
POSTAvailable
https://api.96astro.com/v1/matching/poruthamTamil porutham check for two birth stars: each porutham with present, severity and a reading, and a summary band with objections.
- Credits
- 1 credit
- Input
- Specific 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 |
|---|---|
groomobjectRequired | |
groom.nakshatrastringRequired | Moon's nakshatra, e.g. Rohini. Example: |
groom.padainteger | nullOptional | Moon's pada (1-4). Makes the score exact. Default: Limits: minimum 1, maximum 4 Example: |
brideobjectRequired | |
bride.nakshatrastringRequired | Moon's nakshatra, e.g. Rohini. Example: |
bride.padainteger | nullOptional | Moon's pada (1-4). Makes the score exact. Default: Limits: minimum 1, maximum 4 Example: |
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 |
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.
system· stringgroom· objectbride· objectcount_from_bride· integerporuthams· array of objectsummary· objectscope· array of string
Example request
curl -X POST https://api.96astro.com/v1/matching/porutham \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"groom": {
"nakshatra": "Rohini",
"pada": 2
},
"bride": {
"nakshatra": "Hasta",
"pada": 1
}
}'const response = await fetch("https://api.96astro.com/v1/matching/porutham", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
"groom": {
"nakshatra": "Rohini",
"pada": 2
},
"bride": {
"nakshatra": "Hasta",
"pada": 1
}
}),
});
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.matching.porutham({
"groom": {
"nakshatra": "Rohini",
"pada": 2
},
"bride": {
"nakshatra": "Hasta",
"pada": 1
}
});
console.log(data);import requests
response = requests.post(
"https://api.96astro.com/v1/matching/porutham",
headers={
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
json={
"groom": {
"nakshatra": "Rohini",
"pada": 2,
},
"bride": {
"nakshatra": "Hasta",
"pada": 1,
},
},
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.matching.porutham({
"groom": {
"nakshatra": "Rohini",
"pada": 2,
},
"bride": {
"nakshatra": "Hasta",
"pada": 1,
},
})
print(res.data)<?php
$ch = curl_init('https://api.96astro.com/v1/matching/porutham');
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([
'groom' => [
'nakshatra' => 'Rohini',
'pada' => 2,
],
'bride' => [
'nakshatra' => 'Hasta',
'pada' => 1,
],
]),
]);
$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(`{
"groom": {
"nakshatra": "Rohini",
"pada": 2
},
"bride": {
"nakshatra": "Hasta",
"pada": 1
}
}`)
req, err := http.NewRequest("POST", "https://api.96astro.com/v1/matching/porutham", 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": {
"system": "porutham",
"groom": {
"nakshatra": "Rohini",
"number": 4
},
"bride": {
"nakshatra": "Hasta",
"number": 13
},
"count_from_bride": 19,
"poruthams": [
{
"id": "mahendra",
"name": "Mahendra",
"present": true,
"severity": "favourable",
"reading": "Rohini's star is the 19th from Hasta's, which is one of the Mahendra counts. The porutham is present."
},
…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.
Rajju & Vedha Check
POSTAvailable
https://api.96astro.com/v1/matching/rajju-vedhaRajju and Vedha for two birth stars: each side's cord and body part, same-cord and vedha flags with scores, and any objections.
- Credits
- 1 credit
- Input
- Specific 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 |
|---|---|
groomobjectRequired | |
groom.nakshatrastringRequired | Moon's nakshatra, e.g. Rohini. Example: |
groom.padainteger | nullOptional | Moon's pada (1-4). Makes the score exact. Default: Limits: minimum 1, maximum 4 Example: |
brideobjectRequired | |
bride.nakshatrastringRequired | Moon's nakshatra, e.g. Rohini. Example: |
bride.padainteger | nullOptional | Moon's pada (1-4). Makes the score exact. Default: Limits: minimum 1, maximum 4 Example: |
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 |
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.
groom· objectbride· objectrajju· objectvedha· objectobjections· array of string
Example request
curl -X POST https://api.96astro.com/v1/matching/rajju-vedha \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"groom": {
"nakshatra": "Rohini",
"pada": 2
},
"bride": {
"nakshatra": "Hasta",
"pada": 1
}
}'const response = await fetch("https://api.96astro.com/v1/matching/rajju-vedha", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
"groom": {
"nakshatra": "Rohini",
"pada": 2
},
"bride": {
"nakshatra": "Hasta",
"pada": 1
}
}),
});
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.matching.rajjuVedha({
"groom": {
"nakshatra": "Rohini",
"pada": 2
},
"bride": {
"nakshatra": "Hasta",
"pada": 1
}
});
console.log(data);import requests
response = requests.post(
"https://api.96astro.com/v1/matching/rajju-vedha",
headers={
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
json={
"groom": {
"nakshatra": "Rohini",
"pada": 2,
},
"bride": {
"nakshatra": "Hasta",
"pada": 1,
},
},
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.matching.rajju_vedha({
"groom": {
"nakshatra": "Rohini",
"pada": 2,
},
"bride": {
"nakshatra": "Hasta",
"pada": 1,
},
})
print(res.data)<?php
$ch = curl_init('https://api.96astro.com/v1/matching/rajju-vedha');
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([
'groom' => [
'nakshatra' => 'Rohini',
'pada' => 2,
],
'bride' => [
'nakshatra' => 'Hasta',
'pada' => 1,
],
]),
]);
$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(`{
"groom": {
"nakshatra": "Rohini",
"pada": 2
},
"bride": {
"nakshatra": "Hasta",
"pada": 1
}
}`)
req, err := http.NewRequest("POST", "https://api.96astro.com/v1/matching/rajju-vedha", 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": {
"groom": {
"nakshatra": "Rohini",
"cord": "Kantha",
"body_part": "Neck"
},
"bride": {
"nakshatra": "Hasta",
"cord": "Kantha",
"body_part": "Neck"
},
"rajju": {
"same_cord": true,
"score": 0,
"maximum": 3
},
"vedha": {
"present": false,
"score": 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.
Bulk Nakshatra Match
POSTAvailable
https://api.96astro.com/v1/matching/bulk-nakshatra-matchAshtakoot scores for up to 100 star pairs in one call.
- Credits
- 1 credit
- Input
- Specific 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 |
|---|---|
pairsarray of objectsRequired | Up to 100 pairs per request. Limits: 1 to 100 items |
pairs[].groomobjectRequired | |
pairs[].groom.nakshatrastringRequired | Moon's nakshatra, e.g. Rohini. Example: |
pairs[].groom.padainteger | nullOptional | Moon's pada (1-4). Makes the score exact. Default: Limits: minimum 1, maximum 4 Example: |
pairs[].brideobjectRequired | |
pairs[].bride.nakshatrastringRequired | Moon's nakshatra, e.g. Rohini. Example: |
pairs[].bride.padainteger | nullOptional | Moon's pada (1-4). Makes the score exact. Default: Limits: minimum 1, maximum 4 Example: |
pairs[].languagestringOptional | Output language (ISO 639-1). Each capability lists the languages it supports. Default: |
pairs[].labelstring | nullOptional | Your reference for this pair, echoed back. Default: Limits: at most 100 characters Example: |
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 |
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.
count· integerresults· array of object
Example request
curl -X POST https://api.96astro.com/v1/matching/bulk-nakshatra-match \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"pairs": [
{
"label": "candidate-1",
"groom": {
"nakshatra": "Rohini",
"pada": 2
},
"bride": {
"nakshatra": "Hasta",
"pada": 1
}
},
{
"label": "candidate-2",
"groom": {
"nakshatra": "Rohini",
"pada": 2
},
"bride": {
"nakshatra": "Swati",
"pada": 3
}
}
]
}'const response = await fetch("https://api.96astro.com/v1/matching/bulk-nakshatra-match", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
"pairs": [
{
"label": "candidate-1",
"groom": {
"nakshatra": "Rohini",
"pada": 2
},
"bride": {
"nakshatra": "Hasta",
"pada": 1
}
},
{
"label": "candidate-2",
"groom": {
"nakshatra": "Rohini",
"pada": 2
},
"bride": {
"nakshatra": "Swati",
"pada": 3
}
}
]
}),
});
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.matching.bulkNakshatraMatch({
"pairs": [
{
"label": "candidate-1",
"groom": {
"nakshatra": "Rohini",
"pada": 2
},
"bride": {
"nakshatra": "Hasta",
"pada": 1
}
},
{
"label": "candidate-2",
"groom": {
"nakshatra": "Rohini",
"pada": 2
},
"bride": {
"nakshatra": "Swati",
"pada": 3
}
}
]
});
console.log(data);import requests
response = requests.post(
"https://api.96astro.com/v1/matching/bulk-nakshatra-match",
headers={
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
json={
"pairs": [
{
"label": "candidate-1",
"groom": {
"nakshatra": "Rohini",
"pada": 2,
},
"bride": {
"nakshatra": "Hasta",
"pada": 1,
},
},
{
"label": "candidate-2",
"groom": {
"nakshatra": "Rohini",
"pada": 2,
},
"bride": {
"nakshatra": "Swati",
"pada": 3,
},
},
],
},
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.matching.bulk_nakshatra_match({
"pairs": [
{
"label": "candidate-1",
"groom": {
"nakshatra": "Rohini",
"pada": 2,
},
"bride": {
"nakshatra": "Hasta",
"pada": 1,
},
},
{
"label": "candidate-2",
"groom": {
"nakshatra": "Rohini",
"pada": 2,
},
"bride": {
"nakshatra": "Swati",
"pada": 3,
},
},
],
})
print(res.data)<?php
$ch = curl_init('https://api.96astro.com/v1/matching/bulk-nakshatra-match');
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([
'pairs' => [
[
'label' => 'candidate-1',
'groom' => [
'nakshatra' => 'Rohini',
'pada' => 2,
],
'bride' => [
'nakshatra' => 'Hasta',
'pada' => 1,
],
],
[
'label' => 'candidate-2',
'groom' => [
'nakshatra' => 'Rohini',
'pada' => 2,
],
'bride' => [
'nakshatra' => 'Swati',
'pada' => 3,
],
],
],
]),
]);
$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(`{
"pairs": [
{
"label": "candidate-1",
"groom": {
"nakshatra": "Rohini",
"pada": 2
},
"bride": {
"nakshatra": "Hasta",
"pada": 1
}
},
{
"label": "candidate-2",
"groom": {
"nakshatra": "Rohini",
"pada": 2
},
"bride": {
"nakshatra": "Swati",
"pada": 3
}
}
]
}`)
req, err := http.NewRequest("POST", "https://api.96astro.com/v1/matching/bulk-nakshatra-match", 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": {
"count": 2,
"results": [
{
"label": "candidate-1",
"system": "ashtakoot",
"total": 25,
"maximum": 36,
"percentage": 69.4,
"verdict": "Good",
"exact": true,
"groom": {
"nakshatra": "Rohini",
"pada": 2,
"moon_sign": "Taurus",
"moon_sign_lord": "Venus"
},
"bride": {
"nakshatra": "Hasta",
…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.
Aggregate Match Statistics
POSTAvailable
https://api.96astro.com/v1/matching/aggregate-matchScores up to 100 star pairs and returns the average, best and lowest, a count by verdict and every pair ranked.
- Credits
- 1 credit
- Input
- Specific 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 |
|---|---|
pairsarray of objectsRequired | Up to 100 pairs per request. Limits: 1 to 100 items |
pairs[].groomobjectRequired | |
pairs[].groom.nakshatrastringRequired | Moon's nakshatra, e.g. Rohini. Example: |
pairs[].groom.padainteger | nullOptional | Moon's pada (1-4). Makes the score exact. Default: Limits: minimum 1, maximum 4 Example: |
pairs[].brideobjectRequired | |
pairs[].bride.nakshatrastringRequired | Moon's nakshatra, e.g. Rohini. Example: |
pairs[].bride.padainteger | nullOptional | Moon's pada (1-4). Makes the score exact. Default: Limits: minimum 1, maximum 4 Example: |
pairs[].languagestringOptional | Output language (ISO 639-1). Each capability lists the languages it supports. Default: |
pairs[].labelstring | nullOptional | Your reference for this pair, echoed back. Default: Limits: at most 100 characters Example: |
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 |
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.
pairs· integeraverage_total· numbermaximum· integeraverage_percentage· numberbest· objectlowest· objectverdicts· objectranked· array of object
Example request
curl -X POST https://api.96astro.com/v1/matching/aggregate-match \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"pairs": [
{
"label": "candidate-1",
"groom": {
"nakshatra": "Rohini",
"pada": 2
},
"bride": {
"nakshatra": "Hasta",
"pada": 1
}
},
{
"label": "candidate-2",
"groom": {
"nakshatra": "Rohini",
"pada": 2
},
"bride": {
"nakshatra": "Swati",
"pada": 3
}
}
]
}'const response = await fetch("https://api.96astro.com/v1/matching/aggregate-match", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
"pairs": [
{
"label": "candidate-1",
"groom": {
"nakshatra": "Rohini",
"pada": 2
},
"bride": {
"nakshatra": "Hasta",
"pada": 1
}
},
{
"label": "candidate-2",
"groom": {
"nakshatra": "Rohini",
"pada": 2
},
"bride": {
"nakshatra": "Swati",
"pada": 3
}
}
]
}),
});
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.matching.aggregateMatch({
"pairs": [
{
"label": "candidate-1",
"groom": {
"nakshatra": "Rohini",
"pada": 2
},
"bride": {
"nakshatra": "Hasta",
"pada": 1
}
},
{
"label": "candidate-2",
"groom": {
"nakshatra": "Rohini",
"pada": 2
},
"bride": {
"nakshatra": "Swati",
"pada": 3
}
}
]
});
console.log(data);import requests
response = requests.post(
"https://api.96astro.com/v1/matching/aggregate-match",
headers={
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
json={
"pairs": [
{
"label": "candidate-1",
"groom": {
"nakshatra": "Rohini",
"pada": 2,
},
"bride": {
"nakshatra": "Hasta",
"pada": 1,
},
},
{
"label": "candidate-2",
"groom": {
"nakshatra": "Rohini",
"pada": 2,
},
"bride": {
"nakshatra": "Swati",
"pada": 3,
},
},
],
},
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.matching.aggregate_match({
"pairs": [
{
"label": "candidate-1",
"groom": {
"nakshatra": "Rohini",
"pada": 2,
},
"bride": {
"nakshatra": "Hasta",
"pada": 1,
},
},
{
"label": "candidate-2",
"groom": {
"nakshatra": "Rohini",
"pada": 2,
},
"bride": {
"nakshatra": "Swati",
"pada": 3,
},
},
],
})
print(res.data)<?php
$ch = curl_init('https://api.96astro.com/v1/matching/aggregate-match');
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([
'pairs' => [
[
'label' => 'candidate-1',
'groom' => [
'nakshatra' => 'Rohini',
'pada' => 2,
],
'bride' => [
'nakshatra' => 'Hasta',
'pada' => 1,
],
],
[
'label' => 'candidate-2',
'groom' => [
'nakshatra' => 'Rohini',
'pada' => 2,
],
'bride' => [
'nakshatra' => 'Swati',
'pada' => 3,
],
],
],
]),
]);
$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(`{
"pairs": [
{
"label": "candidate-1",
"groom": {
"nakshatra": "Rohini",
"pada": 2
},
"bride": {
"nakshatra": "Hasta",
"pada": 1
}
},
{
"label": "candidate-2",
"groom": {
"nakshatra": "Rohini",
"pada": 2
},
"bride": {
"nakshatra": "Swati",
"pada": 3
}
}
]
}`)
req, err := http.NewRequest("POST", "https://api.96astro.com/v1/matching/aggregate-match", 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": {
"pairs": 2,
"average_total": 20.25,
"maximum": 36,
"average_percentage": 56.2,
"best": {
"label": "candidate-1",
"total": 25,
"verdict": "Good"
},
"lowest": {
"label": "candidate-2",
"total": 15.5,
"verdict": "Below Average"
},
"verdicts": {
"Good": 1,
"Below Average": 1
},
…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.
Bulk Dashakoot Match
POSTAvailable
https://api.96astro.com/v1/matching/bulk-south-matchTen-koota scores for many star pairs in one call.
- Credits
- 1 credit
- Input
- Specific 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 |
|---|---|
pairsarray of objectsRequired | Up to 100 pairs per request. Limits: 1 to 100 items |
pairs[].groomobjectRequired | |
pairs[].groom.nakshatrastringRequired | Moon's nakshatra, e.g. Rohini. Example: |
pairs[].groom.padainteger | nullOptional | Moon's pada (1-4). Makes the score exact. Default: Limits: minimum 1, maximum 4 Example: |
pairs[].brideobjectRequired | |
pairs[].bride.nakshatrastringRequired | Moon's nakshatra, e.g. Rohini. Example: |
pairs[].bride.padainteger | nullOptional | Moon's pada (1-4). Makes the score exact. Default: Limits: minimum 1, maximum 4 Example: |
pairs[].languagestringOptional | Output language (ISO 639-1). Each capability lists the languages it supports. Default: |
pairs[].labelstring | nullOptional | Your reference for this pair, echoed back. Default: Limits: at most 100 characters Example: |
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 |
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.
count· integerresults· array of object
Example request
curl -X POST https://api.96astro.com/v1/matching/bulk-south-match \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"pairs": [
{
"label": "candidate-1",
"groom": {
"nakshatra": "Rohini",
"pada": 2
},
"bride": {
"nakshatra": "Hasta",
"pada": 1
}
},
{
"label": "candidate-2",
"groom": {
"nakshatra": "Rohini",
"pada": 2
},
"bride": {
"nakshatra": "Swati",
"pada": 3
}
}
]
}'const response = await fetch("https://api.96astro.com/v1/matching/bulk-south-match", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
"pairs": [
{
"label": "candidate-1",
"groom": {
"nakshatra": "Rohini",
"pada": 2
},
"bride": {
"nakshatra": "Hasta",
"pada": 1
}
},
{
"label": "candidate-2",
"groom": {
"nakshatra": "Rohini",
"pada": 2
},
"bride": {
"nakshatra": "Swati",
"pada": 3
}
}
]
}),
});
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.matching.bulkSouthMatch({
"pairs": [
{
"label": "candidate-1",
"groom": {
"nakshatra": "Rohini",
"pada": 2
},
"bride": {
"nakshatra": "Hasta",
"pada": 1
}
},
{
"label": "candidate-2",
"groom": {
"nakshatra": "Rohini",
"pada": 2
},
"bride": {
"nakshatra": "Swati",
"pada": 3
}
}
]
});
console.log(data);import requests
response = requests.post(
"https://api.96astro.com/v1/matching/bulk-south-match",
headers={
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
json={
"pairs": [
{
"label": "candidate-1",
"groom": {
"nakshatra": "Rohini",
"pada": 2,
},
"bride": {
"nakshatra": "Hasta",
"pada": 1,
},
},
{
"label": "candidate-2",
"groom": {
"nakshatra": "Rohini",
"pada": 2,
},
"bride": {
"nakshatra": "Swati",
"pada": 3,
},
},
],
},
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.matching.bulk_south_match({
"pairs": [
{
"label": "candidate-1",
"groom": {
"nakshatra": "Rohini",
"pada": 2,
},
"bride": {
"nakshatra": "Hasta",
"pada": 1,
},
},
{
"label": "candidate-2",
"groom": {
"nakshatra": "Rohini",
"pada": 2,
},
"bride": {
"nakshatra": "Swati",
"pada": 3,
},
},
],
})
print(res.data)<?php
$ch = curl_init('https://api.96astro.com/v1/matching/bulk-south-match');
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([
'pairs' => [
[
'label' => 'candidate-1',
'groom' => [
'nakshatra' => 'Rohini',
'pada' => 2,
],
'bride' => [
'nakshatra' => 'Hasta',
'pada' => 1,
],
],
[
'label' => 'candidate-2',
'groom' => [
'nakshatra' => 'Rohini',
'pada' => 2,
],
'bride' => [
'nakshatra' => 'Swati',
'pada' => 3,
],
],
],
]),
]);
$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(`{
"pairs": [
{
"label": "candidate-1",
"groom": {
"nakshatra": "Rohini",
"pada": 2
},
"bride": {
"nakshatra": "Hasta",
"pada": 1
}
},
{
"label": "candidate-2",
"groom": {
"nakshatra": "Rohini",
"pada": 2
},
"bride": {
"nakshatra": "Swati",
"pada": 3
}
}
]
}`)
req, err := http.NewRequest("POST", "https://api.96astro.com/v1/matching/bulk-south-match", 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": {
"count": 2,
"results": [
{
"label": "candidate-1",
"system": "ashtakoot_rajju_vedha",
"total": 25,
"maximum": 36,
"percentage": 69.4,
"verdict": "Good",
"exact": true,
"groom": {
"nakshatra": "Rohini",
"pada": 2,
"moon_sign": "Taurus",
"moon_sign_lord": "Venus"
},
"bride": {
"nakshatra": "Hasta",
…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.
Papasamya (Pair)
POSTAvailable
https://api.96astro.com/v1/matching/papasamyaPapasamya (malefic balance) for two births: each side's score and contributing planets, the difference and a verdict.
- Credits
- 3 credits
- Input
- Specific 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 |
|---|---|
groomobjectRequired | |
groom.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: |
groom.timezonestring | nullOptional | IANA time zone, e.g. Asia/Kolkata Default: Example: |
groom.utc_offsetstring | nullOptional | Fixed offset such as +05:30, if no IANA zone is known Default: |
groom.latitudenumberRequired | Limits: minimum -90, maximum 90 Example: |
groom.longitudenumberRequired | Limits: minimum -180, maximum 180 Example: |
groom.ayanamshastringOptional | Default: |
groom.languagestringOptional | Output language (ISO 639-1). Each capability lists the languages it supports. Default: |
groom.nodestringOptional | Lunar node: true (osculating) or mean. Default: Allowed values: truemean |
brideobjectRequired | |
bride.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: |
bride.timezonestring | nullOptional | IANA time zone, e.g. Asia/Kolkata Default: Example: |
bride.utc_offsetstring | nullOptional | Fixed offset such as +05:30, if no IANA zone is known Default: |
bride.latitudenumberRequired | Limits: minimum -90, maximum 90 Example: |
bride.longitudenumberRequired | Limits: minimum -180, maximum 180 Example: |
bride.ayanamshastringOptional | Default: |
bride.languagestringOptional | Output language (ISO 639-1). Each capability lists the languages it supports. Default: |
bride.nodestringOptional | Lunar node: 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.
ayanamsha· objectcounted_from· stringnote· stringchecked_houses· array of integergroom· objectbride· objectdifference· numberdifference_percent· numberverdict· string
Example request
curl -X POST https://api.96astro.com/v1/matching/papasamya \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"groom": {
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209
},
"bride": {
"datetime": "1992-03-02T05:47:00",
"timezone": "Asia/Kolkata",
"latitude": 19.0767,
"longitude": 72.8767
}
}'const response = await fetch("https://api.96astro.com/v1/matching/papasamya", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
"groom": {
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209
},
"bride": {
"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.matching.papasamya({
"groom": {
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209
},
"bride": {
"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/matching/papasamya",
headers={
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
json={
"groom": {
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209,
},
"bride": {
"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.matching.papasamya({
"groom": {
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209,
},
"bride": {
"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/matching/papasamya');
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([
'groom' => [
'datetime' => '1990-10-18T14:30:00',
'timezone' => 'Asia/Kolkata',
'latitude' => 28.6139,
'longitude' => 77.209,
],
'bride' => [
'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(`{
"groom": {
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209
},
"bride": {
"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/matching/papasamya", 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": {
"id": "lahiri",
"name": "N.C. Lahiri",
"degrees": 23.7285
},
"counted_from": "ascendant",
"note": "Malefics in houses 1, 2, 4, 7, 8 and 12 from the ascendant score points; the Moon counts only when waning.",
"checked_houses": [
1,
2,
4
],
"groom": {
"score": 3.5,
"has_dosha": true,
"tithi": "Krishna Amavasya",
"contributions": [
{
…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.
Papasamya (Single Chart)
POSTAvailable
https://api.96astro.com/v1/matching/papasamya-singlePapasamya (malefic balance) for one birth: the score, the contributing planets by house, the level and whether it counts as a dosha.
- Credits
- 3 credits
- Input
- Specific 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 |
|---|---|
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: |
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: 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.
ayanamsha· objectcounted_from· stringnote· stringchecked_houses· array of integerscore· numberhas_dosha· booleantithi· stringcontributions· array of objectlevel· stringsummary· string
Example request
curl -X POST https://api.96astro.com/v1/matching/papasamya-single \
-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/matching/papasamya-single", {
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.matching.papasamyaSingle({
"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/matching/papasamya-single",
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.matching.papasamya_single({
"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/matching/papasamya-single');
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/matching/papasamya-single", 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": {
"id": "lahiri",
"name": "N.C. Lahiri",
"degrees": 23.7285
},
"counted_from": "ascendant",
"note": "Malefics in houses 1, 2, 4, 7, 8 and 12 from the ascendant score points; the Moon counts only when waning.",
"checked_houses": [
1,
2,
4
],
"score": 3.5,
"has_dosha": true,
"tithi": "Krishna Amavasya",
"contributions": [
{
"planet": "Saturn",
…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.
Life-Stage Match
POSTAvailable
https://api.96astro.com/v1/matching/life-stage-matchThe age gap and where each partner stands in their Saturn and Jupiter cycles, with an alignment band and the reasons for it.
- 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 |
|---|---|
groomobjectRequired | |
groom.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: |
groom.timezonestring | nullOptional | IANA time zone, e.g. Asia/Kolkata Default: Example: |
groom.utc_offsetstring | nullOptional | Fixed offset such as +05:30, if no IANA zone is known Default: |
groom.latitudenumberRequired | Limits: minimum -90, maximum 90 Example: |
groom.longitudenumberRequired | Limits: minimum -180, maximum 180 Example: |
groom.ayanamshastringOptional | Default: |
groom.languagestringOptional | Output language (ISO 639-1). Each capability lists the languages it supports. Default: |
brideobjectRequired | |
bride.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: |
bride.timezonestring | nullOptional | IANA time zone, e.g. Asia/Kolkata Default: Example: |
bride.utc_offsetstring | nullOptional | Fixed offset such as +05:30, if no IANA zone is known Default: |
bride.latitudenumberRequired | Limits: minimum -90, maximum 90 Example: |
bride.longitudenumberRequired | Limits: minimum -180, maximum 180 Example: |
bride.ayanamshastringOptional | Default: |
bride.languagestringOptional | Output language (ISO 639-1). Each capability lists the languages it supports. Default: |
as_ofstring | nullOptional | Date the reading is for (YYYY-MM-DD). Today in UTC when omitted. Default: Limits: format date |
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· stringage_gap· objectgroom· objectbride· objectalignment· objectscope· array of string
Example request
curl -X POST https://api.96astro.com/v1/matching/life-stage-match \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"groom": {
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209
},
"bride": {
"datetime": "1992-03-02T05:47:00",
"timezone": "Asia/Kolkata",
"latitude": 19.0767,
"longitude": 72.8767
}
}'const response = await fetch("https://api.96astro.com/v1/matching/life-stage-match", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
"groom": {
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209
},
"bride": {
"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.matching.lifeStageMatch({
"groom": {
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209
},
"bride": {
"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/matching/life-stage-match",
headers={
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
json={
"groom": {
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209,
},
"bride": {
"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.matching.life_stage_match({
"groom": {
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209,
},
"bride": {
"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/matching/life-stage-match');
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([
'groom' => [
'datetime' => '1990-10-18T14:30:00',
'timezone' => 'Asia/Kolkata',
'latitude' => 28.6139,
'longitude' => 77.209,
],
'bride' => [
'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(`{
"groom": {
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209
},
"bride": {
"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/matching/life-stage-match", 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-14",
"age_gap": {
"years": 1,
"months": 4,
"days": 13,
"total_days": 501,
"older": "groom",
"statement": "Groom is older than Bride by 1 year and 4 months."
},
"groom": {
"age_years": 36,
"saturn": {
"cycle": 2,
"returns_completed": 1,
"next_return_age": 58.3,
"years_to_next": 22.3,
"last_return_age": 29.2,
"years_since_last": 6.8,
…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.
Marriage Sustainability
POSTAvailable
https://api.96astro.com/v1/matching/marriage-sustainabilityThe single-chart marriage layers (7th house, Navamsa, Upapada, darakaraka) for both partners, a joint verdict, shared timing windows, and which layers could not be measured.
- Credits
- 3 credits
- Input
- Specific 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 |
|---|---|
groomobjectRequired | |
groom.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: |
groom.timezonestring | nullOptional | IANA time zone, e.g. Asia/Kolkata Default: Example: |
groom.utc_offsetstring | nullOptional | Fixed offset such as +05:30, if no IANA zone is known Default: |
groom.latitudenumberRequired | Limits: minimum -90, maximum 90 Example: |
groom.longitudenumberRequired | Limits: minimum -180, maximum 180 Example: |
groom.ayanamshastringOptional | Default: |
groom.languagestringOptional | Output language (ISO 639-1). Each capability lists the languages it supports. Default: |
groom.nodestringOptional | Lunar node: true (osculating) or mean. Default: Allowed values: truemean |
brideobjectRequired | |
bride.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: |
bride.timezonestring | nullOptional | IANA time zone, e.g. Asia/Kolkata Default: Example: |
bride.utc_offsetstring | nullOptional | Fixed offset such as +05:30, if no IANA zone is known Default: |
bride.latitudenumberRequired | Limits: minimum -90, maximum 90 Example: |
bride.longitudenumberRequired | Limits: minimum -180, maximum 180 Example: |
bride.ayanamshastringOptional | Default: |
bride.languagestringOptional | Output language (ISO 639-1). Each capability lists the languages it supports. Default: |
bride.nodestringOptional | Lunar node: true (osculating) or mean. Default: Allowed values: truemean |
as_ofstring | nullOptional | Date the timing is read from (YYYY-MM-DD). Today in UTC. Default: Limits: format date |
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· objectas_of· stringgroom· objectbride· objectjoint· objectshared_periods· objectscope· array of string
Example request
curl -X POST https://api.96astro.com/v1/matching/marriage-sustainability \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"groom": {
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209
},
"bride": {
"datetime": "1992-03-02T05:47:00",
"timezone": "Asia/Kolkata",
"latitude": 19.0767,
"longitude": 72.8767
}
}'const response = await fetch("https://api.96astro.com/v1/matching/marriage-sustainability", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
"groom": {
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209
},
"bride": {
"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.matching.marriageSustainability({
"groom": {
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209
},
"bride": {
"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/matching/marriage-sustainability",
headers={
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
json={
"groom": {
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209,
},
"bride": {
"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.matching.marriage_sustainability({
"groom": {
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209,
},
"bride": {
"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/matching/marriage-sustainability');
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([
'groom' => [
'datetime' => '1990-10-18T14:30:00',
'timezone' => 'Asia/Kolkata',
'latitude' => 28.6139,
'longitude' => 77.209,
],
'bride' => [
'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(`{
"groom": {
"datetime": "1990-10-18T14:30:00",
"timezone": "Asia/Kolkata",
"latitude": 28.6139,
"longitude": 77.209
},
"bride": {
"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/matching/marriage-sustainability", 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": {
"id": "lahiri",
"name": "N.C. Lahiri",
"degrees": 23.7285
},
"as_of": "2026-10-14",
"groom": {
"darakaraka": "Sun",
"upapada_sign": "Aquarius",
"layers": {
"seventh_house": {
"measured": true,
"score": 43.6,
"band": "moderate_low",
"band_label": "Mixed — workable with awareness",
"statement": null,
"evidence": [
{
…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.