Skip to content

Career affinity

Which kinds of work a birth chart argues for, scored deterministically against two published occupational classifications — and, for every number, the reason behind it.

The same chart always returns the same answer. There is no LLM in this endpoint, no clock and no randomness: it is arithmetic over the chart's Shadbala, its planetary dispositions, its Jaimini karakas, its D10 and the power in each of its houses.

Measured: this does not predict occupation

We calibrated this endpoint against 15,921 births whose times come from civil registers, each labelled with the person's actual profession (the Gauquelin Series A corpus). The engine does not predict occupation: in-group versus out-group discrimination came out at AUC 0.497, where 0.500 is a coin.

The pipeline was verified before drawing that conclusion — our ascendant agrees with an independent computation to 0.18 arcminutes, and the corpus reproduces the classic Gauquelin planetary effects at z = 3–4. The null belongs to the model, not the plumbing. For context, the strongest occupational signal ever documented in astrological data is worth about AUC 0.51 — a real group-level effect across thousands of people, and nothing about any one of them.

Use this endpoint as what it is: a faithful, explainable rendering of what the classical technique says about a chart. Do not present it to an end user as advice, a prediction, or a fit score against a real career, and do not use it as a hiring signal. Always show the rationale beside the number.

The taxonomy

Neither classification is invented here. Both are reproduced under their own names, so a reading can be handed to a career counsellor who already uses them.

Level Count Source
Cluster 14 National Career Clusters Framework, modernized by Advance CTE in 2024
Sub-cluster 72 same
Profession 436 ISCO-08 unit groups (ILO)

Five sub-clusters carry no professions, because ISCO-08 (published 2008) has no unit group for them: Robotics, Unmanned Vehicle Technology, Clean & Alternative Energy, Agricultural Technology & Automation, and Entrepreneurship & Small Business. They still score as spheres.

Every one of the 436 professions is read individually — its own planets, signs, houses and rationale, not its sphere's. That is what makes the profession list a ranking rather than an alphabetical listing of a sphere's contents: on a given chart the 436 jobs land on about 370 distinct scores, and the largest group sharing one is three.

Fetch — GET /v1/charts/{chart_id}/profile/career

Required scope: charts:read

Query parameters

Parameter Type Default Notes
locale string en Language for the names in the response: en, ru, es, pt-BR. Scores never change with it — see below.
professions integer 0…500 25 How many professions to return. All 436 are always scored; professions_total reports the full count. Pass 0 for spheres only. The list is drawn strongest-first but at most two per sub-cluster — see below.

Languages

locale relabels a finished reading; it cannot alter one. Translation is applied after the chart is scored, so a Russian response and an English response for the same chart carry byte-identical numbers and identical ids — only the words differ. That is a property of the design, not a promise about the data.

Translated: cluster, sub-cluster, profession and success-kind titles; the cluster and success-kind paragraphs; the roads' source, through and manner. Not translated, by decision: sub-cluster and profession rationale (they fall back to English), and every identifier — id, code, source_id, element, planet, sign. A client branches on identifiers, and a translated key is a broken key.

A language we do not carry is answered in English, not refused. The response's locale field says which language you actually received, so ?locale=ja returns "locale": "en".

Why the list is capped per sub-cluster

Professions inside one sub-cluster are read from nearly the same planets, signs and houses — that is what makes them a sub-cluster — so they score within a fraction of a point of each other. Returning the plain head of the ranking therefore returned the winning sub-cluster's roster and nothing else: painter, plasterer, visual artist, spray painter, metal polisher is one answer printed five times, and it hid the second and third area the chart argued for.

The shortlist is drawn with a cap of two per sub-cluster, which spreads fifteen slots over eight or nine areas. The ranking itself is untouched — the cap decides only what is returned, and the returned list is still strictly strongest-first (a profession the cap skips is never appended lower down). If the cap cannot fill the number you asked for — you asked for more professions than two-per-sub-cluster can supply — it loosens by one and the draw repeats, so professions=500 still returns all 436.

Response

{
  "chart_id": "019fedac-c1ae-7750-9d19-58d80ce892fe",
  "method_version": "career-affinity-v1",
  "taxonomy_version": "career-taxonomy-v1",
  "locale": "en",
  "success": {
    "score": 0.432,
    "kinds": [
      {"id": "endurance", "title": "A career that lasts", "score": 0.236, "rationale": "The result that shows only over decades…"},
      {"id": "mastery", "title": "Mastery of the craft", "score": 0.166, "rationale": "The success that is the work itself being good…"}
    ],
    "routes": [
      {
        "planet": "saturn",
        "source_id": "tenth_lord",
        "source": "lord of the 10th",
        "house": 9,
        "sign": "capricorn",
        "element": "earth",
        "through": "through teaching, distance, law, and the taking of a long view",
        "manner": "slowly, by substance and things that last",
        "condition": 0.46
      }
    ]
  },
  "voices": [
    {
      "planet": "jupiter",
      "voice": 0.3727,
      "placement": 0.5833,
      "capability": 0.841,
      "disposition": -0.479,
      "reasons": ["lord of the 10th house", "a natural significator of work"]
    },
    {
      "planet": "sun",
      "voice": 0.365,
      "placement": 0.4167,
      "capability": 1.78,
      "disposition": 0.173,
      "reasons": ["stands in the 10th house", "a natural significator of work"]
    }
  ],
  "clusters": [
    {
      "id": "education",
      "title": "Education",
      "score": 39.92,
      "planet_fit": 0.2713,
      "sign_fit": 0.7333,
      "house_fit": 0.5055,
      "drivers": ["jupiter", "mercury", "sun"],
      "rationale": "Jupiter is the guru — the karaka of teaching, of the 9th house of higher learning, and of the transmission of what one generation knows to the next. Mercury is the karaka of the lesson itself and of the younger student. …"
    }
  ],
  "sub_clusters": [
    {
      "id": "education_administration",
      "title": "Education Administration",
      "score": 40.08,
      "planet_fit": 0.2382,
      "sign_fit": 0.7333,
      "house_fit": 0.5914,
      "drivers": ["jupiter", "sun", "mercury"],
      "rationale": "The Sun and Saturn are raised for office and responsibility; Mercury falls away, because this role does not teach. The 10th house of position."
    }
  ],
  "professions": [
    {
      "code": "1345",
      "title": "Education Managers",
      "sub_cluster_id": "education_administration",
      "score": 40.08,
      "planet_fit": 0.2382,
      "sign_fit": 0.7333,
      "house_fit": 0.5914,
      "drivers": ["jupiter", "sun", "mercury"],
      "rationale": "… Filed here because: Education managers are principals and deans, not clinicians."
    }
  ],
  "professions_total": 436
}
Field Type Notes
chart_id string Echoed from the path.
method_version string Bumped whenever the model changes in a way that moves published numbers. Store it beside any score you keep.
taxonomy_version string Which taxonomy the scores were computed against.
locale string The language the names came back in — the locale asked for, or en when we do not carry it.
voices[] object[] One per body the chart carries, loudest first.
success object The tenth-house reading: what the work comes to and through what. Separate from the scores by design.
clusters[] object[] All 14, strongest first.
sub_clusters[] object[] All 72, strongest first.
professions[] object[] The best professions of 436, strongest first, at most two per sub-cluster.
professions_total integer How many were scored before the list was trimmed.

Ties are broken by title, so the ordering is stable across calls.

voices[]

Field Type Notes
planet enum sunsaturn, rahu, ketu.
placement float [0, 1] How much of the career geometry this planet holds.
capability float or null Shadbala as a ratio of the planet's classical requirement; 1.0 means "classically able", and it may exceed that. null for rahu/ketu, which the six balas do not rate, and null for every planet when the birth place has no sunrise (see below).
disposition float [-1, 1] How kindly the planet acts for this ascendant — the same figure as Theo disposition.
voice float [0, 1] The three composed. This is what the sphere scores are built from.
reasons string[] Why this planet speaks about this person's work. Empty when it does not.

clusters[], sub_clusters[], professions[]

Field Type Notes
id / code string The framework's sub-cluster id, or the ISCO-08 four-digit unit-group code.
title string The official name, verbatim.
sub_cluster_id string Professions only — which sphere it was filed under.
score float [0, 100] The affinity.
planet_fit, sign_fit, house_fit float [0, 1] The three parts of the score, before weighting.
drivers string[] Up to three planets that actually carried the number, largest contribution first. A planet that says nothing in this chart is never listed, however central it is to the work.
rationale string Why these planets, signs and houses belong to this field. Always present. Show it.

Direction and result are two questions

The tenth house does not decide what work suits a person. It decides what that work comes to. Which direction a working life takes is a property of the chart as a whole — the planetary energies, signs and houses actually switched on in this person.

The endpoint answers them separately and never mixes them:

  • Direction — the cluster, sub-cluster and profession scores. Built from strength alone: planets, signs and houses, each rated by the Theo model and read against this chart's own span. The tenth house, the D10 and the karakas contribute nothing here.
  • Result — the success object, built from the tenth house alone.

Success is not fame

A career can amount to recognition, to respect, to money, to mastery of the craft, to influence, to being liked, or simply to lasting longer than everyone else's. Which of these a chart yields depends on the planets carrying it, so success.kinds returns them ranked rather than reducing the question to one number:

id what it is carried by
recognition being seen and counted Sun, Rahu
respect being deferred to on the merits Jupiter, Sun, Saturn
wealth money and holdings Venus, Jupiter, Mercury
mastery the work itself being good Saturn, Ketu, Mercury
power being able to make things happen Mars, Sun, Saturn
popularity being liked and sought out Moon, Venus
endurance a career that lasts Saturn
breakthrough a break with the expected path Rahu, Mars, Mercury

Each carries its own rationale, and the weights live in config/career/taxonomy.yaml.

Through what it arrives

success.routes answers the question a person actually asks. Four sources are read, weighted by config:

source_id reads as why it is read
tenth_lord lord of the 10th the career's own significator — its house says what the career runs through
in_tenth stands in the 10th describes the work directly
with_tenth_lord conjunct the lord of the 10th travels with it and colours what it brings
sun the Sun, karaka of position karaka of position, wherever it stands

Branch on source_id. The source column beside it is prose and changes with locale.

Each route reports the house it holds (through), the element of its sign (element, with its prose in manner) and its condition — Theo's verdict on the planet, which is whether the road is actually passable. A road held by a planet the chart cannot support is still named, with a low condition: "your career runs through this, and it is struggling" is the reading, not an omission.

A planet holding two roles — the lord of the 10th very often stands in it — is counted once, at its strongest claim, so nobody gets two votes.

How a score is built## How a score is built

voice  = placement × capability × disposition                (per planet, 0…1)
score  = (0.60·planet_fit + 0.15·sign_fit + 0.25·house_fit) × 100

A planet's voice is Theo's own reading of it — its Shadbala against the classical requirement, measured against that planet's population so an uneven requirement table cannot decide the answer, then read against this chart's span, then discounted by how kindly the planet acts for this ascendant.

Career geometry is scored too, but it feeds prominence rather than the direction scores. A planet earns placement by holding:

Role Weight
Lord of the 10th house 3.0
Amatyakaraka (Jaimini's karaka of the profession) 3.0
Stands in the 10th house 2.0
Lord of the D10 (dashamsa) ascendant 2.0
Stands in the 10th house of the D10 1.5
Casts a full drishti (60 virupa) on the 10th 1.0
Natural karma karaka (Sun, Saturn, Mercury, Jupiter) 0.5

The total is divided by 6.0 and clamped to 1.0 — no chart needs every role at once to reach the top.

Disposition maps −1…+1 onto 0.7…1.0. It only ever discounts: a planet that acts kindly speaks more helpfully, not more loudly. A difficult planet still points at a field — it describes work that will be hard, not work that is absent.

Sign fit asks whether the signs a field lives in are inhabited at all (0.6 for a tenant, +0.2 per further body, +0.4 if the ascendant or the 10th falls there). It is the lightest term on purpose.

House fit puts a house at exactly its average share of the chart's power (1/12) at 0.5, not 1.0: twelve houses always share the same total, so a house's power only means something relative to the other eleven. Its support then moves the figure ±30 %.

Every weight above is configuration, not code, and may change between method_versions.

Reading the numbers

  • Compare within one chart, not between people. A 40 is high or low only against the same chart's other spheres. The best sphere typically sits 20–30 points above the worst.
  • A cluster and its professions are on the same scale, because a profession inherits its sub-cluster's reading. If they disagree, one of them has an override — the reason is appended to its rationale.
  • No sphere is ever written off. Every one of the 14 clusters is the top answer for some charts; none scores zero.

Edge cases

Situation Behaviour
Chart has no ascendant 400 — a career reading is counted from the lagna.
Birth place has no sunrise (above the arctic circle) Every capability is null and the reading leans entirely on placement and disposition. Three of the six balas are read off the shape of the birth day; an incomplete total is not published as if it were a measurement.
professions above 500 422.
Unknown chart_id 404.