Base URL: https://api.natalchart.ai. Every request carries an API key, every response is JSON, and every longitude is given to four decimals of a degree before it is turned into a sign. The key is free: sign in with a NatalChart.AI account and create one.
Quick start
curl https://api.natalchart.ai/v1/chart/short \
-H "Authorization: Bearer $NATALCHART_API_KEY" \
-H "Content-Type: application/json" \
-d '{"birth":{"date":"1991-09-06","time":"18:30","latitude":50.4501,"longitude":30.5234}}'The response, for the demonstration birth used across this site (1991-09-06, 18:30, Kyiv). Five of the bodies are shown:
{
"sun": {
"sign": "Virgo",
"degreeInSign": 13.55,
"house": 7
},
"moon": {
"sign": "Leo",
"degreeInSign": 19.02,
"house": 7
},
"ascendant": {
"sign": "Aquarius",
"degreeInSign": 14.9898
},
"signs": {
"Sun": "Virgo",
"Moon": "Leo",
"Mercury": "Leo",
"Venus": "Leo",
"Mars": "Libra"
},
"retrograde": [
"Venus",
"Saturn",
"Uranus",
"Neptune",
"TrueNode",
"Lilith",
"Juno"
]
}Authentication
Send the key as Authorization: Bearer nc_live_... (an X-API-Key header works too). The full key is shown once, when you create it; we keep only its hash. An account holds up to five active keys and can revoke any of them at once. Keep keys on a server: a key shipped in browser or app code can be read by anyone.
Birth data
Endpoints that compute a chart take one object:
{
"birth": {
"date": "1991-09-06",
"time": "18:30",
"latitude": 50.4501,
"longitude": 30.5234,
"timezone": "Europe/Kyiv"
}
}| Field | Required | Meaning |
|---|---|---|
date | yes | Birth date, YYYY-MM-DD, from 1800 to 2399. |
time | no | Local time, HH:mm, 24-hour. null when unknown. |
latitude, longitude | yes | Decimal degrees, north and east positive. |
timezone | no | IANA zone. Left out, it is resolved from the coordinates with the daylight-saving rules of that date. |
Endpoints
| Endpoint | Plan | Returns |
|---|---|---|
POST /v1/chart/short | Free | The short chart: Sun, Moon and Ascendant with degrees, every body's sign, retrograde bodies, dominant element and quality. |
POST /v1/chart/full | Free | The full chart: every body with longitude, sign, degree, speed, retrograde flag and house; the angles; twelve Placidus cusps; the aspects with orbs; element and quality balance; fixed-star contacts. |
POST /v1/chart/planets | Free | Bodies only: longitude, sign, degree within the sign, daily speed, retrograde flag, house. |
POST /v1/chart/angles | Free | Ascendant, Midheaven, Vertex and Part of Fortune. |
POST /v1/chart/houses | Free | The twelve Placidus house cusps. |
POST /v1/chart/aspects | Free | The five major aspects between the bodies, each with its angle and orb, and the orb table used. |
POST /v1/chart/elements | Free | Element and quality balance, with the dominant of each. |
POST /v1/chart/fixed-stars | Free | Fixed-star conjunctions to the natal bodies within 1.5 degrees. |
POST /v1/horoscope/daily | Free | The calculated day: the sky at noon UTC, the Moon's phase, the sky events of the coming week and, with birth data, every transit to the natal chart with its orb. No generated text. |
GET /v1/sky | Free | Planetary positions, Moon phase and the coming week's sky events for a date (?date=YYYY-MM-DD, today by default). |
GET /v1/usage | Free | Your plan, today's count and when the pool refills. Costs nothing. |
POST /v1/transits | API Pro | Every transit event in a window of up to 92 days: exact transit-to-natal aspects by date, sign ingresses and stations. |
POST /v1/synastry | API Pro | Two charts compared: inter-chart aspects with orbs, house overlays both ways and a score per life sphere. |
POST /v1/solar-return | API Pro | The solar return chart for a year, cast for the birth place or another location. |
The full chart
POST /v1/chart/full returns the whole calculation in the shape of the published demonstration file, so you can check a response against a fixed chart before you write any code. Shortened here to two bodies, two cusps and the two tightest aspects:
{
"input": {
"date": "1991-09-06",
"time": "18:30",
"latitude": 50.4501,
"longitude": 30.5234,
"timeKnown": true
},
"time": {
"timezone": "Europe/Kyiv",
"offsetHours": 3,
"julianDayUT": 2448506.1458333335
},
"planets": [
{
"name": "Sun",
"longitude": 163.5457,
"sign": "Virgo",
"degreeInSign": 13.55,
"speed": 0.9704,
"retrograde": false,
"house": 7
},
{
"name": "Moon",
"longitude": 139.0225,
"sign": "Leo",
"degreeInSign": 19.02,
"speed": 14.5955,
"retrograde": false,
"house": 7
}
],
"angles": {
"ascendant": {
"longitude": 314.9898,
"sign": "Aquarius"
},
"midheaven": {
"longitude": 249.8956,
"sign": "Sagittarius"
}
},
"houses": [
{
"number": 1,
"cusp": 314.9898,
"sign": "Aquarius"
},
{
"number": 2,
"cusp": 13.7492,
"sign": "Aries"
}
],
"aspects": [
{
"planet1": "Pallas",
"planet2": "Juno",
"aspect": "Square",
"angle": 89.79,
"orb": 0.21
},
{
"planet1": "Pluto",
"planet2": "TrueNode",
"aspect": "Sextile",
"angle": 59.57,
"orb": 0.43
}
],
"elements": {
"Fire": 7,
"Earth": 6,
"Air": 4,
"Water": 2
},
"qualities": {
"Cardinal": 6,
"Fixed": 11,
"Mutable": 2
}
}The segment endpoints (planets, angles, houses, aspects, elements, fixed-stars) return one part of the same object each, for callers that need only that part.
The daily horoscope
POST /v1/horoscope/daily is the calculated half of a daily horoscope: the sky at noon UTC, the Moon’s phase and sign, the sky events of the coming week and, when you send birth, every transit to that chart with its aspect, its orb and the natal house the transiting body is in. Transit orbs are 2° for the Moon, Sun, Mercury, Venus and Mars and 3° for the slower bodies. Two fields are fixed rules rather than astronomy, and the response states them: tone (trine and sextile supportive, square and opposition challenging, conjunction intensifying) and focus, the three contacts that rank highest by planet speed and tightness. There is no written text; that part is yours.
API Pro endpoints
POST /v1/transits takes birth, from and to (at most 92 days) and returns every exact transit-to-natal aspect by date, every sign ingress and every station in the window. POST /v1/synastry takes personA and personB and returns the inter-chart aspects with orbs, the house overlays both ways and a score for each of six life spheres. POST /v1/solar-return takes birth, year and an optional location and returns the exact moment of the return with the full chart cast for it.
Limits and pricing
| Plan | Price | Requests | Endpoints |
|---|---|---|---|
| Free | $0 | 10 a day | Charts, segments, daily horoscope, sky |
| API Pro | $6.99 a month | 1,000 a day | Everything, including transits, synastry and solar returns |
Requests are counted per account, across all of its keys, and the pool refills at 00:00 UTC. Every response carries X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset. A request rejected as invalid is not counted, a calculation that fails on our side is given back, and GET /v1/usage is always free. API Pro is a separate subscription from the app plans: it does not include app Premium, and app Premium does not include it.
Errors
Every error has one shape: { "error": { "code", "message", "details"?, "docs" } }.
| Status | Code | When |
|---|---|---|
| 400 | invalid_request | The body is not valid. details lists every problem. Not counted. |
| 401 | missing_api_key, invalid_api_key | No key, an unknown key or a revoked one. |
| 403 | plan_required | An API Pro endpoint called on the Free plan. |
| 429 | daily_limit_reached | The day’s pool is spent. It refills at 00:00 UTC. |
| 500 | internal_error | A failure on our side. The request is not counted. |
Calculation settings
These are fixed, and they are the settings of the app itself, described in full on the verification page. Swiss Ephemeris data files with the speed flag on. Tropical zodiac, geocentric, apparent positions. Placidus houses. True lunar node. Lilith as the osculating lunar apogee. Part of Fortune as ASC + Moon − Sun for day and night charts alike. The five major aspects only: conjunction 8°, sextile 6°, square 8°, trine 8°, opposition 8°. Applying and separating are not labelled; the transits endpoint gives the exact date instead.
Privacy
Birth data is personal data. The API reads it, computes, answers and forgets it: no request body is stored, and nothing you send is used for anything but the response. What we keep per request is the endpoint, the status code and the latency. See the privacy policy.
Questions
Does the API use AI?
No. Every endpoint is a calculation: planetary positions from the Swiss Ephemeris, house cusps, aspects, transits. No text is generated and no language model is called, which is why the same input always returns the same numbers.
Can I choose the house system or a sidereal zodiac?
No. Every chart is tropical with Placidus houses, the same settings the NatalChart.AI app uses. If you need Whole Sign, Koch or a sidereal zodiac, this is not the right API for that.
What happens when the birth time is unknown?
Send time as null. The chart is computed for 12:00 local time, and everything that depends on the time is withheld rather than guessed: the angles and the house cusps come back as null, bodies carry no house, and a warning says how far the Moon can be off.
Do you geocode place names?
No. Send latitude and longitude. The time zone is resolved from the coordinates, with the historical daylight-saving rules for that date, unless you pass an IANA time zone yourself.
Do you store the birth data I send?
No. Request bodies are never written anywhere. The request log keeps the endpoint, the status code and the latency, which is what the usage counter needs.
What counts as a request?
One successful call to a calculation endpoint. A request rejected as invalid costs nothing, a failure on our side is given back, and /v1/usage is free. The pool is per account, not per key, and refills at 00:00 UTC: 10 a day on Free, 1,000 a day on API Pro.
Can I use it in a commercial product?
Yes, on either plan. Keep your key on a server: a key in browser or app code can be copied by anyone who opens it.