Everything you need, on one page
In the order you actually need it: a working response first, then the input, then the systems, and last the things that can go wrong.
Quickstart
Mint a key in the panel, paste it below and call the bundle. One request returns all eight systems and costs 6 credits — the free plan's allowance covers 16 full profiles.
curl -X POST https://api.eldermind.io/v1/profile/complete \
-H "Authorization: Bearer sk_live_TWOJ_KLUCZ" \
-H "Content-Type: application/json" \
-d '{
"subject": {
"birth_date": "1993-09-01",
"birth_time": "14:30",
"birth_place": "Warszawa, Polska"
},
"detail": "summary"
}'The response is an object with a key per system, plus meta. If one system fails, the rest return normally and the error lands in meta.errors — you get value instead of a 500.
Authentication
Pass the key in the Authorization header. We store only its argon2id hash, so we show it to you exactly once — a lost key can't be recovered by you or by us.
Authorization: Bearer sk_live_...Alternatively: an OAuth 2.1 token, which is what chat connectors use. Entitlements, credits and limits behave identically either way, because the rules live in one place. An OAuth token doesn't create a new account — it's a different way of presenting a key that already exists.
The subject object
Every chart endpoint takes the same input object. Only the birth date is required.
| Field | Type | Required |
|---|---|---|
birth_date | string | yes |
birth_time | string | no |
birth_place | string | either/or |
latitude / longitude | number | either/or |
timezone | string (IANA) | either/or |
gender | string | no |
full_name | string | no |
reference_date | string | no |
Supply either birth_place, or the trio of latitude, longitude and timezone. The first is more convenient but costs about 300 ms of geocoding; the second is instant. Without birth_time we assume 12:00 and flag in warnings that the Ascendant, houses, hour pillar and Moon are unreliable.
The eight systems
Each system has its own endpoint and its own cost. All of them take the same subject object.
| System | Endpoint | Credits |
|---|---|---|
| human_design | /v1/human-design/chart | 1 |
| gene_keys | /v1/gene-keys/profile | 1 |
| bazi | /v1/bazi/chart | 1 |
| vedic | /v1/vedic/chart | 2 |
| matrix | /v1/matrix/destiny | 1 |
| numerology | /v1/numerology/profile | 1 |
| western | /v1/western/natal | 1 |
| draconic | /v1/draconic/chart | 1 |
The /v1/profile/complete endpoint computes all eight at once for 6 credits, with an optional systems selector when you only need some of them.
Transit windows
POST /v1/transits/windows returns upcoming sign ingresses and exact transiting aspects to the natal chart, strongest first. It is the only endpoint that answers "when" rather than "what" — and the only one whose answer is different tomorrow.
| Field | Type | Required |
|---|---|---|
| subject | object | The same fields as everywhere else |
| months | 1-24 | How many months ahead to scan. Defaults to 12 |
| max_windows | 5-100 | How many windows to return. Defaults to 20 |
| start_date | string | Start of the scan. Defaults to today (UTC) |
The scan steps day by day, so months is both the range and the price: a year costs 12 credits. Raise max_windows alongside months — the list truncates at the cap, and the default of 20 is already reached around the twelve-month mark, so a longer scan at the default cap costs more and returns the same list.
Included in All Access and Business. On the Free and Starter plans this endpoint answers TRANSITS_NOT_ENTITLED, while the other systems keep working.
Detail levels
A full profile is about 30 KB, roughly 7,700 tokens — one tool call would fill a model's context before it said anything. That's why summary is the default for MCP.
| Level | Size | Use for |
|---|---|---|
| summary | ~2,2 KB | Default for MCP |
| standard | ~18,3 KB | Default for REST |
| full | ~30,2 KB | Export, backend-to-backend |
MCP server
The same engine, 14 tools, one process. For Cursor, VS Code and Claude Desktop, pasting the config with your key is the whole setup.
{
"mcpServers": {
"eldermind-astro": {
"url": "https://api.eldermind.io/mcp",
"headers": {
"Authorization": "Bearer sk_live_TWOJ_KLUCZ"
}
}
}
}For Claude.ai and ChatGPT, give it https://api.eldermind.io/mcp and nothing else. The connector registers itself and walks you through the consent screen — full OAuth 2.1 with PKCE and refresh-token rotation.
Credits and limits
Credits are charged only after a successful calculation. A rejected request costs nothing. A cached response is charged normally — you got the answer you asked for — but flagged, so you can see your own hit rate.
Exceeding the rate limit returns 429 with a Retry-After header. Running out of credits returns 402 with the pricing page URL, which a language model can turn into a sensible message instead of hallucinating a result.
Error codes
Every failure comes back in the same envelope, with a stable code and a request id. That's the difference between an API you can build against and one you have to guess at.
{
"error": {
"code": "AMBIGUOUS_LOCAL_TIME",
"message": "Local time 02:30:00 on 1993-03-28 does not exist in Europe/Warsaw (daylight-saving gap).",
"field": "birth_time",
"request_id": "req_01JD8X...",
"docs_url": "https://eldermind.io/api/docs#errors"
}
}| Code | HTTP |
|---|---|
INVALID_API_KEY | 401 |
INSUFFICIENT_CREDITS | 402 |
SYSTEM_NOT_ENTITLED | 403 |
DETAIL_NOT_ENTITLED | 403 |
TRANSITS_NOT_ENTITLED | 403 |
INVALID_TIMEZONE | 422 |
AMBIGUOUS_LOCAL_TIME | 422 |
DATE_OUT_OF_RANGE | 422 |
HOUSE_SYSTEM_UNAVAILABLE | 422 |
GEOCODING_FAILED | 422 |
RATE_LIMITED | 429 |
SERVICE_BUSY | 503 |
CALCULATION_ERROR | 500 |
The request id also appears in the X-Request-Id header of every response. Send it with a support report and we'll find the exact row instead of guessing what happened yesterday.