{"openapi":"3.1.0","info":{"title":"GalacticMist chart API","version":"1.0.0","description":"Research-grade astrology computation. Accuracy is measured, not claimed: see the accuracy report linked from galacticmist-docs.pages.dev. No accounts; birth data is never stored server-side (share links carry recompute recipes)."},"servers":[{"url":"https://galacticmist-api.troutberger.workers.dev"}],"paths":{"/v1/chart":{"post":{"summary":"Natal chart + aspect graph","description":"Request body: {time, place, zodiac?, houses?, bodies?}. Every computed value carries variant/convention ids; unsupported quantities are typed, never zero-filled.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"Computed result with settings digests and provenance"},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"messages":{"type":"array","items":{"type":"string"}},"detail":{}},"required":["error"]}}}},"422":{"description":"Typed domain failure (e.g. polar Placidus, zodiac mismatch)","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"messages":{"type":"array","items":{"type":"string"}},"detail":{}},"required":["error"]}}}},"429":{"description":"Rate limited (60 POST/min/IP per edge isolate)","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"messages":{"type":"array","items":{"type":"string"}},"detail":{}},"required":["error"]}}}}}}},"/v1/progressions/secondary":{"post":{"summary":"Secondary progressed chart","description":"Request body: {natal, target}. Every computed value carries variant/convention ids; unsupported quantities are typed, never zero-filled.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"Computed result with settings digests and provenance"},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"messages":{"type":"array","items":{"type":"string"}},"detail":{}},"required":["error"]}}}},"422":{"description":"Typed domain failure (e.g. polar Placidus, zodiac mismatch)","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"messages":{"type":"array","items":{"type":"string"}},"detail":{}},"required":["error"]}}}},"429":{"description":"Rate limited (60 POST/min/IP per edge isolate)","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"messages":{"type":"array","items":{"type":"string"}},"detail":{}},"required":["error"]}}}}}}},"/v1/progressions/solar-arc":{"post":{"summary":"Solar arc directed chart","description":"Request body: {natal, target}. Every computed value carries variant/convention ids; unsupported quantities are typed, never zero-filled.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"Computed result with settings digests and provenance"},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"messages":{"type":"array","items":{"type":"string"}},"detail":{}},"required":["error"]}}}},"422":{"description":"Typed domain failure (e.g. polar Placidus, zodiac mismatch)","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"messages":{"type":"array","items":{"type":"string"}},"detail":{}},"required":["error"]}}}},"429":{"description":"Rate limited (60 POST/min/IP per edge isolate)","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"messages":{"type":"array","items":{"type":"string"}},"detail":{}},"required":["error"]}}}}}}},"/v1/returns/solar":{"post":{"summary":"Nth solar return instant + chart","description":"Request body: {natal, nthYear, relocation?}. Every computed value carries variant/convention ids; unsupported quantities are typed, never zero-filled.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"Computed result with settings digests and provenance"},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"messages":{"type":"array","items":{"type":"string"}},"detail":{}},"required":["error"]}}}},"422":{"description":"Typed domain failure (e.g. polar Placidus, zodiac mismatch)","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"messages":{"type":"array","items":{"type":"string"}},"detail":{}},"required":["error"]}}}},"429":{"description":"Rate limited (60 POST/min/IP per edge isolate)","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"messages":{"type":"array","items":{"type":"string"}},"detail":{}},"required":["error"]}}}}}}},"/v1/time-lords/profections":{"post":{"summary":"Annual profections timeline","description":"Request body: {natal, years}. Every computed value carries variant/convention ids; unsupported quantities are typed, never zero-filled.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"Computed result with settings digests and provenance"},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"messages":{"type":"array","items":{"type":"string"}},"detail":{}},"required":["error"]}}}},"422":{"description":"Typed domain failure (e.g. polar Placidus, zodiac mismatch)","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"messages":{"type":"array","items":{"type":"string"}},"detail":{}},"required":["error"]}}}},"429":{"description":"Rate limited (60 POST/min/IP per edge isolate)","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"messages":{"type":"array","items":{"type":"string"}},"detail":{}},"required":["error"]}}}}}}},"/v1/time-lords/vimshottari":{"post":{"summary":"Vimshottari dasha timeline","description":"Request body: {time, ayanamshaId?, levels?}. Every computed value carries variant/convention ids; unsupported quantities are typed, never zero-filled.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"Computed result with settings digests and provenance"},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"messages":{"type":"array","items":{"type":"string"}},"detail":{}},"required":["error"]}}}},"422":{"description":"Typed domain failure (e.g. polar Placidus, zodiac mismatch)","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"messages":{"type":"array","items":{"type":"string"}},"detail":{}},"required":["error"]}}}},"429":{"description":"Rate limited (60 POST/min/IP per edge isolate)","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"messages":{"type":"array","items":{"type":"string"}},"detail":{}},"required":["error"]}}}}}}},"/v1/time-lords/zr":{"post":{"summary":"Zodiacal releasing (L1+L2) + computed lot","description":"Request body: {natal, lot?, years?}. Every computed value carries variant/convention ids; unsupported quantities are typed, never zero-filled.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"Computed result with settings digests and provenance"},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"messages":{"type":"array","items":{"type":"string"}},"detail":{}},"required":["error"]}}}},"422":{"description":"Typed domain failure (e.g. polar Placidus, zodiac mismatch)","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"messages":{"type":"array","items":{"type":"string"}},"detail":{}},"required":["error"]}}}},"429":{"description":"Rate limited (60 POST/min/IP per edge isolate)","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"messages":{"type":"array","items":{"type":"string"}},"detail":{}},"required":["error"]}}}}}}},"/v1/time-lords/firdaria":{"post":{"summary":"Firdaria timeline (sect auto-detected)","description":"Request body: {natal, nodeVariant?}. Every computed value carries variant/convention ids; unsupported quantities are typed, never zero-filled.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"Computed result with settings digests and provenance"},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"messages":{"type":"array","items":{"type":"string"}},"detail":{}},"required":["error"]}}}},"422":{"description":"Typed domain failure (e.g. polar Placidus, zodiac mismatch)","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"messages":{"type":"array","items":{"type":"string"}},"detail":{}},"required":["error"]}}}},"429":{"description":"Rate limited (60 POST/min/IP per edge isolate)","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"messages":{"type":"array","items":{"type":"string"}},"detail":{}},"required":["error"]}}}}}}},"/v1/mundane/cyclic-index":{"post":{"summary":"Barbault cyclic index (point or series)","description":"Request body: {time} | {fromYear, toYear, sampling}. Every computed value carries variant/convention ids; unsupported quantities are typed, never zero-filled.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"Computed result with settings digests and provenance"},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"messages":{"type":"array","items":{"type":"string"}},"detail":{}},"required":["error"]}}}},"422":{"description":"Typed domain failure (e.g. polar Placidus, zodiac mismatch)","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"messages":{"type":"array","items":{"type":"string"}},"detail":{}},"required":["error"]}}}},"429":{"description":"Rate limited (60 POST/min/IP per edge isolate)","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"messages":{"type":"array","items":{"type":"string"}},"detail":{}},"required":["error"]}}}}}}},"/v1/relational/synastry":{"post":{"summary":"Synastry: charts + inter-aspects + overlays","description":"Request body: {a, b}. Every computed value carries variant/convention ids; unsupported quantities are typed, never zero-filled.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"Computed result with settings digests and provenance"},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"messages":{"type":"array","items":{"type":"string"}},"detail":{}},"required":["error"]}}}},"422":{"description":"Typed domain failure (e.g. polar Placidus, zodiac mismatch)","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"messages":{"type":"array","items":{"type":"string"}},"detail":{}},"required":["error"]}}}},"429":{"description":"Rate limited (60 POST/min/IP per edge isolate)","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"messages":{"type":"array","items":{"type":"string"}},"detail":{}},"required":["error"]}}}}}}},"/v1/relational/composite":{"post":{"summary":"Composite (midpoint) chart","description":"Request body: {a, b, houseSystem?}. Every computed value carries variant/convention ids; unsupported quantities are typed, never zero-filled.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"Computed result with settings digests and provenance"},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"messages":{"type":"array","items":{"type":"string"}},"detail":{}},"required":["error"]}}}},"422":{"description":"Typed domain failure (e.g. polar Placidus, zodiac mismatch)","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"messages":{"type":"array","items":{"type":"string"}},"detail":{}},"required":["error"]}}}},"429":{"description":"Rate limited (60 POST/min/IP per edge isolate)","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"messages":{"type":"array","items":{"type":"string"}},"detail":{}},"required":["error"]}}}}}}},"/v1/relational/davison":{"post":{"summary":"Davison spacetime-midpoint chart","description":"Request body: {a, b}. Every computed value carries variant/convention ids; unsupported quantities are typed, never zero-filled.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"Computed result with settings digests and provenance"},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"messages":{"type":"array","items":{"type":"string"}},"detail":{}},"required":["error"]}}}},"422":{"description":"Typed domain failure (e.g. polar Placidus, zodiac mismatch)","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"messages":{"type":"array","items":{"type":"string"}},"detail":{}},"required":["error"]}}}},"429":{"description":"Rate limited (60 POST/min/IP per edge isolate)","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"messages":{"type":"array","items":{"type":"string"}},"detail":{}},"required":["error"]}}}}}}},"/v1/search/transits":{"post":{"summary":"Transit contacts (enter/exact/leave)","description":"Request body: {natal, from, to, bodies?}. Every computed value carries variant/convention ids; unsupported quantities are typed, never zero-filled.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"Computed result with settings digests and provenance"},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"messages":{"type":"array","items":{"type":"string"}},"detail":{}},"required":["error"]}}}},"422":{"description":"Typed domain failure (e.g. polar Placidus, zodiac mismatch)","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"messages":{"type":"array","items":{"type":"string"}},"detail":{}},"required":["error"]}}}},"429":{"description":"Rate limited (60 POST/min/IP per edge isolate)","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"messages":{"type":"array","items":{"type":"string"}},"detail":{}},"required":["error"]}}}}}}},"/v1/electional/search":{"post":{"summary":"Electional constraint search","description":"Request body: {from, to, constraints}. Every computed value carries variant/convention ids; unsupported quantities are typed, never zero-filled.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"Computed result with settings digests and provenance"},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"messages":{"type":"array","items":{"type":"string"}},"detail":{}},"required":["error"]}}}},"422":{"description":"Typed domain failure (e.g. polar Placidus, zodiac mismatch)","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"messages":{"type":"array","items":{"type":"string"}},"detail":{}},"required":["error"]}}}},"429":{"description":"Rate limited (60 POST/min/IP per edge isolate)","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"messages":{"type":"array","items":{"type":"string"}},"detail":{}},"required":["error"]}}}}}}},"/v1/vedic/vargas":{"post":{"summary":"Divisional charts + bhava chalita","description":"Request body: {natal, schemes?}. Every computed value carries variant/convention ids; unsupported quantities are typed, never zero-filled.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"Computed result with settings digests and provenance"},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"messages":{"type":"array","items":{"type":"string"}},"detail":{}},"required":["error"]}}}},"422":{"description":"Typed domain failure (e.g. polar Placidus, zodiac mismatch)","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"messages":{"type":"array","items":{"type":"string"}},"detail":{}},"required":["error"]}}}},"429":{"description":"Rate limited (60 POST/min/IP per edge isolate)","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"messages":{"type":"array","items":{"type":"string"}},"detail":{}},"required":["error"]}}}}}}},"/v1/vedic/panchanga":{"post":{"summary":"Panchanga elements","description":"Request body: {time, ayanamshaId?, utcOffsetMinutes?}. Every computed value carries variant/convention ids; unsupported quantities are typed, never zero-filled.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"Computed result with settings digests and provenance"},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"messages":{"type":"array","items":{"type":"string"}},"detail":{}},"required":["error"]}}}},"422":{"description":"Typed domain failure (e.g. polar Placidus, zodiac mismatch)","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"messages":{"type":"array","items":{"type":"string"}},"detail":{}},"required":["error"]}}}},"429":{"description":"Rate limited (60 POST/min/IP per edge isolate)","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"messages":{"type":"array","items":{"type":"string"}},"detail":{}},"required":["error"]}}}}}}},"/v1/directions/zodiacal":{"post":{"summary":"Primary directions (zodiacal, Placidian semi-arc)","description":"Request body: {natal, maxYears?}. Every computed value carries variant/convention ids; unsupported quantities are typed, never zero-filled.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"Computed result with settings digests and provenance"},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"messages":{"type":"array","items":{"type":"string"}},"detail":{}},"required":["error"]}}}},"422":{"description":"Typed domain failure (e.g. polar Placidus, zodiac mismatch)","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"messages":{"type":"array","items":{"type":"string"}},"detail":{}},"required":["error"]}}}},"429":{"description":"Rate limited (60 POST/min/IP per edge isolate)","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"messages":{"type":"array","items":{"type":"string"}},"detail":{}},"required":["error"]}}}}}}},"/v1/meta":{"get":{"summary":"Provider descriptor + conventions","responses":{"200":{"description":"Descriptor"}}}},"/v1/openapi.json":{"get":{"summary":"This document","responses":{"200":{"description":"OpenAPI 3.1"}}}}}}