---
title: "Generate Report: Unified Dispatcher (V2)"
method: POST
path: "/reports/generate"
tags: ["Reports"]
---

# Generate Report: Unified Dispatcher (V2)

`POST /reports/generate`

Single endpoint over the 12 type-specific renderers: pass report_type ("natal" | "transit-yearly" | "synastry" | "business" | "career" | "love" | "money" | "child" | "lal-kitab" | "human-design" | "tarot" | "vedic-kundli") plus the renderer-specific inputs. SDK ergonomics: one method instead of 12. Required fields vary by type: chart for most, chart1+chart2 for synastry, seed for tarot (chart optional).

## Request body

- GenerateReport
  - `report_type` 'natal' | 'transit-yearly' | 'synastry' | 'business' | 'career' | 'love' | 'money' | 'child' | 'lal-kitab' | 'human-design' | 'tarot' | 'vedic-kundli', required
  - `chart` object — Birth data for a single natal chart. Required: date (YYYY-MM-DD), time (HH:mm:ss), latitude and longitude in decimal degrees. The short forms lat, lon, lng and tz are rejected with 400 INVALID_FIELD; pass the full names. timezoneOffset is hours from UTC and defaults to 0, meaning UTC. city is a display label only: nothing here geocodes it, so it never stands in for coordinates.
    - `date` string, required
    - `time` string, required
    - `timezoneOffset` number, nullable — Hours from UTC at the given moment, not minutes. Fractional zones are hours too: 5.5 for India, 5.75 for Nepal, -3.5 for Newfoundland. Defaults to 0, meaning UTC.
    - `latitude` number, required — Birth latitude. Required here: the whole document is computed from it.
    - `longitude` number, required — Birth longitude. Required here: the whole document is computed from it.
    - `houseSystem` string
    - `name` string
    - `city` string
    - `zodiacType` 'tropical' | 'sidereal'
    - `ayanamsaId` number, nullable
    - `ayanamsa` 'fagan-bradley' | 'lahiri' | 'de-luce' | 'raman' | 'krishnamurti' | 'kp' | 'yukteshwar' | 'jn-bhasin' | 'true-citra' | 'djwhal-khul' — Sidereal school by name. Lahiri when omitted. Equivalent to ayanamsaId; send either.
    - `cosmogram` boolean
  - `chart1` object — Birth data for a single natal chart. Required: date (YYYY-MM-DD), time (HH:mm:ss), latitude and longitude in decimal degrees. The short forms lat, lon, lng and tz are rejected with 400 INVALID_FIELD; pass the full names. timezoneOffset is hours from UTC and defaults to 0, meaning UTC. city is a display label only: nothing here geocodes it, so it never stands in for coordinates.
    - `date` string, required
    - `time` string, required
    - `timezoneOffset` number, nullable — Hours from UTC at the given moment, not minutes. Fractional zones are hours too: 5.5 for India, 5.75 for Nepal, -3.5 for Newfoundland. Defaults to 0, meaning UTC.
    - `latitude` number, required — Birth latitude. Required here: the whole document is computed from it.
    - `longitude` number, required — Birth longitude. Required here: the whole document is computed from it.
    - `houseSystem` string
    - `name` string
    - `city` string
    - `zodiacType` 'tropical' | 'sidereal'
    - `ayanamsaId` number, nullable
    - `ayanamsa` 'fagan-bradley' | 'lahiri' | 'de-luce' | 'raman' | 'krishnamurti' | 'kp' | 'yukteshwar' | 'jn-bhasin' | 'true-citra' | 'djwhal-khul' — Sidereal school by name. Lahiri when omitted. Equivalent to ayanamsaId; send either.
    - `cosmogram` boolean
  - `chart2` object — Birth data for a single natal chart. Required: date (YYYY-MM-DD), time (HH:mm:ss), latitude and longitude in decimal degrees. The short forms lat, lon, lng and tz are rejected with 400 INVALID_FIELD; pass the full names. timezoneOffset is hours from UTC and defaults to 0, meaning UTC. city is a display label only: nothing here geocodes it, so it never stands in for coordinates.
    - `date` string, required
    - `time` string, required
    - `timezoneOffset` number, nullable — Hours from UTC at the given moment, not minutes. Fractional zones are hours too: 5.5 for India, 5.75 for Nepal, -3.5 for Newfoundland. Defaults to 0, meaning UTC.
    - `latitude` number, required — Birth latitude. Required here: the whole document is computed from it.
    - `longitude` number, required — Birth longitude. Required here: the whole document is computed from it.
    - `houseSystem` string
    - `name` string
    - `city` string
    - `zodiacType` 'tropical' | 'sidereal'
    - `ayanamsaId` number, nullable
    - `ayanamsa` 'fagan-bradley' | 'lahiri' | 'de-luce' | 'raman' | 'krishnamurti' | 'kp' | 'yukteshwar' | 'jn-bhasin' | 'true-citra' | 'djwhal-khul' — Sidereal school by name. Lahiri when omitted. Equivalent to ayanamsaId; send either.
    - `cosmogram` boolean
  - `year` integer
  - `spread` string
  - `seed` integer, nullable
  - `name` string
  - `allowReversed` boolean
  - `language` 'uk' | 'en' | 'de' | 'ru' | 'pl' | 'es' | 'pt' | 'hi' | 'fr' | 'ko' | 'it' | 'ja' | 'id' | 'tr' | 'nl' | 'ro' | 'cs' | 'vi' | 'ar' | 'el' | 'hu'
  - `whitelabel` union
    - boolean
    - object
      - `companyName` string
      - `companyUrl` string, uri
      - `companyEmail` string, email
      - `companyMobile` string
      - `companyBio` string
      - `logoUrl` string, uri
      - `frontImage` string, uri
      - `textPrimaryColor` string
      - `textSecondaryColor` string
      - `backgroundColor` string
      - `themeColor` string — Accent colour, used for section heading text and inline emphasis.
      - `headingColor` string — Colour of the divider rule under each section heading (not the heading text, which is themeColor).
      - `footerText` string
      - `fontPairing` 'serif-sans' | 'sans-serif' | 'serif-only' | 'sans-only' | 'system'
      - `reportName` string

## Response `200`

Successful calculation

- object
  - `ok` boolean
  - `data` object
    - `url` string, nullable
    - `storage_key` string, nullable
    - `byte_length` number, nullable
    - `page_count` number, nullable
    - `duration_ms` number, nullable
    - `expires_at` string, nullable

## Other responses

- `400` — Validation error
- `401` — Missing or invalid API key

## Changes

- **2026-08-18** `dd3764875e7a` — 3 info
  - added the new optional request property `chart/allOf[#/components/schemas/ChartInput]/ayanamsa`
  - added the new optional request property `chart1/allOf[#/components/schemas/ChartInput]/ayanamsa`
  - added the new optional request property `chart2/allOf[#/components/schemas/ChartInput]/ayanamsa`
- **2026-08-15** `e637d1a9911b` — 6 warning
  - the `chart/allOf[#/components/schemas/ChartInput]/timezoneOffset` request property's max was set to `14.00`
  - the `chart1/allOf[#/components/schemas/ChartInput]/timezoneOffset` request property's max was set to `14.00`
  - the `chart2/allOf[#/components/schemas/ChartInput]/timezoneOffset` request property's max was set to `14.00`
  - the `chart/allOf[#/components/schemas/ChartInput]/timezoneOffset` request property's min was set to `-14.00`
  - …2 more
- **2026-08-14** `994755209cea` — 6 breaking, 33 warning
  - added `#/components/schemas/ChartInput, subschema #2` to the `chart` request property `allOf` list
  - added `#/components/schemas/ChartInput, subschema #2` to the `chart1` request property `allOf` list
  - added `#/components/schemas/ChartInput, subschema #2` to the `chart2` request property `allOf` list
  - the `chart` request property type/format changed from `object`/`` to ``/``
  - …35 more
- …earlier changes not shown

[Full history](https://skmtc.dev/astroway/apis/astroway-calculation-api/changes/reports/generate/post.md)

---

[API](https://skmtc.dev/astroway/apis/astroway-calculation-api.md) · [All operations](https://skmtc.dev/astroway/apis/astroway-calculation-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/astroway/astroway-calculation-api/revisions/8ab5a768b521/schema)
