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:
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"{
"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.
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:
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:
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:
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:
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:
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:
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"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):
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:
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/dignitiesordignities=trueon/v1/natal-chart, and its transits for the year with/v1/transits,moving=<lord>. - Sidereal practitioners pass
sidereal=<ayanamsha>: the signs, and withsolar=truethe 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.