Skip to content
API96Astro API

API reference / AI interpretation

AI interpretation

AI-written readings and answers grounded in chart, report or Vastu data the service computes.

8 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.

Floor-Plan Auto-Detect (Vision)

POSTBeta

https://api.96astro.com/v1/ai/vastu-vision-detect

An AI vision model proposes a floor plan from a picture of it (PNG, JPEG or WebP): outline, centre, rooms, structures and main entrance in pixel coordinates, shaped as vastu-analyse input, with a confidence note.

Credits
Metered, from 15 credits
Input
Specific input
Output
JSON
Delivery
Direct response
Languages
English; translated term names with labels
Headers
HeaderValue and description
AuthorizationRequiredBearer YOUR_API_KEY

Your sandbox (sk_test_...) or live (sk_live_...) key. X-API-Key: <key> is accepted instead.

Content-TypeRequiredapplication/json

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

Body · application/json
FieldDescription
image_base64stringRequired

The floor-plan image file, base64-encoded (a `data:image/...;base64,` prefix is accepted). PNG, JPEG or WebP; at most 3.75 MiB decoded and 8000 px a side.

Limits: 1 to 5400000 characters

Example: iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAAAAABQyaazAAAAgklEQVR42u3bQQoAIAgEQP//6fpCBsFWs2fBEbyJNcJTgICAgIDXACspgIeAp/aouvWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGsN0+/F4cCNgQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE7QA/QbwMzAwgICPg7cAJxuHlDZty0owAAAABJRU5ErkJggg==

mime_typestring | nullOptional

The image's type. Required unless image_base64 is a data: URI; must match the file.

Default: null

Allowed values: image/pngimage/jpegimage/webp

Example: image/png

tierstringOptional

fast (Claude Haiku) or balanced (Sonnet). Sets the price range.

Default: fast

Allowed values: fastbalanced

Example: fast

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.

  • plan · object
  • main_entrance · null
  • north_hint · string
  • image · object
  • confidence · object
  • tier · string

Try in Playground →Capability overview

Example request

Example response (illustrative)

200application/json
{
  "data": {
    "plan": {
      "boundary": [
        [
          10,
          10
        ],
        [
          150,
          10
        ],
        [
          150,
          110
        ],
        [
          10,
          110
        ]
  …

Written by hand from the documented shape: AI readings are not captured automatically. Real text, token counts and credits differ.

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.

Vastu Defect Explanation (AI)

POSTBeta

https://api.96astro.com/v1/ai/vastu-explain-defect

An AI-written explanation of one Vastu defect in sections, with its remedies explained.

Credits
Metered, from 15 credits
Input
Specific input
Output
JSON
Delivery
Direct response
Languages
English; translated term names with labels
Headers
HeaderValue and description
AuthorizationRequiredBearer YOUR_API_KEY

Your sandbox (sk_test_...) or live (sk_live_...) key. X-API-Key: <key> is accepted instead.

Content-TypeRequiredapplication/json

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

Body · application/json
FieldDescription
defectobjectRequired

One entry of vastu-analyse data.defects, as it came.

defect.keystringOptional

The defect's key (empty when no remedy is written for it).

Default: ""

Limits: at most 80 characters

Example: toilet_in_NE

defect.titlestringRequired

e.g. 'Toilet placed in NE'.

Limits: 1 to 300 characters

Example: Toilet placed in NE

defect.severitystringRequired

Allowed values: severepoormixed

Example: severe

defect.has_remedyboolean | nullOptional

As in vastu-analyse; not used.

Default: null

Example: true

remediesobject | nullOptional

The data.remedies entry for this defect (its 'defect' equals the defect's title), as it came. With it, the explanation says why each remedy works.

Default: null

remedies.defectstringRequired

Title of the defect these remedies are for.

Limits: 1 to 300 characters

Example: Toilet placed in NE

remedies.severitystringRequired

Allowed values: severepoormixed

Example: severe

remedies.priorityinteger | nullOptional

1 = most urgent.

Default: null

Limits: minimum 1, maximum 5

Example: 1

remedies.freearray of objectsOptional

Limits: at most 5 items

remedies.free[].actionstringRequired

Limits: 1 to 200 characters

Example: Keep toilet door closed at all times

remedies.free[].effortstringOptional

Default: low

Allowed values: lowmediumhighvery high

Example: low

remedies.free[].cost_inrintegerOptional

Default: 0

Limits: minimum 0, maximum 10000000

Example: 0

remedies.objectsarray of objectsOptional

Limits: at most 5 items

remedies.objects[].actionstringRequired

Limits: 1 to 200 characters

Example: Hang a 9-rod metal wind-chime outside toilet entrance

remedies.objects[].effortstringOptional

Default: low

Allowed values: lowmediumhighvery high

Example: low

remedies.objects[].cost_inrintegerOptional

Default: 0

Limits: minimum 0, maximum 10000000

Example: 400

remedies.structuralarray of objectsOptional

Limits: at most 5 items

remedies.structural[].actionstringRequired

Limits: 1 to 200 characters

Example: Relocate toilet to W or NW corner

remedies.structural[].effortstringOptional

Default: low

Allowed values: lowmediumhighvery high

Example: very high

remedies.structural[].cost_inrintegerOptional

Default: 0

Limits: minimum 0, maximum 10000000

Example: 80000

dashaobject | nullOptional

The running dasha, to relate the defect to the chart.

Default: null

dasha.mahadashastringRequired

Allowed values: SunMoonMercuryVenusMarsJupiterSaturnRahuKetu

Example: Jupiter

dasha.antardashastring | nullOptional

Default: null

Allowed values: SunMoonMercuryVenusMarsJupiterSaturnRahuKetu

Example: Saturn

dasha.mahadasha_endstring | nullOptional

Accepted; not used.

Default: null

Limits: format date

dasha.antardasha_endstring | nullOptional

Accepted; not used.

Default: null

Limits: format date

tierstringOptional

fast (Claude Haiku), balanced (Sonnet) or deep (Opus). Sets the price range.

Default: fast

Allowed values: fastbalanceddeep

Example: fast

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.

  • defect · object
  • sections · array of object
  • text · string
  • tier · string
  • remedies_explained · integer
  • dasha_used · boolean

Try in Playground →Capability overview

Example request

Example response (illustrative)

200application/json
{
  "data": {
    "defect": {
      "key": "toilet_in_NE",
      "title": "Toilet placed in NE",
      "severity": "severe"
    },
    "sections": [
      {
        "heading": "Why it matters",
        "text": "The north-east (Ishanya) is the zone of water and clarity. A toilet here is treated in Vastu as the most serious placement defect."
      },
      {
        "heading": "What you can do",
        "text": "Keep the toilet door closed at all times. A 9-rod metal wind-chime outside the entrance is the usual object remedy. The structural fix is to relocate the toilet to the west or north-west."
      },
      {
        "heading": "With your running dasha",
        "text": "Jupiter, your Mahadasha lord, rules the north-east, so this zone deserves attention during the Jupiter-Saturn period."
      }
  …

Written by hand from the documented shape: AI readings are not captured automatically. Real text, token counts and credits differ.

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.

Vastu Remedy Ranking (AI)

POSTBeta

https://api.96astro.com/v1/ai/vastu-rank-remedies

AI picks the top three actions across all defects and remedy tiers, each with what it addresses, effort and timeframe, and a summary.

Credits
Metered, from 15 credits
Input
Specific input
Output
JSON
Delivery
Direct response
Languages
English; translated term names with labels
Headers
HeaderValue and description
AuthorizationRequiredBearer YOUR_API_KEY

Your sandbox (sk_test_...) or live (sk_live_...) key. X-API-Key: <key> is accepted instead.

Content-TypeRequiredapplication/json

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

Body · application/json
FieldDescription
remediesarray of objectsRequired

vastu-analyse data.remedies, as it came.

Limits: 1 to 40 items

remedies[].defectstringRequired

Title of the defect these remedies are for.

Limits: 1 to 300 characters

Example: Toilet placed in NE

remedies[].severitystringRequired

Allowed values: severepoormixed

Example: severe

remedies[].priorityinteger | nullOptional

1 = most urgent.

Default: null

Limits: minimum 1, maximum 5

Example: 1

remedies[].freearray of objectsOptional

Limits: at most 5 items

remedies[].free[].actionstringRequired

Limits: 1 to 200 characters

Example: Keep toilet door closed at all times

remedies[].free[].effortstringOptional

Default: low

Allowed values: lowmediumhighvery high

Example: low

remedies[].free[].cost_inrintegerOptional

Default: 0

Limits: minimum 0, maximum 10000000

Example: 0

remedies[].objectsarray of objectsOptional

Limits: at most 5 items

remedies[].objects[].actionstringRequired

Limits: 1 to 200 characters

Example: Hang a 9-rod metal wind-chime outside toilet entrance

remedies[].objects[].effortstringOptional

Default: low

Allowed values: lowmediumhighvery high

Example: low

remedies[].objects[].cost_inrintegerOptional

Default: 0

Limits: minimum 0, maximum 10000000

Example: 400

remedies[].structuralarray of objectsOptional

Limits: at most 5 items

remedies[].structural[].actionstringRequired

Limits: 1 to 200 characters

Example: Relocate toilet to W or NW corner

remedies[].structural[].effortstringOptional

Default: low

Allowed values: lowmediumhighvery high

Example: very high

remedies[].structural[].cost_inrintegerOptional

Default: 0

Limits: minimum 0, maximum 10000000

Example: 80000

defectsarray of objectsOptional

vastu-analyse data.defects, as it came (optional).

Limits: at most 100 items

defects[].keystringOptional

The defect's key (empty when no remedy is written for it).

Default: ""

Limits: at most 80 characters

defects[].titlestringRequired

e.g. 'Toilet placed in NE'.

Limits: 1 to 300 characters

defects[].severitystringRequired

Allowed values: severepoormixed

defects[].has_remedyboolean | nullOptional

As in vastu-analyse; not used.

Default: null

dashaobject | nullOptional

The running dasha; defects in its zones rank higher.

Default: null

dasha.mahadashastringRequired

Allowed values: SunMoonMercuryVenusMarsJupiterSaturnRahuKetu

dasha.antardashastring | nullOptional

Default: null

Allowed values: SunMoonMercuryVenusMarsJupiterSaturnRahuKetu

dasha.mahadasha_endstring | nullOptional

Accepted; not used.

Default: null

Limits: format date

dasha.antardasha_endstring | nullOptional

Accepted; not used.

Default: null

Limits: format date

goalstring | nullOptional

The life goal to favour.

Default: null

Allowed values: careermarriagewealthspiritualhealtheducationpeacechildrenpropertyromancefameforeigntravelpoliticsarts

Example: wealth

tierstringOptional

fast (Claude Haiku), balanced (Sonnet) or deep (Opus). Sets the price range.

Default: balanced

Allowed values: fastbalanceddeep

Example: fast

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.

  • top3 · array of object
  • summary · string
  • goal · string
  • tier · string
  • candidates · integer
  • dasha_used · boolean

Try in Playground →Capability overview

Example request

Example response (illustrative)

200application/json
{
  "data": {
    "top3": [
      {
        "rank": 1,
        "action": "Keep toilet door closed at all times",
        "matched": true,
        "addresses": "Toilet placed in NE",
        "tier": "free",
        "cost_inr": 0,
        "effort": "low",
        "timeframe": "today",
        "rationale": "Free, immediate, and it contains the most severe defect first."
      },
      {
        "rank": 2,
        "action": "Clear all clutter, furniture, partitions from central area",
        "matched": true,
        "addresses": "Brahmasthan (central area) is blocked",
        "tier": "free",
  …

Written by hand from the documented shape: AI readings are not captured automatically. Real text, token counts and credits differ.

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.

AI Reading: Structured reading

POSTBeta

https://api.96astro.com/v1/ai/ai-insight

An AI-written reading of a birth chart, grounded in chart data the service computes from the birth (or in one report named in `context`); choose persona, tier and language. Optional JSON output.

Credits
Metered, from 15 credits
Input
Specific input
Output
JSON
Delivery
Direct response
Languages
26 languages; translated term names with labels
Headers
HeaderValue and description
AuthorizationRequiredBearer YOUR_API_KEY

Your sandbox (sk_test_...) or live (sk_live_...) key. X-API-Key: <key> is accepted instead.

Content-TypeRequiredapplication/json

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

Body · application/json
FieldDescription
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: 1990-10-18T14:30:00

timezonestring | nullOptional

IANA time zone, e.g. Asia/Kolkata

Default: null

Example: Asia/Kolkata

utc_offsetstring | nullOptional

Fixed offset such as +05:30, if no IANA zone is known

Default: null

latitudenumberRequired

Limits: minimum -90, maximum 90

Example: 28.6139

longitudenumberRequired

Limits: minimum -180, maximum 180

Example: 77.209

ayanamshastringOptional

Default: lahiri

languagestringOptional

Output language (ISO 639-1). The values listed are the ones this capability supports; any other is refused with 422 unsupported_language. Identifiers, enum values and numbers never change with language.

Default: en

Allowed values: enasbndeesfrguhiitjaknkomlmrnenlorpaplptrusitatetrur

nodestringOptional

Lunar node: true (osculating) or mean.

Default: true

Allowed values: truemean

tierstringOptional

fast (Claude Haiku), balanced (Sonnet) or deep (Opus). Sets the price range.

Default: balanced

Allowed values: fastbalanceddeep

Example: fast

personastringOptional

Voice of the reading: coach (plain), pandit (traditional) or analyst.

Default: coach

Allowed values: coachpanditanalyst

Example: coach

contextstring | nullOptional

Ground the reading in this report's data instead of the natal chart. Only the AI reading is charged, never less than the report itself.

Default: null

Allowed values: report-careerreport-childrenreport-educationreport-foreign-travelreport-healthreport-marriagereport-politicsreport-propertyreport-relocationreport-romancereport-spiritualreport-wealthdetailed-life

json_modebooleanOptional

Return the reading as a JSON object (data.reading) as well as text.

Default: false

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

Options (3)
ValueMeaning
coachPersona: coach
panditPersona: pandit
analystPersona: analyst

Response · fields in data

Inferred from the example response: a guide to the shape, not a contract.

  • mode · string
  • text · string
  • tier · string
  • persona · string
  • as_of · string
  • grounding · object

Try in Playground →Capability overview

Example request

Example response (illustrative)

200application/json
{
  "data": {
    "mode": "insight",
    "text": "You are running Jupiter Mahadasha with Mars Antardasha until January 2027. Jupiter rules your 3rd and 12th houses from a Capricorn Ascendant, so this is a period of effort, writing, travel and foreign connections. Mars as the sub-period lord adds drive to work matters: start the projects you have been planning, but avoid hasty decisions around property. Your Moon in Virgo favours careful planning; use it.",
    "tier": "fast",
    "persona": "coach",
    "as_of": "2026-10-14",
    "grounding": {
      "source": "birth-chart",
      "characters": 9412,
      "truncated": false
    }
  },
  "meta": {
    "request_id": "req_00000000000000000000",
    "api_version": "v1",
    "credits_used": 0,
    "warnings": [],
    "language": "en",
    "ai": {
  …

Written by hand from the documented shape: AI readings are not captured automatically. Real text, token counts and credits differ.

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.

AI Reading: Chat answer

POSTBeta

https://api.96astro.com/v1/ai/ai-chat

An AI answer to a question about a birth chart, with earlier turns as history; grounded in chart data the service computes from the birth (or in one report named in `context`).

Credits
Metered, from 15 credits
Input
Specific input
Output
JSON
Delivery
Direct response
Languages
26 languages; translated term names with labels
Headers
HeaderValue and description
AuthorizationRequiredBearer YOUR_API_KEY

Your sandbox (sk_test_...) or live (sk_live_...) key. X-API-Key: <key> is accepted instead.

Content-TypeRequiredapplication/json

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

Body · application/json
FieldDescription
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: 1990-10-18T14:30:00

timezonestring | nullOptional

IANA time zone, e.g. Asia/Kolkata

Default: null

Example: Asia/Kolkata

utc_offsetstring | nullOptional

Fixed offset such as +05:30, if no IANA zone is known

Default: null

latitudenumberRequired

Limits: minimum -90, maximum 90

Example: 28.6139

longitudenumberRequired

Limits: minimum -180, maximum 180

Example: 77.209

ayanamshastringOptional

Default: lahiri

languagestringOptional

Output language (ISO 639-1). The values listed are the ones this capability supports; any other is refused with 422 unsupported_language. Identifiers, enum values and numbers never change with language.

Default: en

Allowed values: enasbndeesfrguhiitjaknkomlmrnenlorpaplptrusitatetrur

nodestringOptional

Lunar node: true (osculating) or mean.

Default: true

Allowed values: truemean

tierstringOptional

fast (Claude Haiku), balanced (Sonnet) or deep (Opus). Sets the price range.

Default: balanced

Allowed values: fastbalanceddeep

Example: fast

personastringOptional

Voice of the reading: coach (plain), pandit (traditional) or analyst.

Default: coach

Allowed values: coachpanditanalyst

contextstring | nullOptional

Ground the reading in this report's data instead of the natal chart. Only the AI reading is charged, never less than the report itself.

Default: null

Allowed values: report-careerreport-childrenreport-educationreport-foreign-travelreport-healthreport-marriagereport-politicsreport-propertyreport-relocationreport-romancereport-spiritualreport-wealthdetailed-life

questionstringRequired

Limits: 1 to 1000 characters

Example: When is a good time to change jobs?

historyarray of objectsOptional

Earlier turns, oldest first.

Limits: at most 6 items

history[].rolestringRequired

Allowed values: userassistant

history[].contentstringRequired

Limits: 1 to 4000 characters

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

Options (3)
ValueMeaning
coachPersona: coach
panditPersona: pandit
analystPersona: analyst

Response · fields in data

Inferred from the example response: a guide to the shape, not a contract.

  • mode · string
  • question · string
  • text · string
  • tier · string
  • persona · string
  • as_of · string
  • grounding · object

Try in Playground →Capability overview

Example request

Example response (illustrative)

200application/json
{
  "data": {
    "mode": "chat",
    "question": "When is a good time to change jobs?",
    "text": "The strongest window for a job change is from January 2027, when the Mars sub-period ends and Rahu's begins within your Jupiter Mahadasha. Rahu sub-periods favour unconventional moves and new environments, which supports a change of employer. Until then, prepare: update your skills and network rather than resign.",
    "tier": "fast",
    "persona": "coach",
    "as_of": "2026-10-14",
    "grounding": {
      "source": "birth-chart",
      "characters": 9412,
      "truncated": false
    }
  },
  "meta": {
    "request_id": "req_00000000000000000000",
    "api_version": "v1",
    "credits_used": 0,
    "warnings": [],
    "language": "en",
  …

Written by hand from the documented shape: AI readings are not captured automatically. Real text, token counts and credits differ.

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.

AI Reading: Custom lens

POSTBeta

https://api.96astro.com/v1/ai/ai-lens

An AI-written reading of a birth chart through one lens (career, marriage, wealth, health, spiritual or year ahead), grounded in chart data the service computes from the birth.

Credits
Metered, from 15 credits
Input
Specific input
Output
JSON
Delivery
Direct response
Languages
26 languages; translated term names with labels
Headers
HeaderValue and description
AuthorizationRequiredBearer YOUR_API_KEY

Your sandbox (sk_test_...) or live (sk_live_...) key. X-API-Key: <key> is accepted instead.

Content-TypeRequiredapplication/json

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

Body · application/json
FieldDescription
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: 1990-10-18T14:30:00

timezonestring | nullOptional

IANA time zone, e.g. Asia/Kolkata

Default: null

Example: Asia/Kolkata

utc_offsetstring | nullOptional

Fixed offset such as +05:30, if no IANA zone is known

Default: null

latitudenumberRequired

Limits: minimum -90, maximum 90

Example: 28.6139

longitudenumberRequired

Limits: minimum -180, maximum 180

Example: 77.209

ayanamshastringOptional

Default: lahiri

languagestringOptional

Output language (ISO 639-1). The values listed are the ones this capability supports; any other is refused with 422 unsupported_language. Identifiers, enum values and numbers never change with language.

Default: en

Allowed values: enasbndeesfrguhiitjaknkomlmrnenlorpaplptrusitatetrur

nodestringOptional

Lunar node: true (osculating) or mean.

Default: true

Allowed values: truemean

tierstringOptional

fast (Claude Haiku), balanced (Sonnet) or deep (Opus). Sets the price range.

Default: balanced

Allowed values: fastbalanceddeep

Example: fast

personastringOptional

Voice of the reading: coach (plain), pandit (traditional) or analyst.

Default: coach

Allowed values: coachpanditanalyst

contextstring | nullOptional

Ground the reading in this report's data instead of the natal chart. Only the AI reading is charged, never less than the report itself.

Default: null

Allowed values: report-careerreport-childrenreport-educationreport-foreign-travelreport-healthreport-marriagereport-politicsreport-propertyreport-relocationreport-romancereport-spiritualreport-wealthdetailed-life

lensstringRequired

The focus of the reading.

Allowed values: careermarriagewealthhealthspiritualyear_ahead

Example: career

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

Options (3)
ValueMeaning
coachPersona: coach
panditPersona: pandit
analystPersona: analyst

Response · fields in data

Inferred from the example response: a guide to the shape, not a contract.

  • mode · string
  • lens · string
  • text · string
  • tier · string
  • persona · string
  • as_of · string
  • grounding · object

Try in Playground →Capability overview

Example request

Example response (illustrative)

200application/json
{
  "data": {
    "mode": "lens",
    "lens": "career",
    "text": "Career: your 10th house is ruled by Venus, which favours work involving design, finance or people. Saturn, your Ascendant lord, gives persistence and rewards long-term roles. In the D10 the 10th lord is well placed. The best timing windows in the current dasha sequence are mid-2027 to 2029.",
    "tier": "fast",
    "persona": "coach",
    "as_of": "2026-10-14",
    "grounding": {
      "source": "birth-chart",
      "characters": 9412,
      "truncated": false
    }
  },
  "meta": {
    "request_id": "req_00000000000000000000",
    "api_version": "v1",
    "credits_used": 0,
    "warnings": [],
    "language": "en",
  …

Written by hand from the documented shape: AI readings are not captured automatically. Real text, token counts and credits differ.

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.

AI Reading: General question

POSTBeta

https://api.96astro.com/v1/ai/ai-general

An AI answer to a general astrology question, grounded in chart data the service computes from the birth (or in one report named in `context`); choose persona, tier and language.

Credits
Metered, from 15 credits
Input
Specific input
Output
JSON
Delivery
Direct response
Languages
26 languages; translated term names with labels
Headers
HeaderValue and description
AuthorizationRequiredBearer YOUR_API_KEY

Your sandbox (sk_test_...) or live (sk_live_...) key. X-API-Key: <key> is accepted instead.

Content-TypeRequiredapplication/json

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

Body · application/json
FieldDescription
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: 1990-10-18T14:30:00

timezonestring | nullOptional

IANA time zone, e.g. Asia/Kolkata

Default: null

Example: Asia/Kolkata

utc_offsetstring | nullOptional

Fixed offset such as +05:30, if no IANA zone is known

Default: null

latitudenumberRequired

Limits: minimum -90, maximum 90

Example: 28.6139

longitudenumberRequired

Limits: minimum -180, maximum 180

Example: 77.209

ayanamshastringOptional

Default: lahiri

languagestringOptional

Output language (ISO 639-1). The values listed are the ones this capability supports; any other is refused with 422 unsupported_language. Identifiers, enum values and numbers never change with language.

Default: en

Allowed values: enasbndeesfrguhiitjaknkomlmrnenlorpaplptrusitatetrur

nodestringOptional

Lunar node: true (osculating) or mean.

Default: true

Allowed values: truemean

tierstringOptional

fast (Claude Haiku), balanced (Sonnet) or deep (Opus). Sets the price range.

Default: balanced

Allowed values: fastbalanceddeep

Example: fast

personastringOptional

Voice of the reading: coach (plain), pandit (traditional) or analyst.

Default: coach

Allowed values: coachpanditanalyst

contextstring | nullOptional

Ground the reading in this report's data instead of the natal chart. Only the AI reading is charged, never less than the report itself.

Default: null

Allowed values: report-careerreport-childrenreport-educationreport-foreign-travelreport-healthreport-marriagereport-politicsreport-propertyreport-relocationreport-romancereport-spiritualreport-wealthdetailed-life

questionstringRequired

Limits: 1 to 1000 characters

Example: What does my Moon sign say about me?

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

Options (3)
ValueMeaning
coachPersona: coach
panditPersona: pandit
analystPersona: analyst

Response · fields in data

Inferred from the example response: a guide to the shape, not a contract.

  • mode · string
  • question · string
  • text · string
  • tier · string
  • persona · string
  • as_of · string
  • grounding · object

Try in Playground →Capability overview

Example request

Example response (illustrative)

200application/json
{
  "data": {
    "mode": "general",
    "question": "What does my Moon sign say about me?",
    "text": "Your Moon is in Virgo in Chitra nakshatra. Virgo Moons are observant, practical and detail-minded; you feel settled when things are in order and you show care through useful help. Chitra adds an eye for craft and beauty. Watch a tendency to over-analyse your feelings.",
    "tier": "fast",
    "persona": "coach",
    "as_of": "2026-10-14",
    "grounding": {
      "source": "birth-chart",
      "characters": 9412,
      "truncated": false
    }
  },
  "meta": {
    "request_id": "req_00000000000000000000",
    "api_version": "v1",
    "credits_used": 0,
    "warnings": [],
    "language": "en",
  …

Written by hand from the documented shape: AI readings are not captured automatically. Real text, token counts and credits differ.

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.

AI Relocation Answer

POSTBeta

https://api.96astro.com/v1/ai/location-ai-analysis

An AI-written answer to a relocation question, grounded in the cities the service ranks for the birth (and KP analysis of the top ones); returns the answer and the ranked cities.

Credits
Metered, from 15 credits
Input
Birth details
Output
JSON
Delivery
Direct response
Languages
English; translated term names with labels
Headers
HeaderValue and description
AuthorizationRequiredBearer YOUR_API_KEY

Your sandbox (sk_test_...) or live (sk_live_...) key. X-API-Key: <key> is accepted instead.

Content-TypeRequiredapplication/json

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

Body · application/json
FieldDescription
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: 1990-10-18T14:30:00

timezonestring | nullOptional

IANA time zone, e.g. Asia/Kolkata

Default: null

Example: Asia/Kolkata

utc_offsetstring | nullOptional

Fixed offset such as +05:30, if no IANA zone is known

Default: null

latitudenumberRequired

Limits: minimum -90, maximum 90

Example: 28.6139

longitudenumberRequired

Limits: minimum -180, maximum 180

Example: 77.209

ayanamshastringOptional

This capability is computed with Lahiri only.

Default: lahiri

Allowed value: lahiri

languagestringOptional

Output language (ISO 639-1). The values listed are the ones this capability supports; any other is refused with 422 unsupported_language. Identifiers, enum values and numbers never change with language.

Default: en

Allowed value: en

questionstringRequired

Limits: 1 to 1000 characters

Example: Where should I move for my career?

tierstringOptional

fast, balanced or deep. Sets the price range.

Default: balanced

Allowed values: fastbalanceddeep

Example: fast

goalstring | nullOptional

Life goal to rank places for. Inferred from the question when omitted.

Default: null

Allowed values: careermarriagewealthspiritualhealtheducationpeacechildrenpropertyromancefameforeigntravelpoliticsartsbusiness

regionstringOptional

Limit the catalogue to one region.

Default: world

Allowed values: worldasiaeuropeamericasafricaoceania

as_ofstring | nullOptional

Date whose running dasha is used (YYYY-MM-DD). Today in UTC when omitted.

Default: null

Limits: format date

limitintegerOptional

How many ranked places ground the answer.

Default: 10

Limits: minimum 1, maximum 10

kp_citiesintegerOptional

How many of the top places get a full KP analysis.

Default: 3

Limits: minimum 0, maximum 3

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

Options (3)
ValueMeaning
fastTier: fast
balancedTier: balanced
deepTier: deep

Response · fields in data

Inferred from the example response: a guide to the shape, not a contract.

  • question · string
  • goal · string
  • goal_inferred · boolean
  • region · string
  • as_of · string
  • answer · string
  • running · object
  • formula · array of object
  • kp_cities_analysed · integer
  • cities · array of object

Try in Playground →Capability overview

Example request

Example response (illustrative)

200application/json
{
  "data": {
    "question": "Where should I move for my career?",
    "goal": "career",
    "goal_inferred": true,
    "region": "world",
    "as_of": "2026-10-14",
    "answer": "For career, Seoul ranks first: it puts your career houses on strong angles, and your running Jupiter-Mars period favours a move made for work. The next places on the list are close behind; compare their reasons before deciding.",
    "running": {
      "vimshottari": {
        "mahadasha": "Jupiter",
        "antardasha": "Mars",
        "mahadasha_end": "2029-05-30",
        "antardasha_end": "2027-01-04"
      },
      "char": {
        "sign": "Leo",
        "lord": "Sun",
        "end": "2031-10-18"
      },
  …

Written by hand from the documented shape: AI readings are not captured automatically. Real text, token counts and credits differ.

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.