Matching
Ashtakoota (guna milan) scores a pair on eight kootas, all derived from each person’s Moon sign and nakshatra, for a total out of 36. Navapatra returns each koota’s points, what produced them and the Nadi, Bhakuta and Gana dosha flags, with labels in the language you ask for.
Score one pair
Section titled “Score one pair”Each side is either birth input or a kundali payload the API returned earlier. Nothing is stored on our side, so there are no profile ids: send the data each time.
curl https://api.navapatra.com/v1/matching/ashtakoota \ -H "Authorization: Bearer $NAVAPATRA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "male": { "type": "birth", "birth": { "calendar": "AD", "date": "1990-05-15", "time": "10:30", "place": { "lat": 27.7172, "lng": 85.324 } } }, "female": { "type": "birth", "birth": { "calendar": "BS", "date": "2050-05-12", "time": "14:35", "place": { "lat": 28.2096, "lng": 83.9856 } } }, "lang": "en" }'const res = await fetch('https://api.navapatra.com/v1/matching/ashtakoota', { method: 'POST', headers: { Authorization: `Bearer ${process.env.NAVAPATRA_API_KEY}`, 'Content-Type': 'application/json', }, body: JSON.stringify({ male: { type: 'birth', birth: { calendar: 'AD', date: '1990-05-15', time: '10:30', place: { lat: 27.7172, lng: 85.324 } }, }, female: { type: 'birth', birth: { calendar: 'BS', date: '2050-05-12', time: '14:35', place: { lat: 28.2096, lng: 83.9856 } }, }, }),});const match = await res.json();console.log(`${match.total} / ${match.max}`); // 28 / 36import osimport requests
res = requests.post( "https://api.navapatra.com/v1/matching/ashtakoota", headers={"Authorization": f"Bearer {os.environ['NAVAPATRA_API_KEY']}"}, json={ "male": { "type": "birth", "birth": {"calendar": "AD", "date": "1990-05-15", "time": "10:30", "place": {"lat": 27.7172, "lng": 85.324}}, }, "female": { "type": "birth", "birth": {"calendar": "BS", "date": "2050-05-12", "time": "14:35", "place": {"lat": 28.2096, "lng": 83.9856}}, }, },)match = res.json()print(f"{match['total']} / {match['max']}") # 28 / 36<?phprequire 'vendor/autoload.php';
$client = new GuzzleHttp\Client();$res = $client->post('https://api.navapatra.com/v1/matching/ashtakoota', [ 'headers' => ['Authorization' => 'Bearer ' . getenv('NAVAPATRA_API_KEY')], 'json' => [ 'male' => ['type' => 'birth', 'birth' => [ 'calendar' => 'AD', 'date' => '1990-05-15', 'time' => '10:30', 'place' => ['lat' => 27.7172, 'lng' => 85.324], ]], 'female' => ['type' => 'birth', 'birth' => [ 'calendar' => 'BS', 'date' => '2050-05-12', 'time' => '14:35', 'place' => ['lat' => 28.2096, 'lng' => 83.9856], ]], ],]);$match = json_decode((string) $res->getBody(), true);echo $match['total'], ' / ', $match['max'], PHP_EOL; // 28 / 36Both of these births are demo samples, so the request also works with the demo key.
Subjects
Section titled “Subjects”{ "type": "birth", "birth": { "...": "BirthInput" }, "options": { "ayanamsha": "lahiri", "nodeType": "mean" } }{ "type": "kundali", "kundali": { "grahas": [ { "id": "moon", "longitude": 269.0004 } ] } }type: "birth"takes the samebirthobject as/v1/kundaliand the chart options (ayanamsha,nodeType,disambiguation,nepalHistoricOffset).type: "kundali"takes a kundali you got from/v1/kundalior/v1/kundali/planets. Only the Moon’s longitude ingrahasis read, so you can pass the whole response or just that entry. This is the cheap path for platforms that already hold computed charts. It is not available with the demo key.
Response
Section titled “Response”{ "male": { "rashi": { "index": 9, "name": "Dhanu" }, "nakshatra": { "index": 21, "name": "Uttara Ashadha" }, "moonLongitude": 269.7143 }, "female": { "rashi": { "index": 9, "name": "Dhanu" }, "nakshatra": { "index": 21, "name": "Uttara Ashadha" }, "moonLongitude": 269.0004 }, "kootas": [ { "id": "varna", "index": 1, "name": "Varna", "obtained": 1, "max": 1, "detail": { "male": { "id": "kshatriya", "index": 2, "name": "Kshatriya" }, "female": { "id": "kshatriya", "index": 2, "name": "Kshatriya" } } }, { "id": "nadi", "index": 8, "name": "Nadi", "obtained": 0, "max": 8, "detail": { "male": { "id": "antya", "index": 3, "name": "Antya" }, "female": { "id": "antya", "index": 3, "name": "Antya" } } } ], "total": 28, "max": 36, "percent": 77.78, "dosha": { "nadi": true, "bhakuta": false, "gana": false }, "meta": { "engineVersion": "0.1.0", "apiVersion": "2026-11-01", "ayanamsha": { "id": "lahiri", "degrees": 23.725755 }, "nodeType": "mean", "tzdbVersion": "unknown", "deltaTModelVersion": "iers-c01-2026.5+quad2100-v1", "bsTableVersion": "2026.10.1", "overridesVersion": null }}kootas always has all eight, in this order:
id |
Max | detail shows each person’s |
|---|---|---|
varna |
1 | Varna |
vashya |
2 | Vashya group |
tara |
3 | Tara from the other’s nakshatra |
yoni |
4 | Yoni animal |
graha-maitri |
5 | Moon sign lord |
gana |
6 | Gana (Deva, Manushya, Rakshasa) |
bhakuta |
7 | Moon sign |
nadi |
8 | Nadi (Adi, Madhya, Antya) |
dosha flags the three classic doshas: nadi (same nadi), bhakuta (an unfavourable sign relationship) and gana. The example pair shares a nakshatra, so it scores well overall but has Nadi dosha. How you present doshas, and any cancellation rules your tradition applies, is up to you; the API reports the raw flags.
meta names the versions behind the score. Its ayanamsha and nodeType are those of the first subject computed from birth input (the male side first; here the 1990 birth, hence a slightly different ayanamsha value from the 1993 one). When both sides are kundali payloads, those two fields are left out, because each payload carries its own meta.
Score many pairs
Section titled “Score many pairs”Send 1 to 100 pairs. Each can carry your own id (up to 64 characters), and results come back in the same order with the same ids, followed by one meta for the whole batch. The call costs one credit per pair.
{ "pairs": [ { "id": "p1", "male": { "type": "birth", "birth": { "...": "..." } }, "female": { "type": "birth", "birth": { "...": "..." } } }, { "id": "p2", "male": { "type": "kundali", "kundali": { "...": "..." } }, "female": { "type": "kundali", "kundali": { "...": "..." } } } ], "lang": "en"}{ "results": [ { "id": "p1", "total": 28, "max": 36, "percent": 77.78, "dosha": { "nadi": true, "bhakuta": false, "gana": false }, "...": "..." }, { "id": "p2", "total": 13, "max": 36, "percent": 36.11, "dosha": { "nadi": true, "bhakuta": true, "gana": true }, "...": "..." } ], "meta": { "engineVersion": "0.1.0", "apiVersion": "2026-11-01", "...": "..." }}If any pair is invalid the whole batch fails with 400 invalid_input (or 422 for a place or time problem) and nothing is charged. Error paths point at the pair, for example pairs.3.female.birth.date. Batch matching needs a real key; the demo key cannot call it.
Rashi compatibility
Section titled “Rashi compatibility”When you only know two Moon signs, score them on Graha Maitri (out of 5) and Bhakuta (out of 7), for 12 in all. The score is symmetric: (a, b) and (b, a) always match.
curl https://api.navapatra.com/v1/matching/rashi \ -H "Authorization: Bearer $NAVAPATRA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "a": 3, "b": 9, "lang": "en" }'{ "a": { "index": 3, "name": "Mithuna" }, "b": { "index": 9, "name": "Dhanu" }, "grahaMaitri": { "obtained": 0.5, "max": 5 }, "bhakuta": { "obtained": 7, "max": 7 }, "total": 7.5, "max": 12, "percent": 62.5, "meta": { "engineVersion": "0.1.0", "apiVersion": "2026-11-01", "tzdbVersion": "unknown", "deltaTModelVersion": "iers-c01-2026.5+quad2100-v1", "bsTableVersion": "2026.10.1", "overridesVersion": null }}Signs are indexes 1 (Mesha) to 12 (Meena).