Morphemeris DocsBeta

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.

Text
GET  /v1/composite
POST /v1/composite

Credit cost: 3

Parameters

Uses _a and _b suffixes for the two charts' datetime and location parameters.

ParameterTypeRequiredDefaultDescription
datetime_astringOne of datetime_a or jd_aPerson A: ISO 8601 UTC datetime
jd_anumberOne of datetime_a or jd_aPerson A: Julian Day in UT1
lat_anumberYesPerson A: latitude
lon_anumberYesPerson A: longitude
datetime_bstringOne of datetime_b or jd_bPerson B: ISO 8601 UTC datetime
jd_bnumberOne of datetime_b or jd_bPerson B: Julian Day in UT1
lat_bnumberYesPerson B: latitude
lon_bnumberYesPerson B: longitude
bodiesstringNo"planets"Comma-separated body names
systemstringNo"placidus"House system
siderealstringNoAyanamsha for sidereal mode
resolutionstringNo"lower"180° midpoint tie-break: "lower" or "higher"
aspectsstringNoMajor 7Comma-separated aspect types
orbnumberNoGlobal 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.

JSON
{
  "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": { "..." }
}
FieldDescription
positions[].midpoint_longitudeThe shortest-arc midpoint of longitude_a and longitude_b, the body's longitudes in the two natal charts (sidereal when sidereal is set)
housesEach 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.datetimeThe 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

Bash
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"
javascript
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();
Python
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()