/api/astro/pdf/yearbook/25 creditsYear Book PDF report
The next twelve months as a finished PDF, divided by dasha period. The response body IS the PDF (`application/pdf`) — one call, nothing stored. Where /api/astro/pdf/horoscope/ describes a nativity, this describes a year of it. The horoscope is the same document whether you generate it today or in ten years; this one is anchored to a date and goes stale — run it again next year and every page is different. THE YEAR IS NOT DIVIDED INTO CALENDAR MONTHS. It is divided by the Vimshottari pratyantardasha — the third level of the dasha tree — so each section begins and ends on a date this chart dictates. A period can therefore run three weeks or two months, and the first and last usually overhang the twelve-month window, because a period is printed whole or not at all. Each period is read across finance, career, family life, love and marital life, and health, with what to do, what to avoid, and the traditional remedies for that period's graha. Whether a period reads as supportive or demanding is decided from the ruling graha's dignity, house and functional nature IN THIS CHART, and the grounds are printed beside the verdict — so two people in the same Venus period do not receive the same page. DETERMINISTIC. Every paragraph is looked up, not generated: the same birth data and the same `start_date` produce a byte-identical book, which is what makes a support question answerable. `start_date` defaults to today. Pass the native's next birthday to get a birthday-to-birthday book instead of a rolling one. Takes the same birth data and the same optional `branding` block as the horoscope report. Two response headers are worth reading: `X-Report-Periods` says how many dasha periods the year divided into, so you can tell a full book from a thin one without opening it, and `X-Report-Sections-Failed` counts any calculation that could not be completed.
https://api.occultapi.com/api/astro/pdf/yearbook/Authentication
Send your key in the X-API-Key header. Keys are server-side credentials — never put one in browser JavaScript or a mobile app.
X-API-Key: yt_live_a1b2c3d4_…
Content-Type: application/jsonRequest fields
| Field | Type | Required | Notes |
|---|---|---|---|
| latitude | number (double) | required | Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first. min -90 · max 90 |
| longitude | number (double) | required | Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China. min -180 · max 180 |
| ayanamsa | string | optional | |
| branding | object | optional | Reseller details printed on the cover, header and footer. |
| date_time | string (date-time) | optional | The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers. |
| day | integer | optional | Day of the month as a number, 1-31. min 1 · max 31 |
| gender | string | optional | |
| hour | integer | optional | Hour of birth in 24-hour form, 0-23. Local time at the place of birth. min 0 · max 23 |
| minute | integer | optional | min 0 · max 59 |
| month | integer | optional | Month of birth as a number, 1-12. January is 1. min 1 · max 12 |
| name | string | optional | |
| place | string | optional | |
| start_date | string (date) | optional | First day of the twelve months to cover, YYYY-MM-DD. Defaults to today. Pass the native's next birthday to get a birthday-to-birthday book instead of a rolling one. |
| timezone_as_float | number (double) | optional | UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset. min -12 · max 14 |
| year | integer | optional | Year of birth as a number, e.g. 1990. Four digits. min 1800 · max 2200 |
Example request
curl -X POST https://api.occultapi.com/api/astro/pdf/yearbook/ \
-H "X-API-Key: $OCCULT_API_KEY" \
-H "Content-Type: application/json" \
-d '{"name":"Ajeet Kanojia","gender":"male","date_time":"1985-02-23T05:45:00+05:30","latitude":20.8833,"longitude":76.2,"timezone_as_float":5.5,"place":"Malkapur, Maharashtra, India","start_date":"2026-01-01","branding":{"company_name":"Acme Astrology","company_info":"Vedic reports since 2011.","company_email":"hello@acme.example","domain_url":"https://acme.example","footer_link":"acme.example"}}'Response
Errors
Metering errors return { "error": "…", "message": "<code>", "is_error": true }. Show error to people and branch on message. See the error reference.