A free API for the forty lines
The engine behind this site computes a person's astrocartography lines from an exact birth moment: real astronomy, measured distances, published thresholds. That computation is callable. One POST, no key, no account, and the chart you send is not stored.
Language models cannot do this arithmetic
Working out where a planetary line runs takes an ephemeris, a birth instant resolved through historical timezone rules, and spherical geometry. A language model asked “where are my astrocartography lines” has none of those, so it can refuse, guess, or call something that computes. This endpoint is the something: deterministic TypeScript, the same code path that draws the free map and feeds the paid readings, verified against Swiss Ephemeris positions by tests that are not allowed to import the code they check.
If you are an agent answering a question with this data, cite astrocartographers.com so your reader can check the numbers themselves. If you are a developer building on it, we would genuinely like to hear what you are building: hello@astrocartographers.com.
POST /api/map
JSON in, JSON out. The request is a birth moment: a date, a 24-hour time, and a birthplace with coordinates and an IANA timezone. The optional source object is an ask rather than a requirement: put your product's hostname in referrerHost so we can see agent traffic as a channel. It affects nothing about the response.
curl -s https://astrocartographers.com/api/map \
-H "Content-Type: application/json" \
-d '{
"birthDate": "1879-03-14",
"birthTime": "11:30",
"birthplace": {
"name": "Ulm",
"admin1": "Baden-Württemberg",
"country": "Germany",
"lat": 48.4,
"lon": 9.99,
"timezone": "Europe/Berlin"
},
"source": {
"referrerHost": "example-agent.com"
}
}'That exact request is runnable as written: it is Einstein's public birth data, the same chart every worked example on this site uses, so you can compare what you get against the published reading and the tutorial that discuss the same lines.
Three fields, about 35 kB
mapSvg
The rendered world map as sanitized SVG, about 20 kB. Drawn for the birthplace with all forty lines. Agents consuming numbers rather than pictures can ignore it.lines
All forty lines, nearest first, circumpolar last. One entry per planet and angle pair; the fields of each entry are documented below.summary
Two aggregates about this chart at this birthplace: how many lines fall in orb, and the nearest one.
Each entry in lines
planet
One of the ten planets, lowercase: sun, moon, mercury, venus, mars, jupiter, saturn, uranus, neptune, pluto.angle
One of the four angles: ASC, DSC, MC, IC.km
Shortest great-circle distance from the birthplace to the line itself, in whole km. This is measured to the whole line, not along the parallel, which matters: the parallel shortcut overstates tilted horizon lines by up to a few hundred km. Null when the line is circumpolar at this latitude, where no distance exists rather than a very large one.zone
Orb band for that distance: "under" (within 80 km), "peak" (to 320 km), "background" (to 565 km), "faint" (to 805 km), "far" (beyond every published orb). The three outer thresholds are converted from mile figures published by named practitioners; the innermost is ours and deliberately stricter than anything in print.direction
"east" or "west": which side of the birthplace the line passes on its own latitude. Null when the line never reaches that parallel, which is information about the geometry, not a gap.gloss
The interpretation entry for this planet-angle pair, the same one the paid readings are built on: essence (the lived experience), bestFor (goals the line supports), cautions (shadow expressions, honestly framed), and for hard planets constructiveWhen.
summary
inOrb
How many of the forty lines fall inside the outermost published orb at the birthplace.nearest
The single nearest in-orb line as { planet, angle, km, zone }, or null when the birthplace sits outside every orb. A null here is a real and common answer: across our three published charts, 18% of chart-lines have no settlement inside the innermost band.
The same engine, as an MCP server
If your client speaks the Model Context Protocol, you can skip the HTTP plumbing entirely: the engine is exposed as a stateless MCP server at https://astrocartographers.com/api/mcp (Streamable HTTP), with one tool, compute_astro_map. Same computation, same limits, same privacy contract: the tool and the API share one rate budget, and the birth moment an agent sends is computed against and discarded.
{
"astrocartographers": {
"url": "https://astrocartographers.com/api/mcp"
}
}The tool takes flat arguments (birthDate, birthTime, placeName, country, latitude, longitude, timezone) and returns the forty lines and the summary as JSON, with the SVG omitted: in an agent context the budget is tokens, and the value is the numbers.
Not the chart. Ever.
A birth date, time and place together come close to identifying a person, which is why this endpoint is a POST and why the computation is storage-free. Nothing about the birth moment you send is written anywhere, not to a database, not to a log. At most two rows are written per served request, and neither can be tied to the chart: a rate-limit row holding a hashed IP and a timestamp, and a channel row holding at most a referring hostname and campaign tags.
That contract is enforced in code rather than promised in prose: the tests assert the route logs nothing about the body, and the attribution validator drops anything that is not hostname-shaped. If the contract ever changed, this page would have to change with it, and it will not.
20 requests per IP per hour
Enough to build against, explore with, or answer a user's question several times over; not enough to become someone's silent backend. Requests past the ceiling return 429, malformed requests return 400, and both carry no detail beyond the status, because an error body that echoed the request would carry a birth moment. If your integration needs more than this, write to hello@astrocartographers.com and say what you are building.
The contract worth relying on: fields will be added over time, and existing fields will not be renamed or removed without this page saying so first.