Composite Chart
GET /v1/composite — Midpoint composite chart from two natal charts.
Composite Chart
Compute a midpoint composite chart from two natal charts. The composite chart calculates the midpoint of each pair of corresponding planetary positions, creating a single chart that represents the relationship itself.
GET /v1/composite
POST /v1/compositeCredit cost: 3
Parameters
Uses _a and _b suffixes for the two charts' datetime and location parameters.
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
datetime_a | string | One of datetime_a or jd_a | — | Person A: ISO 8601 UTC datetime |
jd_a | number | One of datetime_a or jd_a | — | Person A: Julian Day in UT1 |
lat_a | number | Yes | — | Person A: latitude |
lon_a | number | Yes | — | Person A: longitude |
datetime_b | string | One of datetime_b or jd_b | — | Person B: ISO 8601 UTC datetime |
jd_b | number | One of datetime_b or jd_b | — | Person B: Julian Day in UT1 |
lat_b | number | Yes | — | Person B: latitude |
lon_b | number | Yes | — | Person B: longitude |
bodies | string | No | "planets" | Comma-separated body names |
system | string | No | "placidus" | House system |
sidereal | string | No | — | Ayanamsha for sidereal mode |
resolution | string | No | "lower" | 180° midpoint tie-break: "lower" or "higher" |
aspects | string | No | Major 7 | Comma-separated aspect types |
orb | number | No | — | Global orb override in degrees |
Midpoint resolution
Composite positions are always the shortest-arc midpoint: planets at 10° and 200° give 105°, never 285°. The resolution parameter matters only when two positions are exactly 180° apart, where the two candidate midpoints are equally close:
"lower"(default) — The candidate at the lower ecliptic longitude wins the tie."higher"— The candidate at the higher ecliptic longitude wins the tie.
Any other value is rejected with invalid_parameter. This is the same tie-break used by /v1/midpoints.
Response
A composite is not a chart of any real moment, so its response differs from the other chart endpoints': each position carries its midpoint and the two natal longitudes it came from, there is no motion and hence no applying, retrograde, or parallels, and metadata has no place.
{
"data": {
"positions": [
{
"body": "sun",
"midpoint_longitude": 43.195,
"sign": "taurus",
"sign_degree": 13.195,
"longitude_a": 84.388,
"longitude_b": 2.001
}
],
"houses": {
"cusps": [0.0, 143.22, 164.84, 188.98, 216.87, 249.65, 288.27, 323.22, 344.84, 8.98, 36.87, 69.65, 108.27],
"ascendant": 143.22,
"midheaven": 36.87,
"vertex": 311.92
},
"aspects": [
{ "body_a": "sun", "body_b": "mercury", "aspect": "conjunction", "angle": 3.87, "orb": 3.87, "max_orb": 8.0, "applying": null }
],
"parallels": [],
"metadata": {
"datetime": 2447650.5937516,
"datetime_iso": null,
"location": null,
"house_system": "Placidus",
"sidereal": null,
"bodies": ["sun", "moon", "..."],
"source": { "type": "composite", "chart_a_label": "chart_a", "chart_b_label": "chart_b" }
}
},
"meta": { "..." }
}| Field | Description |
|---|---|
positions[].midpoint_longitude | The shortest-arc midpoint of longitude_a and longitude_b, the body's longitudes in the two natal charts (sidereal when sidereal is set) |
houses | Each cusp and angle is the shortest-arc midpoint of the two natal charts' cusp or angle, taken one by one; slot 0 of cusps is a placeholder |
aspects[] | Aspects between the midpoint positions, with applying always null |
metadata.datetime | The Julian Day halfway between the two births — the same instant a Davison chart of the pair is cast for |
The result does not depend on which birth is _a and which is _b.
Examples
Basic composite chart
curl "https://api.morphemeris.com/v1/composite?\
datetime_a=1990-06-15T18:30:00Z&lat_a=40.7128&lon_a=-74.006\
&datetime_b=1988-03-22T10:00:00Z&lat_b=51.5074&lon_b=-0.1278" \
-H "Authorization: Bearer morphemeris_live_YOUR_KEY"const params = new URLSearchParams({
datetime_a: "1990-06-15T18:30:00Z", lat_a: "40.7128", lon_a: "-74.006",
datetime_b: "1988-03-22T10:00:00Z", lat_b: "51.5074", lon_b: "-0.1278",
});
const res = await fetch(
`https://api.morphemeris.com/v1/composite?${params}`,
{ headers: { Authorization: "Bearer morphemeris_live_YOUR_KEY" } }
);
const { data } = await res.json();import requests
res = requests.get(
"https://api.morphemeris.com/v1/composite",
params={
"datetime_a": "1990-06-15T18:30:00Z", "lat_a": 40.7128, "lon_a": -74.006,
"datetime_b": "1988-03-22T10:00:00Z", "lat_b": 51.5074, "lon_b": -0.1278,
},
headers={"Authorization": "Bearer morphemeris_live_YOUR_KEY"},
)
data = res.json()