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 | sun…saturn, 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
successobject, 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. |
Related¶
- Theo strength & disposition — the two figures
capabilityanddispositioncome from. - Shadbala — the six balas behind
capability. - Jaimini karakas — where the amatyakaraka comes from.
- Divisional charts — the D10 used for two of the placement roles.
- Talent profile — twelve skills from a rule ontology; a different question and a different model.