Morphemeris DocsBeta

Build a Time-Lord Timeline

Read the lords of the moment and lay out profections, firdaria, and zodiacal releasing on one timeline.

Build a Time-Lord Timeline

Time-lord techniques hand each period of a life to a planet. This guide reads the current lord of the year, lays out a decade of profected years and months as a timeline, pairs each year with its solar return chart, and then adds the firdaria and zodiacal-releasing tracks, which share the same record shape. The technique itself is explained in Time Lords.

The lord of the year

One call with at returns the profected year and month in force at that instant:

Bash
curl "https://api.morphemeris.com/v1/profections?\
datetime=1990-06-15T14:30:00Z&lat=40.7&lon=-74\
&at=2026-03-01T00:00:00Z" \
  -H "Authorization: Bearer morphemeris_live_YOUR_KEY"
JSON
{
  "from": "ascendant",
  "from_sign": "libra",
  "boundaries": "mean",
  "periods": [
    { "level": 1, "age": 35, "house": 12, "sign": "virgo", "lord": "mercury", "start": { "..." }, "end": { "..." } },
    { "level": 2, "age": 35, "month": 9, "house": 8, "sign": "taurus", "lord": "venus", "start": { "..." }, "end": { "..." } }
  ]
}

The level-1 record is the year: age 35, the twelfth house from a Libra Ascendant, Virgo, ruled by Mercury. The level-2 record is the month within it. Both are whole periods — an at query never clamps.

javascript
const { data } = await res.json();
const year = data.periods.find((p) => p.level === 1);
const month = data.periods.find((p) => p.level === 2);
console.log(`Lord of the year: ${year.lord} (${year.house}th house, ${year.sign})`);
console.log(`Lord of the month: ${month.lord} (${month.sign})`);

A decade on a timeline

A range returns every year and month overlapping it as flat records, ordered by start then level:

Bash
curl "https://api.morphemeris.com/v1/profections?\
datetime=1990-06-15T14:30:00Z&lat=40.7&lon=-74\
&start=2020-01-01T00:00:00Z&end=2030-01-01T00:00:00Z" \
  -H "Authorization: Bearer morphemeris_live_YOUR_KEY"

Draw one track per level. Because the records are flat, you never walk a tree; a month belongs to the year whose span contains it:

javascript
const years = data.periods.filter((p) => p.level === 1);
const months = data.periods.filter((p) => p.level === 2);

for (const y of years) {
  const bar = `${y.start.datetime.slice(0, 10)} → ${y.end.datetime.slice(0, 10)}`;
  console.log(`Age ${y.age}  H${y.house} ${y.sign} / ${y.lord}   ${bar}${y.clamped_start ? "  (from range start)" : ""}`);
  for (const m of months.filter((m) => m.age === y.age)) {
    console.log(`   month ${String(m.month).padStart(2)}  ${m.sign} / ${m.lord}`);
  }
}

clamped_start on the first record and clamped_end on the last mean the range cut a period; the period's true boundary lies outside the range. A range longer than 120 years is refused, so a whole life is one call.

Anchoring the years to the solar returns

The default year is a mean tropical year from birth. Pass solar=true to turn each year at the Sun's real return to its natal degree and each month at its 30° ingresses:

Bash
curl "https://api.morphemeris.com/v1/profections?\
datetime=1990-06-15T14:30:00Z&lat=40.7&lon=-74\
&solar=true&start=2026-01-01T00:00:00Z&end=2027-01-01T00:00:00Z" \
  -H "Authorization: Bearer morphemeris_live_YOUR_KEY"

The houses and lords are the same either way; only the boundaries move, by up to a day for the years and about three days for the months. This costs 2 credits instead of 1, because each boundary is a search of the ephemeris.

Each solar-anchored year begins at the instant /v1/returns would find, so the two pair naturally: the profection names the lord of the year, the return chart shows the year's sky. One batch call fetches both:

Bash
curl -X POST "https://api.morphemeris.com/v1/batch" \
  -H "Authorization: Bearer morphemeris_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"requests": [
    {"endpoint": "/v1/profections", "params": {"datetime": "1990-06-15T14:30:00Z", "lat": 40.7, "lon": -74, "solar": true, "at": "2026-08-01T00:00:00Z"}},
    {"endpoint": "/v1/returns", "params": {"body": "sun", "datetime": "1990-06-15T14:30:00Z", "lat": 40.7, "lon": -74, "search_start": "2026-06-01T00:00:00Z"}}
  ]}'

Counting from another point

from starts the count from any sign-bearing point in the chart. Profecting the Lot of Fortune is a common second track:

Bash
curl "https://api.morphemeris.com/v1/profections?\
datetime=1990-06-15T14:30:00Z&lat=40.7&lon=-74\
&from=part_of_fortune&months=false&start=2026-01-01T00:00:00Z&end=2036-01-01T00:00:00Z" \
  -H "Authorization: Bearer morphemeris_live_YOUR_KEY"

months=false keeps only the year records. from_sign in the response tells you which sign the count started from, so a second track can be labelled without another call.

The firdaria track

/v1/firdaria returns the same shape: level-1 majors and level-2 sub-periods, each with its lord, a sub-period also naming its major_lord. One call covers a whole life, and the cycle repeats after 75 years:

Bash
curl "https://api.morphemeris.com/v1/firdaria?\
datetime=1990-06-15T14:30:00Z&lat=40.7&lon=-74\
&start=1990-06-15T14:30:00Z&end=2090-06-15T00:00:00Z" \
  -H "Authorization: Bearer morphemeris_live_YOUR_KEY"
javascript
for (const major of data.periods.filter((p) => p.level === 1)) {
  const subs = data.periods.filter((p) => p.level === 2 && p.major_lord === major.lord && p.start.jd >= major.start.jd && p.end.jd <= major.end.jd);
  console.log(`${major.lord.padEnd(10)} ${major.start.datetime.slice(0, 10)} → ${major.end.datetime.slice(0, 10)}`);
  for (const s of subs) console.log(`   ${s.lord}`);
}

The sect decides the sequence and is read from the chart; pass day_chart=false to force the night order for a birth near the horizon, or night_order=nodes_after_mars for the medieval placement of the nodes.

The zodiacal-releasing track

/v1/zodiacal-releasing walks the signs from the Lot of Spirit. Two levels cover a life; go deeper only over a narrower range, because the units shrink twelvefold each level (the API caps level 3 at ten years and level 4 at one):

Bash
curl "https://api.morphemeris.com/v1/zodiacal-releasing?\
datetime=1990-06-15T14:30:00Z&lat=40.7&lon=-74\
&start=1990-06-15T14:30:00Z&end=2090-06-15T00:00:00Z" \
  -H "Authorization: Bearer morphemeris_live_YOUR_KEY"

Two fields make a releasing timeline readable at a glance. angle_from_fortune marks the periods whose sign is angular to the Lot of Fortune's, 10 being the peak of the sequence; loosing_of_bond marks the sub-period that jumps to the sign opposite its chapter after a full circuit:

javascript
for (const p of data.periods) {
  const marks = [
    p.angle_from_fortune === 10 ? "PEAK" : p.angle_from_fortune ? `angular ${p.angle_from_fortune}` : "",
    p.loosing_of_bond ? "loosing of the bond" : "",
  ].filter(Boolean).join(", ");
  console.log(`${"  ".repeat(p.level - 1)}${p.sign} / ${p.lord}  ${p.start.datetime.slice(0, 10)}${marks ? `  [${marks}]` : ""}`);
}

from=part_of_fortune releases from Fortune instead; max_level=1 keeps only the chapters.

Tips

  • The lord of the year is a natal planet: read its natal condition with /v1/dignities or dignities=true on /v1/natal-chart, and its transits for the year with /v1/transits, moving=<lord>.
  • Sidereal practitioners pass sidereal=<ayanamsha>: the signs, and with solar=true the return, are then sidereal.
  • Age 0 runs from birth to the first birthday and is the first house; a range that starts before birth begins at birth, unclamped. The same birth rule holds for firdaria and releasing.
  • The three tracks share one record shape (level, lord, start, end, clamped_start, clamped_end), so one renderer draws all of them; fetch all three for a range in one batch call.