Eldermind Labs
Documentation

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.

FieldTypeRequired
birth_datestringyes
birth_timestringno
birth_placestringeither/or
latitude / longitudenumbereither/or
timezonestring (IANA)either/or
genderstringno
full_namestringno
reference_datestringno

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.

SystemEndpointCredits
human_design/v1/human-design/chart1
gene_keys/v1/gene-keys/profile1
bazi/v1/bazi/chart1
vedic/v1/vedic/chart2
matrix/v1/matrix/destiny1
numerology/v1/numerology/profile1
western/v1/western/natal1
draconic/v1/draconic/chart1

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.

FieldTypeRequired
subjectobjectThe same fields as everywhere else
months1-24How many months ahead to scan. Defaults to 12
max_windows5-100How many windows to return. Defaults to 20
start_datestringStart 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.

LevelSizeUse for
summary~2,2 KBDefault for MCP
standard~18,3 KBDefault for REST
full~30,2 KBExport, 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.

.cursor/mcp.json
{
  "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.

See pricing and per-operation costs →

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"
  }
}
CodeHTTP
INVALID_API_KEY401
INSUFFICIENT_CREDITS402
SYSTEM_NOT_ENTITLED403
DETAIL_NOT_ENTITLED403
TRANSITS_NOT_ENTITLED403
INVALID_TIMEZONE422
AMBIGUOUS_LOCAL_TIME422
DATE_OUT_OF_RANGE422
HOUSE_SYSTEM_UNAVAILABLE422
GEOCODING_FAILED422
RATE_LIMITED429
SERVICE_BUSY503
CALCULATION_ERROR500

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.