Transit Timeline (Western)
Transit Timeline
/api/v1/western/transits/timelineCompute transit-to-natal intervals for Gantt, calendar, and timeline rendering. The default mode covers a single calendar month, andyear_slowextends the window to long-cycle medium and slow bodies across up to 366 days.
Full URL
https://api.freeastroapi.com/api/v1/western/transits/timelineSafe retries with Idempotency-Key
Authenticated, billable astrology POST requests accept the optional header Idempotency-Key: <client-generated unique operation key>. Reuse the same key only when retrying the exact same method, path, query string, and JSON body after a timeout or network failure.
A completed replay returns the first response with Idempotency-Replayed: true, does not rerun the calculation, and does not consume extra quota. Keys are retained for about 24 hours.
Reusing a key with a changed request returns 409 idempotency_key_reused. A duplicate while the first request is still running returns 409 request_in_progress with Retry-After.
Timeline Semantics
The endpoint scans beyond the visible month to detect real orb entry and exit, then clips the visible part of the interval with month-specific helper fields.
- •Intervals can begin before
range_startor end afterrange_end. Keep the real dates for duration math and use the visible day fields for rendering. - •
monthmode is capped to one calendar month per request.year_slowallows a longer long-cycle window up to 366 days, including cross-year ranges. - •Use
transit_categoriesto request onlyfast,medium,slow, or any combination. Inyear_slowmode, the valid categories aremediumandslow. - •
exact_hits_in_monthis the month-clipped subset ofexact_datetimes. Use it for visible exact markers without recomputing dates in the frontend. - •
orb_settingscan be layered by aspect, by transit category, or by transit planet. Planet-specific overrides win over category overrides, and category overrides win over global aspect defaults. - •Sidereal requests are supported through
natal.zodiac_typeandnatal.sidereal_ayanamsa. These settings affect both the natal reference points and the transit interval calculations.
For a single-date snapshot instead of interval bars, keep using /api/v1/transits/calculate.
Request Parameters
| Field | Type | Required | Description |
|---|---|---|---|
| natal.name | string | No | Optional name label for the natal chart owner. |
| natal.year | integer | Yes | Birth year. |
| natal.month | integer | Yes | Birth month (1-12). |
| natal.day | integer | Yes | Birth day. |
| natal.hour | integer | No | Birth hour. Required for angle-sensitive timelines. |
| natal.minute | integer | No | Birth minute. |
| natal.time_known | boolean | No | When false, default natal points exclude angles. |
| natal.city | string | Yes | Birth city name. |
| natal.lat | float | Yes | Birth latitude. |
| natal.lng | float | Yes | Birth longitude. |
| natal.tz_str | string | No | Birth timezone such as `Europe/Paris` or `AUTO`. |
| natal.zodiac_type | string | No | tropical (default) or sidereal. |
| natal.sidereal_ayanamsa | string | No | When zodiac_type is sidereal: lahiri, raman, kp, fagan_bradley, or yukteshwar. |
| mode | string | No | Timeline mode. Defaults to `month`. Use `year_slow` for a long-cycle window up to 366 days. |
| range_start | string | Yes | Range start as `YYYY-MM-DD` or full ISO datetime. Date-only values normalize to `00:00:00Z`. `month` mode must stay within a single calendar month; `year_slow` can span multiple months up to 366 days. |
| range_end | string | Yes | Range end as `YYYY-MM-DD` or full ISO datetime. Date-only values normalize to `23:59:59Z`. `month` mode must stay within the same calendar month as `range_start`; `year_slow` can cross year boundaries as long as the total window is 366 days or less. |
| include_houses | boolean | No | When true, add a nested `houses` block for each transit with natal-point and transit house context when available. |
| transit_categories | array[string] | No | Optional category filter. Supported values: `fast`, `medium`, `slow`, or `all`. In `year_slow` mode, use `medium`, `slow`, or both. |
| transit_planets | array[string] | No | Optional transit planet filter. Supports planets plus `chiron`, `north_node`, `mean_node`, `true_node`, `lilith` (mean Black Moon Lilith), and `true_lilith`. Defaults to the current transit taxonomy excluding the Moon. In `year_slow` mode, the expected long-cycle set includes Jupiter, Saturn, Uranus, Neptune, Pluto, nodes, Chiron, and Lilith variants. |
| natal_points | array[string] | No | Optional natal point filter. Supports planets, `chiron`, `north_node`, `mean_node`, `true_node`, `lilith`/`mean_lilith`, `true_lilith`, and angle-derived points such as `ascendant`, `midheaven`, `descendant`, `ic`, `vertex`, and `part_of_fortune` when `time_known=true`. Defaults to natal planets plus angles when time is known. |
| aspect_types | array[string] | No | Optional aspect filter. Defaults to the 5 major aspects: conjunction, square, opposition, trine, and sextile. |
| orb_settings | object | No | Optional orb override policy. Supports flat per-aspect overrides for backward compatibility, plus nested `by_aspect`, `by_category`, and `by_planet` maps. |
| orb_settings.by_aspect | object | No | Per-aspect orb overrides, for example `{ "conjunction": 6, "square": 4 }`. |
| orb_settings.by_category | object | No | Per-category orb overrides. Keys are `fast`, `medium`, or `slow`; each value can define aspect-specific overrides plus `default`, for example `{ "slow": { "default": 3.5 } }`. |
| orb_settings.by_planet | object | No | Per-transit-planet orb overrides. Keys are transit planets like `saturn`, `jupiter`, or `pluto`; each value can define aspect-specific overrides plus `default`, for example `{ "saturn": { "conjunction": 2, "default": 2.5 } }`. |
Response Fields
| Field | Type | Required | Description |
|---|---|---|---|
| meta.endpoint | string | n/a | Fixed endpoint identifier: `western_transits_timeline`. |
| meta.version | string | n/a | Current response version. |
| meta.range_start | string | n/a | Normalized UTC start timestamp for the requested month. |
| meta.range_end | string | n/a | Normalized UTC end timestamp for the requested month. |
| meta.generated_at | string | n/a | UTC generation timestamp. |
| input.mode | string | n/a | Resolved timeline mode: `month` or `year_slow`. |
| input.include_houses | boolean | n/a | Echoes whether house data was explicitly requested for this response. |
| input.transit_categories | array[string] | n/a | Resolved category filter used to build the response. |
| input.transit_planets | array[string] | n/a | Resolved transit planet set. `mean_lilith` resolves to `lilith`, while `true_lilith`, `mean_node`, and `true_node` remain distinct. |
| input.natal_points | array[string] | n/a | Resolved natal point set. `mean_lilith` resolves to `lilith`; `vertex` and `part_of_fortune` require `time_known=true`. |
| input.aspect_types | array[string] | n/a | Resolved aspect set. |
| transits[].id | string | n/a | Stable intrinsic transit ID. Use this as the frontend dedupe key across months. |
| transits[].series_key | string | n/a | Stable grouping key like `transit.square.saturn.sun`. |
| transits[].category | string | n/a | Transit category: `fast`, `medium`, or `slow`. |
| transits[].transit_planet | string | n/a | Transit planet key. |
| transits[].natal_point | string | n/a | Natal point key. |
| transits[].aspect_type | string | n/a | Aspect key. |
| transits[].label | string | n/a | Human-readable transit label. |
| transits[].short_symbol_label | string | n/a | Compact glyph label for dense timeline UIs. |
| transits[].start_datetime | string | n/a | True orb entry datetime in UTC. Can be before the requested month. |
| transits[].exact_datetimes | array[string] | n/a | All exact hits for the returned interval segment. |
| transits[].end_datetime | string | n/a | True orb exit datetime in UTC. Can be after the requested month. |
| transits[].duration_days | number | n/a | Full interval duration in decimal days. |
| transits[].pass_type | string | n/a | Transit motion state for this interval segment: `direct` or `retrograde`. |
| transits[].visible_start_day | integer | n/a | 1-based day number where the transit bar should start inside the requested month. |
| transits[].visible_end_day | integer | n/a | 1-based day number where the transit bar should end inside the requested month. |
| transits[].continues_from_previous_month | boolean | n/a | True when the interval started before the requested month. |
| transits[].continues_to_next_month | boolean | n/a | True when the interval ends after the requested month. |
| transits[].exact_hits_in_month | array[string] | n/a | Subset of `exact_datetimes` that falls within the requested month. |
| transits[].row_key | string | n/a | Frontend row grouping key: `<transit>__<aspect>__<natal>`. |
| transits[].pair_key | string | n/a | Frontend pair grouping key: `<transit>__<natal>`. |
| transits[].houses.natal_point_house | integer | n/a | Natal house for the natal point in the native's own natal chart house system when birth time is known. Returned only when `include_houses=true`. |
| transits[].houses.transit_house_at_exact | integer | n/a | Transit planet house, measured against the natal houses, at the first exact hit of the interval when available. |
| transits[].houses.transit_house_in_month | integer | n/a | Transit planet house, measured against the natal houses, for the requested month slice. Uses an exact hit in the month when available, otherwise a visible-interval probe. |
Date Window Rules
Use either YYYY-MM-DD or a full ISO 8601 datetime. month requests must stay inside one calendar month. year_slow requests can span multiple months, including across year boundaries, but must stay at or below 366 days and use medium/slow long-cycle bodies such as Jupiter and Saturn.
2026-03-01 normalizes to 2026-03-01T00:00:00Z.
2026-03-31 normalizes to 2026-03-31T23:59:59Z.
2026-03-15T12:00:00Z keeps the explicit UTC timestamp.
Real Monthly Example
This example is based on a real March 2026 request for Gabriel, born on September 5, 1995 at 20:00 in Paris, filtered to medium and slow transits.
curl -X POST "https://api.freeastroapi.com/api/v1/western/transits/timeline" \
-H "Content-Type: application/json" \
-H "x-api-key: YOUR_API_KEY" \
-d '{
"mode": "month",
"natal": {
"name": "Gabriel",
"year": 1995,
"month": 9,
"day": 5,
"hour": 20,
"minute": 0,
"time_known": true,
"city": "Paris",
"lat": 48.8566,
"lng": 2.3522,
"tz_str": "Europe/Paris",
"zodiac_type": "sidereal",
"sidereal_ayanamsa": "lahiri"
},
"range_start": "2026-03-01",
"range_end": "2026-03-31",
"include_houses": true,
"transit_categories": ["medium", "slow"]
}'Real Response Example
{
"meta": {
"endpoint": "western_transits_timeline",
"version": "v1",
"range_start": "2026-03-01T00:00:00Z",
"range_end": "2026-03-31T23:59:59Z",
"generated_at": "2026-04-06T12:59:02Z"
},
"input": {
"mode": "month",
"include_houses": true,
"transit_categories": ["medium", "slow"],
"transit_planets": ["jupiter", "saturn", "uranus", "neptune", "pluto", "north_node", "chiron"],
"natal_points": ["sun", "moon", "mercury", "venus", "mars", "jupiter", "saturn", "uranus", "neptune", "pluto", "north_node", "ascendant", "midheaven", "descendant", "ic"],
"aspect_types": ["conjunction", "square", "opposition", "trine", "sextile"]
},
"transits": [
{
"id": "transit.opposition.uranus.pluto@2026-02-04T02:22:01Z",
"series_key": "transit.opposition.uranus.pluto",
"category": "slow",
"transit_planet": "uranus",
"natal_point": "pluto",
"aspect_type": "opposition",
"label": "Uranus Opposition Natal Pluto",
"short_symbol_label": "♅ ☍ ♇",
"start_datetime": "2026-02-04T02:22:01Z",
"exact_datetimes": ["2026-03-12T15:56:15Z"],
"end_datetime": "2026-09-10T17:22:01Z",
"duration_days": 218.625,
"pass_type": "direct",
"visible_start_day": 1,
"visible_end_day": 31,
"continues_from_previous_month": true,
"continues_to_next_month": true,
"exact_hits_in_month": ["2026-03-12T15:56:15Z"],
"row_key": "uranus__opposition__pluto",
"pair_key": "uranus__pluto",
"houses": {
"natal_point_house": 4,
"transit_house_at_exact": 11,
"transit_house_in_month": 11
}
},
{
"id": "transit.opposition.north_node.sun@2025-07-23T19:52:30Z",
"series_key": "transit.opposition.north_node.sun",
"category": "slow",
"transit_planet": "north_node",
"natal_point": "sun",
"aspect_type": "opposition",
"label": "North Node Opposition Natal Sun",
"short_symbol_label": "☊ ☍ ☉",
"start_datetime": "2025-07-23T19:52:30Z",
"exact_datetimes": ["2025-12-21T21:49:13Z"],
"end_datetime": "2026-05-21T23:45:56Z",
"duration_days": 302.162109,
"pass_type": "retrograde",
"visible_start_day": 1,
"visible_end_day": 31,
"continues_from_previous_month": true,
"continues_to_next_month": true,
"exact_hits_in_month": [],
"row_key": "north_node__opposition__sun",
"pair_key": "north_node__sun"
}
]
}