Midpoints & Derived Points
GET /v1/midpoints — Midpoints of every body pair, antiscia, Arabic lots, and Cosmobiology midpoint trees.
Midpoints & Derived Points
Points derived from bodies rather than observed: the midpoint of every body pair, each body's antiscion and contra-antiscion, optionally the Arabic lots, and — on request — midpoint trees on a dial. Location is optional; with it every point gets a house placement and lots become available.
GET /v1/midpoints
POST /v1/midpointsCredit cost: 1
The same points are available inside any chart response by adding derived_points=true to /v1/natal-chart, /v1/synastry, /v1/davison, /v1/progressed, /v1/draconic, or /v1/returns. The flag costs nothing extra.
Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
datetime | string | One of datetime or jd | — | ISO 8601 UTC datetime |
jd | number | One of datetime or jd | — | Julian Day in UT1 |
bodies | string | No | "planets" | Comma-separated body names |
sidereal | string | No | — | Ayanamsha for sidereal mode |
lat, lon | number | Only for lots | — | Observer location; enables house placement and lots |
system | string | No | "placidus" | House system when lat/lon are given |
midpoints | boolean | No | true | Midpoint of every body pair |
antiscia | boolean | No | true | Antiscion and contra-antiscion of every body |
lots | string | No | none | Comma-separated lot names, or default for the seven Hermetic lots; requires lat/lon |
resolution | string | No | "lower" | Which candidate wins when two bodies are exactly 180° apart: "lower" or "higher" longitude |
trees | boolean | No | false | Also build midpoint trees |
modulus | number | No | 90 | Dial modulus for trees: 360 (conjunctions to midpoints), 90 (the Cosmobiology dial), 45 (the Uranian dial) |
tree_orb | number | No | 1.5 | Maximum dial orb for a tree hit (0–15) |
Response
{
"data": {
"derived_points": [
{ "kind": "midpoint", "name": "sun/moon", "constituents": ["sun", "moon"], "longitude": 296.52, "sign": "Capricorn", "sign_degree": 26.52, "house": 10 },
{ "kind": "antiscion", "name": "sun", "constituents": ["sun"], "longitude": 235.31, "sign": "Scorpio", "sign_degree": 25.31, "house": 8, "declination": -21.04 },
{ "kind": "contra_antiscion", "name": "sun", "constituents": ["sun"], "longitude": 55.31, "sign": "Taurus", "sign_degree": 25.31, "house": 2, "declination": 21.04 },
{ "kind": "lot", "name": "Fortune", "constituents": ["moon", "sun", "ascendant"], "longitude": 12.87, "sign": "Aries", "sign_degree": 12.87, "house": 1 }
],
"trees": [
{
"body": "sun",
"longitude": 304.69,
"modulus": 90,
"hits": [
{ "constituents": ["venus", "saturn"], "longitude": 34.12, "orb": 0.57 }
]
}
]
},
"meta": { "credits_used": 1, "...": "..." }
}| Field | Description |
|---|---|
kind | midpoint, antiscion, contra_antiscion, or lot |
name | "a/b" for a midpoint, the body for antiscia, the lot's name |
constituents[] | The bodies the point is built from; a lot lists [body_a, body_b, "ascendant"] |
longitude, sign, sign_degree | Ecliptic position, like a body's |
house | House placement when lat/lon were given |
declination | An antiscion shares its body's declination, a contra-antiscion negates it; midpoints and lots have none |
trees[] | Present when trees=true: one per selected body, hits sorted tightest first; a body with no hits still has a tree |
How the points are formed
- A midpoint is always the shortest-arc midpoint.
resolutiononly matters when the two bodies are exactly 180° apart, where both candidates are equally short. - An antiscion is the reflection across the 0° Cancer / 0° Capricorn axis —
180° − λ— so the Sun at 25° Capricorn has its antiscion at 5° Sagittarius. It keeps the body's declination, which is the point of the construction: two bodies in antiscia share the same declination. A contra-antiscion reflects across 0° Aries / 0° Libra (−λ) and negates the declination. - Lots use the same formulas and day/night detection as
/v1/lots. - A midpoint tree lists, for one body, every midpoint of other pairs that falls within
tree_orbof it on the dial. On the 90° dial, "on the dial" means conjunct, square, or opposite in the zodiac; on the 45° dial the semi-squares join in.
Examples
Every midpoint and antiscion for the planets
curl "https://api.morphemeris.com/v1/midpoints?datetime=1990-06-15T18:30:00Z" \
-H "Authorization: Bearer morphemeris_live_YOUR_KEY"const res = await fetch(
"https://api.morphemeris.com/v1/midpoints?datetime=1990-06-15T18:30:00Z",
{ headers: { Authorization: "Bearer morphemeris_live_YOUR_KEY" } },
);
const { data } = await res.json();
const sunMoon = data.derived_points.find((p) => p.name === "sun/moon");
console.log(sunMoon.sign, sunMoon.sign_degree.toFixed(2));Midpoint trees on the 90° dial, with houses and lots
curl "https://api.morphemeris.com/v1/midpoints?datetime=1990-06-15T18:30:00Z&lat=40.7128&lon=-74.006&lots=default&trees=true" \
-H "Authorization: Bearer morphemeris_live_YOUR_KEY"Errors
| Code | Cause |
|---|---|
missing_parameter | lots without lat and lon |
invalid_parameter | Unknown resolution, modulus outside (0, 360], tree_orb outside 0–15, or an unknown lot name |